Android 在 mConnectionResult.hasResolution() 上实现 Google plus 登录错误 [英] Android implementing Google plus login error on mConnectionResult.hasResolution()

查看:26
本文介绍了Android 在 mConnectionResult.hasResolution() 上实现 Google plus 登录错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我研究了谷歌加登录https://developers.google.com/+/mobile/android/getting-started

当我启动我的应用程序时,有一条消息用户已连接!"然后我按 G+ 登录按钮我的应用程序强制关闭.

When I launch my app there is a toast message "User is connected!" and then I press G+ Sign in button my app force close.

这是logcat的消息形式

This is the message form logcat

04-08 18:31:21.680  24231-24231/app.umitems.test.testgoogleplus1.app D/﹕ onClick()
04-08 18:31:21.680  24231-24231/app.umitems.test.testgoogleplus1.app D/AndroidRuntime﹕ Shutting down VM
04-08 18:31:21.680  24231-24231/app.umitems.test.testgoogleplus1.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x41f99ce0)
04-08 18:31:21.685  24231-24231/app.umitems.test.testgoogleplus1.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: app.umitems.test.testgoogleplus1.app, PID: 24231
    java.lang.NullPointerException
        at app.umitems.test.testgoogleplus1.app.ExampleActivity.resolveSignInError(ExampleActivity.java:68)
        at app.umitems.test.testgoogleplus1.app.ExampleActivity.onClick(ExampleActivity.java:166)
        at com.google.android.gms.common.SignInButton.onClick(Unknown Source)
        at android.view.View.performClick(View.java:4445)
        at android.view.View$PerformClick.run(View.java:18446)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5081)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
        at dalvik.system.NativeStart.main(Native Method)

这是我的代码

package app.umitems.test.testgoogleplus1.app;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentSender;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient.ConnectionCallbacks;
import com.google.android.gms.common.GooglePlayServicesClient.OnConnectionFailedListener;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;

public class ExampleActivity extends Activity implements
                                          ConnectionCallbacks, 
                                          OnConnectionFailedListener,
                                          GoogleApiClient.ConnectionCallbacks,
                                          GoogleApiClient.OnConnectionFailedListener, 
                                          View.OnClickListener  {

  /* Request code used to invoke sign in user interactions. */
  private static final int RC_SIGN_IN = 0;

  /* Client used to interact with Google APIs. */
  private GoogleApiClient mGoogleApiClient;

  /* A flag indicating that a PendingIntent is in progress and prevents
   * us from starting further intents.
   */
  private boolean mIntentInProgress;

  /* Track whether the sign-in button has been clicked so that we know to resolve
   * all issues preventing sign-in without waiting.
   */
  private boolean mSignInClicked;

  /* Store the connection result from onConnectionFailed callbacks so that we can
   * resolve them when the user clicks sign-in.
   */
  private ConnectionResult mConnectionResult;
  View btn;

  public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_example);

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

        btn = findViewById(R.id.sign_in_button);
        btn.setOnClickListener(this);
  }

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

  /* A helper method to resolve the current ConnectionResult error. */
  public void resolveSignInError() {
     Log.d("","resolveSignInError()");
     if (mConnectionResult.hasResolution()) {
        Log.d("","resolveSignInError() mConnectionResult.hasResolution()");
        try {
           mIntentInProgress = true;
           /*startIntentSenderForResult(mConnectionResult.getIntentSender(),
                                      RC_SIGN_IN, null, 0, 0, 0);*/

           mConnectionResult.startResolutionForResult(this, // your activity
                                           RC_SIGN_IN);
        } catch (IntentSender.SendIntentException e) {
           // The intent was canceled before it was sent.  Return to the default
           // state and attempt to connect to get an updated ConnectionResult.
           Log.d("","resolveSignInError() mConnectionResult.hasResolution() catch");
           mIntentInProgress = false;
           mGoogleApiClient.connect();
        }
     }
  }

  protected void onStop() {
     super.onStop();

     if (mGoogleApiClient.isConnected()) {
        mGoogleApiClient.disconnect();
     }
  }

  @Override public void onConnected(Bundle bundle){
     // We've resolved any connection errors.  mGoogleApiClient can be used to
     // access Google APIs on behalf of the user.
     mSignInClicked = false;
     Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show();
  }

  @Override public void onConnectionSuspended(int i){
     mGoogleApiClient.connect();
  }

  @Override public void onDisconnected(){

  }

  @Override
  public void onConnectionFailed(ConnectionResult result) {
     if (!mIntentInProgress) {
        // Store the ConnectionResult so that we can use it later when the user clicks
        // 'sign-in'.
        mConnectionResult = result;

        if (mSignInClicked) {
           // The user has already clicked 'sign-in' so we attempt to resolve all
           // errors until the user is signed in, or they cancel.
           resolveSignInError();
        }
     }
  }
  /*@Override
  public void onConnectionFailed(ConnectionResult result){
     if (!mIntentInProgress && result.hasResolution()) {
        try {
           mIntentInProgress = true;*//*
           startIntentSenderForResult(result.getIntentSender(),
                                      RC_SIGN_IN, null, 0, 0, 0);*//*

           result.startResolutionForResult(this, // your activity
                                           RC_SIGN_IN);
        } catch (IntentSender.SendIntentException e) {
           // The intent was canceled before it was sent.  Return to the default
           // state and attempt to connect to get an updated ConnectionResult.
           mIntentInProgress = false;
           mGoogleApiClient.connect();
        }
     }
  }*/

  protected void onActivityResult(int requestCode, int responseCode, Intent intent) {
     if (requestCode == RC_SIGN_IN) {
        if (responseCode != RESULT_OK) {
           mSignInClicked = false;
        }

        mIntentInProgress = false;

        if (!mGoogleApiClient.isConnecting()) {
           mGoogleApiClient.connect();
        }
     }
  }

  @Override public void onClick(View view){

     Log.d("","onClick()");
     if (view.getId() == R.id.sign_in_button
         && !mGoogleApiClient.isConnecting()) {
        mSignInClicked = true;
        resolveSignInError();
     }
  }
}

