从 Google plus 帐户注销在 android 中不起作用,显示空指针异常

2024-01-24

我在我的 Android 应用程序中使用 Google plus 登录,工作正常。

从任何其他意图单击注销按钮时显示空指针异常。

也当点击登录按钮时直接进入我的下一页。不在登录页面。

但从演示应用程序注销它工作正常。

我搜索了相关答案,没有发现任何解决方案仍然保持不变。

帮我解决它

link 1 http://examples.javacodegeeks.com/android/android-google-plus-login-example/

link 2 http://www.androidhive.info/2014/02/android-login-with-google-plus-account-1/

我已经引用了 2 个链接,但从下一个意图注销时仍然显示空指针异常。

我的注销代码:

public void googlePlusLogout() 
    {
        if (mGoogleApiClient.isConnected()) 
        {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            mGoogleApiClient.disconnect();
            mGoogleApiClient.connect();
            updateProfile(false);
        }

    }

这里从另一个意图调用方法来登录类

otherintent.java

                  session.logoutUser();// here i am clearing the shared pref
                  sign_in Signinclass = new sign_in();
                  Signinclass.googlePlusLogout();
                  finish(); 

这是我的演示代码,它工作正常,我在应用程序登录中使用的相同代码工作正常,但从另一个页面调用注销不起作用。显示空指针异常。

AndroidGooglePlus示例 .java

public class AndroidGooglePlusExample extends Activity implements OnClickListener, ConnectionCallbacks, OnConnectionFailedListener {

    private static final int RC_SIGN_IN = 0;

    // Google client to communicate with Google
    private GoogleApiClient mGoogleApiClient;

    private boolean mIntentInProgress;
    private boolean signedInUser;
    private ConnectionResult mConnectionResult;
    private SignInButton signinButton;
    private ImageView image;
    private TextView username, emailLabel;
    private LinearLayout profileFrame, signinFrame;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        signinButton = (SignInButton) findViewById(R.id.signin);
        signinButton.setOnClickListener(this);

        image = (ImageView) findViewById(R.id.image);
        username = (TextView) findViewById(R.id.username);
        emailLabel = (TextView) findViewById(R.id.email);

        profileFrame = (LinearLayout) findViewById(R.id.profileFrame);
        signinFrame = (LinearLayout) findViewById(R.id.signinFrame);

        mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(Plus.API, Plus.PlusOptions.builder().build()).addScope(Plus.SCOPE_PLUS_LOGIN).build();
    }

    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    private void resolveSignInError() {
        if (mConnectionResult.hasResolution()) {
            try {
                mIntentInProgress = true;
                mConnectionResult.startResolutionForResult(this, RC_SIGN_IN);
            } catch (SendIntentException e) {
                mIntentInProgress = false;
                mGoogleApiClient.connect();
            }
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        if (!result.hasResolution()) {
            GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
            return;
        }

        if (!mIntentInProgress) {
            // store mConnectionResult
            mConnectionResult = result;

            if (signedInUser) {
                resolveSignInError();
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
        switch (requestCode) {
        case RC_SIGN_IN:
            if (responseCode == RESULT_OK) {
                signedInUser = false;

            }
            mIntentInProgress = false;
            if (!mGoogleApiClient.isConnecting()) {
                mGoogleApiClient.connect();
            }
            break;
        }
    }

    @Override
    public void onConnected(Bundle arg0) {
        signedInUser = false;
        Toast.makeText(this, "Connected", Toast.LENGTH_LONG).show();
        getProfileInformation();
    }

    private void updateProfile(boolean isSignedIn) {
        if (isSignedIn) {
            signinFrame.setVisibility(View.GONE);
            profileFrame.setVisibility(View.VISIBLE);

        } else {
            signinFrame.setVisibility(View.VISIBLE);
            profileFrame.setVisibility(View.GONE);
        }
    }

    private void getProfileInformation() {
        try {
            if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
                Person currentPerson = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);
                String personName = currentPerson.getDisplayName();
                String personPhotoUrl = currentPerson.getImage().getUrl();
                String email = Plus.AccountApi.getAccountName(mGoogleApiClient);

                username.setText(personName);
                emailLabel.setText(email);

                new LoadProfileImage(image).execute(personPhotoUrl);

                // update profile frame with new info about Google Account
                // profile
                updateProfile(true);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onConnectionSuspended(int cause) {
        mGoogleApiClient.connect();
        updateProfile(false);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.signin:
            googlePlusLogin();
            break;
        }
    }

    public void signIn(View v) {
        googlePlusLogin();
    }

    public void logout(View v) {
        googlePlusLogout();
    }

    private void googlePlusLogin() {
        if (!mGoogleApiClient.isConnecting()) {
            signedInUser = true;
            resolveSignInError();
        }
    }

    private void googlePlusLogout() {
        if (mGoogleApiClient.isConnected()) {
            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            mGoogleApiClient.disconnect();
            mGoogleApiClient.connect();
            updateProfile(false);
        }
    }

    // download Google Account profile image, to complete profile
    private class LoadProfileImage extends AsyncTask<String, Void, Bitmap> {
        ImageView downloadedImage;

        public LoadProfileImage(ImageView image) {
            this.downloadedImage = image;
        }

        protected Bitmap doInBackground(String... urls) {
            String url = urls[0];
            Bitmap icon = null;
            try {
                InputStream in = new java.net.URL(url).openStream();
                icon = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return icon;
        }

        protected void onPostExecute(Bitmap result) {
            downloadedImage.setImageBitmap(result);
        }
    }

我找到了我的问题的解决方案

将此代码添加到您的注销活动页面中。它的工作完美

我的注销页面活动

 public class LogoutActivity extends Activity implements OnClickListener,
        ConnectionCallbacks, OnConnectionFailedListener,
        ResultCallback<People.LoadPeopleResult> {

       GoogleApiClient mGoogleApiClient;
       boolean mSignInClicked;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this).addApi(Plus.API)
                .addScope(Plus.SCOPE_PLUS_LOGIN).build();

         //copy this code on "Logout" Onclick
      logout.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 if (mGoogleApiClient.isConnected()) {
                Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
                mGoogleApiClient.disconnect();
                mGoogleApiClient.connect();
                // updateUI(false);
                System.err.println("LOG OUT ^^^^^^^^^^^^^^^^^^^^ SUCESS");
            } 

            }
        });

    }
    @Override
    public void onConnected(Bundle arg0) {
        // TODO Auto-generated method stub
        mSignInClicked = false;

        // updateUI(true);
        Plus.PeopleApi.loadVisible(mGoogleApiClient, null).setResultCallback(
                this);
    }

    @Override
    public void onConnectionSuspended(int arg0) {
        // TODO Auto-generated method stub
        mGoogleApiClient.connect();
        // updateUI(false);
    }

    @Override
    public void onConnectionFailed(ConnectionResult arg0) {
        // TODO Auto-generated method stub

    }

    protected void onStart() {
        super.onStart();
        mGoogleApiClient.connect();
    }

    protected void onStop() {
        super.onStop();
        if (mGoogleApiClient.isConnected()) {
            mGoogleApiClient.disconnect();
        }
    }

    @Override
    public void onResult(LoadPeopleResult arg0) {
        // TODO Auto-generated method stub

    }

