Android的实施对mConnectionResult.hasResolution谷歌,加上登录错误() [英] Android implementing Google plus login error on mConnectionResult.hasResolution()

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

问题描述

我已经研究了谷歌加登录从 <一href="https://developers.google.com/+/mobile/android/getting-started">https://developers.google.com/+/mobile/android/getting-started

I have studied google plus login from https://developers.google.com/+/mobile/android/getting-started

当我启动我的应用程序有一个敬酒的消息用户连接! 然后我preSS 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)

下面是我的code

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+没有问任何许可。我不需要preSS登录按钮,但我可以通过我的账户发布。这是一个关于隐私权的错误?

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?

推荐答案

OK!这样烤面包,因为你已经签署了,当你点击你想再次登录:因为你没有一个错误的连接导致​​解决,你得到的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. 您的状态标志存储在谷歌Play业务。
  2. 连接之后,你的应用程序连接到谷歌Play业务和 尝试,看看你之前签署。
  3. 如果你有,它调用回onConnected。
  4. 如果您还没有,它调用回onConnectionFailed并给出 你ConnectionResult。
  5. 当使用点击登录,您纠正错误的 ConnectionResult - 这仅仅是一个未决的意图从而触发 帐户选择和同意画面。
  6. 当用户同意,您的应用程序被称为回 onActivityResult,并重新连接(与流量再次启动,这 时间在步骤3)结束。
  1. Your sign in state is stored in Google Play services.
  2. When you connect, your app connects to Google Play services and tries to see if you have signed in before.
  3. If you have, it calls back to onConnected.
  4. If you have not, it calls back to onConnectionFailed and gives you a ConnectionResult.
  5. When the use clicks sign in, you "resolve the error" on the ConnectionResult - this is just a pending Intent which triggers the account chooser and consent screen.
  6. When the user consents, your app gets called back in onActivityResult, and you reconnect (and the flow starts again, this time ending at step 3).

所以,如果你得到onConnected你应该隐藏登录按钮 - 用户已签!

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

现在,也许是出于某种原因,你希望用户必须点击该按钮即可开始。那也没关系。在onclick,你只需要测试是否mPlusClient isConnected。如果是,直接去你想要什么做后期的标志。如果没有,那么解决该连接的结果。

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谷歌,加上登录错误()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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