错误 ArrayIndexOutOfBoundsException 仅有时发生,用户权限?

error ArrayIndexOutOfBoundsException occurs only sometimes, user permission?

我的应用中的一些用户收到此错误:

Caused by: java.lang.ArrayIndexOutOfBoundsException: at com.file.gt.MainActivity.onRequestPermissionsResult (MainActivity.java:234) at android.app.Activity.requestPermissions (Activity.java:5323) at com.file.gt.MainActivity.onCreate (MainActivity.java:85) at android.app.Activity.performCreate (Activity.java:8114) at android.app.Activity.performCreate (Activity.java:8098) at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3480)

它只在某些用户中偶尔出现。

我的应用程序中有这个:

private final String [] permissions = {
        "android.permission.RECORD_AUDIO",
        "android.permission.READ_PHONE_STATE"
};

        int requestCode = 200;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (checkSelfPermission(permissions[0]) == PackageManager.PERMISSION_DENIED ||
                    checkSelfPermission(permissions[1]) == PackageManager.PERMISSION_DENIED) {
                requestPermissions(permissions, requestCode);
            }
        }

还有这个:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(grantResults[0] == PackageManager.PERMISSION_GRANTED
    && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
        recreate(); // 234
    }
    else {
        AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
        alertDialog.setTitle(getString(R.string.alert_title));
        alertDialog.setMessage(getString(R.string.alert_text));
        alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
                (dialog, which) -> dialog.dismiss());
        alertDialog.show();
    }
}

知道哪里出了问题以及我做错了什么吗? 谢谢

private final String [] permissions = {
android.Manifest.permission.RECORD_AUDIO, 
android.Manifest.permission. READ_PHONE_STATE,
};
int requestCode = 200;

public static boolean hasPermissions(Context context, String... permissions) {
if (context != null && permissions != null) {
    for (String permission : permissions) {
        if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
}
return true;}

//用户此代码进行检查

if (!hasPermissions(this, PERMISSIONS)) {
   ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}else{
   recreate(); 
}

当您得到 ArrayIndexOutOfBoundsException 时,这意味着您正在访问超出数组大小的数组索引。你的堆栈跟踪说它发生在 onRequestPermissionsResult 中,你访问的唯一数组是 grantResults.

可以的是,如果用户拒绝权限,grantResultsonRequestPermissionsResult中是空的,所以你应该在访问它的成员之前检查它的大小

if(grantResults.length == 2 &&
   grantResults[0] == PackageManager.PERMISSION_GRANTED &&
   grantResults[1] == PackageManager.PERMISSION_GRANTED) {
    recreate();
}
else {
    // handle permissions not granted
}

或者,如果您使用新的 registerForActivityResult approach you can get around this entirely. Have a look here for more info, or 作为示例。