链接供参考 https://stackoverflow.com/a/29299190/4447803

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Google plus 帐户注销在 android 中不起作用,显示空指针异常 的相关文章

  • Android上如何动态添加LinearLayout?

    我有一个长度为 n 的数组 现在需要创建 n 个 LinearLayout 并在每个上添加不同的内容 怎样才能动态地完成呢 LinearLayout lLayout new LinearLayout context parentWidget
  • 在最后一个 EditText 处按键盘上的“完成”后隐式“提交”

    我使用过一些应用程序 当我填写用户名 然后转到密码时 如果我在键盘上点击 完成 则会自动提交登录表单 而无需单击提交按钮 这是怎么做到的 尝试这个 在您的布局中放置 编辑以下内容
  • 使用 Android 数据绑定时,如何通过 xml 为自定义 setter 传递多个参数

    假设我有一个自定义 setter 方法 其中需要两个参数 BindingAdapter imageUrl placeholder public static void loadImage ImageView imageView String
  • android 中的自定义 MediaPlayer 类

    我刚刚完成了一个项目 我使用网络视图进行视频播放 现在我被要求用自定义播放器替换 webview 部分 玩家应该能够处理 HLS 如果我使用VideoView和MediaController 我可以播放直播 但不幸的是 MediaContr
  • 设备管理员禁用

    如果不是 则无法卸载设备管理应用程序 禁用 用户可以从设置中禁用 设备管理员 当公司向员工提供 Android 设备时 公司希望 可以控制设备及其状态和策略 但用户可以 轻松摆脱这种控制 有谁知道这怎么可能 防止用户禁用设备管理员 谢谢 无
  • 两个外部第三方混淆库中存在重复的类名

    我有一个项目 其中包含两个外部第三方库 当尝试构建项目时 这两个库的类文件名都被混淆了 并且 gradle barfs 了 Duplicate class a a a a a b found in modules 我无法排除任何类 因为它们
  • 适用于 Web 和移动设备的 ASP.NET Web API 社交身份验证

    我的问题有点复杂 所以请耐心等待我 因为我试图很好地阐明我正在努力解决的问题 Goal 拥有一个 ASP NET 网站 允许用户通过用户名 密码或也具有 API 的社交网站 Facebook Twitter Google 等 注册和登录 该
  • 如何在Android Studio中授予对registry.bin的访问权限?

    每当我打开 Android Studio 3 0 1 时 Gradle 构建都会失败 错误如下所示 它以前工作正常 我不记得对其设置进行过任何更改 不过 现在已经不会再继续下去了 请帮忙 我被困住了 关闭 Android Studio 并尝
  • 我在 Android studio 中遇到错误

    在此输入图像描述 https i stack imgur com bvqID png我是安卓新手 我刚刚在 android studio 中创建了一个项目 并且在它的中遇到了问题manifest xml 错误是在 android icon
  • 将现有数据库放置在我的项目中的何处

    我想在基于 Android Android Studio 的项目中使用现有的 sqlite 数据库 我在 Google 上进行了搜索 有人建议将其放在 资产 文件夹中 但是在项目结构中没有这样的文件夹 项目中的文件夹结构如下 res 可绘制
  • 在 Facebook 上分享时如何更改 Play 商店应用程序的预览?

    我已在 Google Play 开发者控制台中更改了游戏的图标和屏幕截图 并且它在 Play 商店中正确显示 但当我尝试在 Facebook 上分享 Play 商店链接时 预览会带有旧图标和屏幕截图 如何将此预览更新到应用程序的最新版本 你
  • 我在 Android Studio 中使用哪个版本的 JDK 有关系吗?

    I know I can choose the SDK location in Android Studio s Project Structure 我有两个问题 当我们已经使用Android SDK时 为什么还需要JDK 毕竟我们不是为
  • 如何实现 Android 浮动 SearchWidget

    I am trying to implement the search widget in the current android apps but just can t get it done and I ve not been able
  • Android:RecyclerView 项目上下文菜单问题

    我正在尝试实现一个 RecyclerView 单击每个项目时 都会弹出一个上下文菜单 我已引用此的答案 评论question https stackoverflow com questions 26466877 how to create
  • JSch:如何使用 ssh 密钥 ssh 到服务器

    我想从另一个 ssh 服务器后面 ssh 进入服务器 网关服务器需要用户名 密码 我可以做到这一点 我正在使用隧道进入下一台服务器 但这需要only一个 ssh 密钥 我已经通过 PuTTY 生成了密钥 因此它存在于我的用户名中 但我不确定
  • onKeyDown 和 onKeyLongPress

    我希望我的应用程序对音量按钮的正常按键事件和长按按键事件做出不同的反应 我已经看过了this https stackoverflow com questions 7493531 trying to catch the volume onke
  • 将 wgs 84 转换为纬度/经度

    你好 我在弄清楚如何在坐标类型之间进行转换时遇到了一些麻烦 我有一个坐标集列表 其描述如下 坐标始终采用 WGS84 系统 所有坐标 a 均表示为整数 值 x 和 y 其中坐标值乘以 1 000 000 一个例子 559262 631951
  • 如何在Android中编辑文本时限制文本的数字仅在0-59之间?

    我有一个Edit Text其中数字只能介于0 59 不会再输入其他数字Edit Text 我试过text watcher但没有获得成功 任何想法 12 26 14 59 39 715 E AndroidRuntime 19494 FATAL
  • 不同的 IntentServices 可以并行运行吗?

    我有点难以理解有关 IntentServices 的一条规则 From 创建后台服务 https developer android com training run background service create service ht
  • 加载远程图像

    在 Android 中 最简单的方法是什么 从远程服务器加载图像 将其显示在 ImageView 中 这是我在应用程序中实际使用的方法 我知道它有效 try URL thumb u new URL http www example com

