【问题标题】:error ArrayIndexOutOfBoundsException occurs only sometimes, user permission?错误 ArrayIndexOutOfBoundsException 仅有时发生,用户权限?
【发布时间】:2022-01-23 08:46:28
【问题描述】:

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

引起:java.lang.ArrayIndexOutOfBoundsException:在 com.file.gt.MainActivity.onRequestPermissionsResult (MainActivity.java:234) 在 android.app.Activity.requestPermissions (Activity.java:5323) 在 com.file.gt.MainActivity.onCreate (MainActivity.java:85) 在 android.app.Activity.performCreate (Activity.java:8114) 在 android.app.Activity.performCreate (Activity.java:8098) 在 android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1309) 在 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();
    }
}

任何想法什么是错的,我做错了什么? 谢谢。

【问题讨论】:

  • 你知道有一个工具叫做调试器。您甚至可以在 Intellij 等现代 IDE 的调试器中放置条件,以便仅在条件(如越界)适用时在断点处停止。你应该认真去探索调试,因为这是开发人员的一项基本技能
  • @JAsgarov 谢谢,我会学习的。但我知道问题出在哪里,只是不知道我的 onRequestPermissionsResult 上缺少什么。

标签: java android android-studio android-permissions


【解决方案1】:

当您收到ArrayIndexOutOfBoundsException 时,表示您正在访问超出数组大小的数组索引。您的堆栈跟踪表明它发生在onRequestPermissionsResult,并且您访问的唯一数组是grantResults

sometimes happen可以是grantResults在用户拒绝权限的情况下在onRequestPermissionsResult是空的,所以你应该在访问它的成员之前检查它的大小

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

或者,如果您使用新的registerForActivityResult 方法,您可以完全解决这个问题。查看here 了解更多信息,或查看here 以获取示例使用。

【讨论】:

  • 非常感谢!
【解决方案2】:
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(); 
}

【讨论】:

  • 谢谢你,朋友!我会试试你的答案。
猜你喜欢
  • 2019-08-14
  • 2021-09-30
  • 2018-01-25
  • 2013-11-18
  • 2014-12-04
  • 1970-01-01
  • 2019-03-13
  • 2014-08-09
  • 2018-08-19
相关资源
最近更新 更多