androidx ActivityResultContracts.RequestPermission 似乎对已取消的请求有问题

androidx ActivityResultContracts.RequestPermission seems to have issue on cancelled request

我在使用代码

请求权限时使用androidx.activity:activity:1.2.0-alpha8
val request = registerForActivityResult(ActivityResultContracts.RequestPermission()) { res ->
    if (res != null && res) {
      // Permission granted, proceed
    } else {
      UiUtils.showToastSafe(this, R.string.necessary_permission_needed)
    }
}
request.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)

最终在Huawei Mate10上崩溃,堆栈轨迹如下:

Failure delivering result ResultInfo{who=@android:requestPermissions:, request=65538, result=0, data=null} to activity {com.baicizhan.x.shadduck/com.baicizhan.x.shadduck.homepagePhone.PhoneHomepageActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0

androidx.activity.result.contract.ActivityResultContracts$RequestPermission in parseResult at line 265
androidx.activity.result.contract.ActivityResultContracts$RequestPermission in parseResult at line 251
androidx.activity.result.ActivityResultRegistry in doDispatch at line 313
androidx.activity.result.ActivityResultRegistry in dispatchResult at line 277
androidx.activity.ComponentActivity in onRequestPermissionsResult at line 597
androidx.fragment.app.FragmentActivity in onRequestPermissionsResult at line 579
android.app.Activity in dispatchRequestPermissionsResult at line 8567
android.app.Activity in dispatchActivityResult at line 8417
android.app.ActivityThread in deliverResults at line 5464
android.app.ActivityThread in handleSendResult at line 5512
...

似乎取消了请求权限 Intent,Activity 将派发一个 int[0] 作为结果(基于平台 29 源代码):

private void dispatchRequestPermissionsResult(int requestCode, Intent data) {
    mHasCurrentPermissionsRequest = false;
    // If the package installer crashed we may have not data - best effort.
    String[] permissions = (data != null) ? data.getStringArrayExtra(
      PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0];
    final int[] grantResults = (data != null) ? data.getIntArrayExtra(
      PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS) : new int[0];
    onRequestPermissionsResult(requestCode, permissions, grantResults);
}

而RequestPermission中的结果解析部分如下...

@NonNull
@Override
public Boolean parseResult(int resultCode, @Nullable Intent intent) {
    if (intent == null || resultCode != Activity.RESULT_OK) return false;
    int[] grantResults = intent.getIntArrayExtra(EXTRA_PERMISSION_GRANT_RESULTS);
    if (grantResults == null) return false;
    return grantResults[0] == PackageManager.PERMISSION_GRANTED;
}

这是我崩溃的原因还是我遗漏了什么?

另请参阅

根据 this issueRequestPermission 代码已在 1.2.0-alpha07 中修复,以检查返回的数组的长度。请升级到 alpha07 或更高版本。