随机推荐

  • 如何从 wsdl 生成 Web 服务

    客户端向我提供了 wsdl 来生成 Web 服务 但是当我使用 wsdl exe 命令时 它生成了 cs 类 我在 Web 服务中使用了该类 当我向客户端提供 wsdl 时 它与他们的架构不匹配 实际上 我希望从 wsdl 自动生成 asm
  • 在 MySQL 中将 dd/mm/yyyy 字符串转换为 Unix 时间戳

    在我的表中 我有一个名为的 varchar 列date包含 dd mm yyyy 格式的日期字符串表示形式 如何在 SELECT 查询中将它们转换为 Unix 时间 select unix timestamp str to date 30
  • NSURLRequest 到 NSString

    如何将 NSURLRequest 转换为 NSString NSString urlRequestToString NSURLRequest urlRequest NSString requestPath urlRequest URL ab
  • 使用 CloudKit 共享私有数据

    有没有一种简单的方法可以使用 CloudKit 在两个或多个用户之间共享私有数据 公共和私人日期是显而易见的 但似乎没有一种方法可以允许一组用户组织自己的孤岛以在彼此之间共享数据 而不将其提供给系统的所有其他用户和应用程序开发人员 我想到了
  • DAX 测试整数

    我有一个实际值列 如下所示 ID Airport A 98 4 B 98 0 C 95 3 我正在尝试将上面的数字格式化为前端报告的百分比 我将其写在 switch 语句中 为了方便起见 我将逻辑编写为 IF 布尔值 example mea
  • Yii2:从 URL 中删除控制器

    我正在使用高级模板 我在 SiteController 上创建了所有操作 因此我所有的 url 都是domain com site something 并且我需要从 url 中删除 site 一词 这样它将是domain com somet
  • 在 XAML 中显示窗口内的页面

    我的窗口中有一个选项卡控件 在每个选项卡项内我想要有一个不同的页面 我可以通过在 TabItem 内创建一个 Frame 并在后面的代码中使用来实现此目的 例如 frame1 Content new Pages MyPage 我怎样才能在
  • 为什么 Facebook 调试器工具无法抓取我的网站?

    我有一个网站http predictstat com http predictstat com 它由 Django 提供支持 我想确保当用户将此网站的链接发布到 Facebook 时 那里会显示一个漂亮的预览图像 标题和描述 也可以使用不同
  • BitBucket 和合并冲突

    我有一个代码源 有 3 个分支 master Branch 1 Branch 2 我正在尝试Branch 2当另一个程序员正在工作时Branch 1 在本地提取任何更改后 我最近将更改推送到了我的分支 然后我将我的分支与主分支合并 我现在正
  • 如何创建一个自动让用户登录到 devise/rails 的链接?

    我正在尝试让注册用户在我的网站上执行某些操作 因此我想通过电子邮件向他们发送直接指向此操作的链接 问题是我希望他们在单击此链接时自动登录 我可以做一些显而易见的事情 例如创建一个唯一的令牌并通过 url 传递它mysite com my f
  • 使用不同的最终分隔符连接字符串数组

    一般来说 如何连接字符串数组以使最后一个分隔符与其他分隔符不同 具体来说 iOS消息应用程序如何构建群组对话的默认名称 即联系人姓名列表 Example class User var name String init name String
  • C++ boost asio Windows 文件句柄 a​​sync_read_until 无限循环 - 无 eof

    我在 VS2010 中使用 boost 1 50 使用 aWindows 文件句柄 与使用套接字的 asio 相比 这似乎相对不常见 Problem The handle read回调到达第 8 行并返回第一位 并附加第 1 行的所有内容
  • Laravel - Artisan 给出了错误的基本 url

    我的 app config app php 有 url gt http dev domain com something somethingElse 然后我有一个可以从应用程序和 artisan 命令调用的函数 但URL route myR
  • Laravel 5 列出 htmlentities() 期望参数 1 为字符串

    我有以下内容 App Models Finance FinanceAccount lists name id 在我的一个观点的顶部 但它一直给我错误 htmlentities expects parameter 1 to be string
  • 关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题

    我已经研究了 3 周如何使用 PHPMailer for GoDaddy 配置 SMTP 但没有任何效果 尝试联系 GoDaddy 支持 但他们尚未回复 我还没有看到任何关于如何在他们的服务器上设置 SMTP 的文档 我已经多次更改主机并进
  • Google 地图地理编码器从 MySQL 数据库查找附近的地点

    我有一个网站 我将位置存储在 MySQL 数据库中 并使用数据库提供的地址进行地理编码 现在我想添加一个功能 它将找到距离指定点最近的位置 例如他们现在站立或打字的位置 我正在使用 JavaScript 和 jQuery 编写地理编码器和谷
  • 更改 ruby​​ 变量/引用的值

    我只是偶然发现了一些我不太明白的事情 我知道 ruby 中的变量是引用 所以那些很棒的事情是可能的 但是当我将变量传递给方法时 它的行为很奇怪 my var a nothing happend to me my var b nothing
  • install_github是否递归安装依赖项?

    R 包devtools似乎是直接从 github 存储库安装 R 包的方法 使用install github 功能 这样做时 不仅会安装所寻址的 github 包 还会安装其直接的 CRAN 依赖项 即包的描述 命名空间文件中定义的依赖项和
  • 在 NLTK 中实现词袋朴素贝叶斯分类器

    我基本上有和这个人有同样的问题 https stackoverflow com questions 2162718 python nltk code snippet to train a classifier naive bayes usi
  • 从 Google plus 帐户注销在 android 中不起作用,显示空指针异常

    我在我的 Android 应用程序中使用 Google plus 登录 工作正常 从任何其他意图单击注销按钮时显示空指针异常 也当点击登录按钮时直接进入我的下一页 不在登录页面 但从演示应用程序注销它工作正常 我搜索了相关答案 没有发现任何