当前位置: 首页 > 知识库问答 >
问题:

Android在McConnectionResult上实现Google plus登录错误。哈斯决议()

祝锐
2023-03-14

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

当我启动我的应用程序时,会有一条祝酒词“用户已连接!”然后我按下G登录按钮,我的应用程序强制关闭。

这是消息表单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();
     }
  }
}

我刚刚发现,该应用程序将自动连接到谷歌,而无需任何许可。我不需要按登录按钮,但我可以通过我的帐户发布。这是关于隐私的错误吗?

共有1个答案

桓深
2023-03-14

好啊这是因为您已经登录,并且当您单击时,您正在尝试再次登录:因为您没有要解决错误的连接结果,所以您得到了NPE。

这就是它的工作原理:

  1. 您的登录状态存储在Google Play服务中。
  2. 当您连接时,您的应用程序将连接到Google Play服务,并尝试查看您是否以前登录过。
  3. 如果你有,它会回调到onConnect。
  4. 如果您没有,它会回调onConnectionFail并给您一个ConnectionResult。
  5. 当使用点击登录时,您将在ConnectionResult上解决错误-这只是一个挂起的意图,它会触发帐户选择器和同意屏幕。
  6. 当用户同意时,你的应用会在onActivityResult中被调回,然后你重新连接(流程再次开始,这次在步骤3结束)。

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

现在,无论出于什么原因,您都希望用户必须单击按钮才能开始。那也很好。在onClick中,您只需要测试mpluclient是否已连接。如果是的话,在登录后直接去你想做的任何事情。如果不是,则解决连接结果。

 类似资料:
  • 我有两个节点Cassandra(3.10)集群。我正在尝试将Mysql数据迁移到Cassandra。一切正常,但现在在传输 1.5 TB 数据后,我尝试登录集群 - 我收到以下错误: 迁移仍在进行,Nodetool状态正常: 我在system.log档案里找不到什么 任何解决这个问题的想法都是值得考虑的。

  • 以前它工作得很好,现在它不工作了 我使用了以下插件: 登录代码很简单,如说明所示: 离子型: ionic(ionic CLI):4.1.2离子框架:离子角3.9.2@ionic/app脚本:1.3.1 科尔多瓦: 科尔多瓦(科尔多瓦CLI): 8.1.2(cordova-lib@8.1.1)科尔多瓦平台:Android7.1.4科尔多瓦插件:科尔多瓦插件-离子键盘2.1.2,科尔多瓦插件-离子-w

  • 编辑:我发现了一个类似的问题,专门针对Facebook的登录。我正在使用电子邮件认证,但问题/解决方案可能是相同的。 userinfo={nsunderlyingerror=0x14704d4b0{Error domain=firauthinternalerrordomain code=3“(null)”userinfo={firautherroruserinfoderializedrespons

  • 我有问题与apache2error.log.500错误没有出现在那里(/var/log/apache2/error.log),我只是得到这些行每次我重新启动apache2服务: 我把error_reporting=E_ALL,display_errors=上,display_startup_errors=上,log_errors=上 /etc/php/7.4/apache2/php.ini和 /e

  • org.gradle.execution.multipleBuildFailures:生成完成,失败1次。 在org.gradle.initialization.defaultgradlelauncher$executeTasks.run(DefaultG radlelauncher.java:358)

  • 我已经创建了一个登录名。html页面和登录名。php脚本。在脚本中,它将首先获得我们输入的用户名和密码,然后使用数据库检查用户名或密码是否存在,如果用户有效,则它将检查他的部门id,并使用部门权限打开他们的页面,但问题是无论他们的部门是什么,都会一直打开管理页面。请帮我做这件事。 这是我的login.html代码 登录。php脚本