【问题标题】:Rare NullPointerException in GoogleApiClient using Firebase使用 Firebase 的 GoogleApiClient 中的罕见 NullPointerException
【发布时间】:2017-04-12 06:47:46
【问题描述】:

我正在使用 GoogleApiClient 使用他们的 Google 帐户登录用户。基本上,我使用 Firebase Auth 和 Google 登录。

但我每天都会在某些设备上遇到这种崩溃。当我在自己的一些设备(OnePlus 3、Nexus 5X、Moto G 等)上进行测试时,我从未见过这种崩溃。

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase(java.util.Locale)' on a null object reference
       at com.google.android.gms.internal.zzamy.zzd(Unknown Source)
       at com.google.android.gms.internal.zzamv.n(Unknown Source)
       at com.google.android.gms.internal.zzamv.zza(Unknown Source)
       at com.google.android.gms.internal.zzamv$2.run(Unknown Source)
       at java.lang.Thread.run(Thread.java:818)

这就是我为实例化 GoogleApiClient 所做的事情。在正常情况下我看不到崩溃,但在某些设备中我看到了这种情况。这是我在代码中所做的,

String mClientId = parcel.getProviderExtra().getString(CLIENT_ID_KEY);
GoogleSignInOptions googleSignInOptions;

googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(mClientId)
                .requestEmail()
                .build();

mGoogleApiClient = new GoogleApiClient.Builder(App.getContext())
                .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
                .build();

mGoogleApiClient.connect();

我在这里做错了什么?我最好的选择是App.getContext(),它提供了应用程序上下文来实例化客户端。会不会是这个问题?

我可以使用活动上下文,但使用它会导致内存泄漏。这里有什么问题,如何解决?

这给一些刚打开应用程序并尝试唱歌的用户带来了非常糟糕的体验。

【问题讨论】:

  • 你解决了吗?
  • 您是否尝试过使用getApplicationContext() 方法代替App.getContext()?如果您使用.requestIdToken(getString(R.string.default_web_client_id)),是否也会发生这种情况?
  • @AlexMamo 尝试getApplicationContext 没有运气
  • @GiruBhai,您的堆栈跟踪是否完全相同?您针对哪个版本的 com.google.android.gms 进行编译?
  • @SergGr 感谢回复,stacktrace 在stackoverflow.com/questions/43864774/… 并使用最新的10.2.1

标签: android firebase firebase-authentication google-api-client google-api-java-client


【解决方案1】:

你好你可以试试这个代码这是我项目中的工作代码 首先在创建时初始化 google api 客户端

public void initGPlus() {
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
}

然后点击按钮调用另一个函数

 Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, RC_SIGN_IN);

在 On Activity 结果中刚刚得到您的响应并处理该结果以生成函数

if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        handleSignInResult(result);
    }

在你的活动中实现这个接口

 implements GoogleApiClient.OnConnectionFailedListener

【讨论】:

【解决方案2】:

虽然检查 Google Play 服务会很好,但我认为这可能是由于设备具有旧版本的 Google Play 服务。但无论如何这都不是一个大错误。

【讨论】:

  • 在设备上,Google Play 服务是最新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 2011-04-20
  • 2014-11-17
  • 2011-03-15
相关资源
最近更新 更多