我刚刚发现该应用程序会在未经许可的情况下自动连接到 Google+.我不需要按登录按钮,但我可以通过我的帐户发布.这是关于隐私的错误吗?

I just found that the app will automatically connected to Google+ without ask any permission. I don't need to press sign in button but I can post via my account. Is this a bug about privacy?

推荐答案

好的!所以那个吐司是因为您已经登录,当您单击时,您正在尝试再次登录:因为您没有要解决的错误的连接结果,您将获得 NPE.

OK! So that toast is because you have signed in, and when you click you are trying to sign in again: because you don't have a connection result with an error to resolve, you get the NPE.

这是它的工作原理:

  1. 您的登录状态存储在 Google Play 服务中.
  2. 连接时,您的应用会连接到 Google Play 服务并尝试查看您之前是否登录过.
  3. 如果有,它会回调 onConnected.
  4. 如果没有,它会回调 onConnectionFailed 并给出你是一个 ConnectionResult.
  5. 当用户点击登录时,您解决了错误"ConnectionResult - 这只是一个未决的 Intent,它触发了帐户选择器和同意屏幕.
  6. 当用户同意时,您的应用会被重新调用onActivityResult,然后您重新连接(并且流程再次开始,这时间在第 3 步结束).

因此,如果您进入连接状态,您应该隐藏登录按钮 - 用户已登录!

So, if you get onConnected you should hide the sign in button - the user has signed in!

现在,也许出于某种原因,您希望用户必须单击按钮才能开始.那也不错.在onClick中,只需要测试mPlusClient是否已连接即可.如果是,请在登录后直接执行您想做的任何操作.如果不是,则解决连接结果.

Now, perhaps for whatever reason you want the user to have to click the button to get started. That's fine too. In the onClick, you just need to test whether mPlusClient isConnected. If it is, go straight to whatever you wanted to do post sign in. If not, then resolve the connection result.

这篇关于Android 在 mConnectionResult.hasResolution() 上实现 Google plus 登录错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