React-Native(Android):请求权限时抛出的ArrayIndexOutOfBoundsException

时间:2017-06-02 17:19:18

标签: android react-native android-permissions

最近我在使用React-Native应用程序时遇到了一个非常奇怪的问题。这是我的环境:

  • Rect-Native 0.42.3
  • 三星Galaxy Note 5
  • Android 6.0

正如您所知,自Marshmallow以来,Android权限模型已发生变化,但几天前,我得到了他的例外:

java.lang.RuntimeException:
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4156)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4250)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1839)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7229)
    at java.lang.reflect.Method.invoke(Native Method:0)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.ArrayIndexOutOfBoundsException:
    at com.facebook.react.modules.permissions.PermissionsModule$1.invoke(PermissionsModule.java:119)
    at com.facebook.react.modules.permissions.PermissionsModule.onRequestPermissionsResult(PermissionsModule.java:207)
    at com.facebook.react.ReactActivityDelegate$1.invoke(ReactActivityDelegate.java:211)
    at com.facebook.react.ReactActivityDelegate.onResume(ReactActivityDelegate.java:131)
    at com.facebook.react.ReactActivity.onResume(ReactActivity.java:66)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1286)
    at android.app.Activity.performResume(Activity.java:6987)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4145)

首先,我认为我错过了代码中的检查,正如here所解释的那样但事实并非如此,否则我会收到这样的消息:

java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{fac49ea 4674:com.gospacesmobile/u0a65} (pid=4674, uid=10065) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS

我查看了React-Native的代码,发现了这个:

// com.facebook.react.modules.permissions.PermissionsModule.java
int[] results = (int[]) args[0];
if (results[0] == PackageManager.PERMISSION_GRANTED) { // <- the exception happens when results is empty
    promise.resolve(GRANTED);
} else {
    PermissionAwareActivity activity = (PermissionAwareActivity) args[1];
    if (activity.shouldShowRequestPermissionRationale(permission)) {
        promise.resolve(DENIED);
    } else {
        promise.resolve(NEVER_ASK_AGAIN);
    }
}

根据documentation,只要取消了权限请求,grantResults变量就可以为空:

@Override
public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

不幸的是,我没有客户端代码(因为google console dev中的崩溃报告没有提到它)。在任何情况下,不应该检查空grantResults的React-Native吗?这是一个错误吗?如果是的话,怎么可以复制?我没有看到任何方法可以做到这一点,除非取消负责确保是否已启用权限的承诺(考虑到反应原生权限API,这是不可能的)。

任何想法都非常受欢迎。提前谢谢。

1 个答案:

答案 0 :(得分:1)

所以我终于找到了问题。每当出现权限请求对话框时,如果用户最小化应用程序,然后通过单击主菜单中的应用程序图标返回到该应用程序,则results为空,这会导致应用程序崩溃。

这似乎很安静一个简单的问题,我决定使用React-Native补丁来防止升级不稳定(现在我检查results数组是否为空,如果是是,然后否认请求)。我仍然不知道这是一个常见问题还是来自我的应用程序。