Android应用程序崩溃:java.lang.IllegalArgumentException:对于requestCode只能使用低16位

时间:2016-08-17 19:32:07

标签: java android

我刚刚在Play商店发布了一个应用程序,并从这个堆栈跟踪的星系注释4获得了崩溃报告:

java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
at android.support.v4.app.q.a(Unknown Source)
at android.support.v4.app.q.startIntentSenderForResult(Unknown Source)
at android.support.v4.app.x.startIntentSenderForResult(Unknown Source)
at com.google.android.gms.common.ConnectionResult.a(Unknown Source)
at com.google.android.gms.common.api.internal.ba.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7225)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我已经在多台设备上测试了我的应用,并且从未遇到过这样的错误!我确实有我认为可能是罪魁祸首的程序吗?你们有什么感想?应用程序崩溃了第一个活动,我只有一个requestCode,其值为111.我不明白为什么我会得到这个异常。 Google登录是在第一个活动中实现的,这里是使用requestCode的地方:

private static final int SIGN_IN_REQUEST_CODE = 111 ; (instance variable)



private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
    startActivityForResult(signInIntent, SIGN_IN_REQUEST_CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

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

}

谢谢, Sameer

1 个答案:

答案 0 :(得分:1)

我在SO中发现了其他一些问题同样存在问题,似乎有些原因您的请求代码大于最大值。

仅在少数设备中出现问题可能是因为问题在以后的版本中得到解决。

此代码来自android.support.v4.app.FragmentActivity

/**
* Modifies the standard behavior to allow results to be delivered to fragments.
* This imposes a restriction that requestCode be <= 0xffff.
*/
@Override
public void startActivityForResult(Intent intent, int requestCode) {
    if (requestCode != -1 && (requestCode&0xffff0000) != 0) {
        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
    }
    super.startActivityForResult(intent, requestCode);
}

如果您的问题发生,上面的代码会抛出异常,因此您可以在任何设备中进行测试,只需覆盖您活动的方法。

如果您在Integer

旁边使用int,我似乎在评论中可能不会出现此问题

另一种解决方法可能是使用某些APP Compat库。

Link to the post with the answer above.