onRequestPermissionsResult()。我的片段中有一个请求权限的方法:
void initiateGalleryUpload() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(getActivity(), READ_EXTERNAL_STORAGE) != PERMISSION_GRANTED) {
if (shouldShowRequestPermissionRationale(READ_EXTERNAL_STORAGE)) {
new AlertDialog.Builder(getActivity())
.setMessage(getString(R.string.read_storage_permission_rationale))
.setPositiveButton("OK", (dialog, which) -> {
Timber.d("Requesting permissions for read external storage");
requestPermissions(new String[]{READ_EXTERNAL_STORAGE}, 1);
dialog.dismiss();
})
.setNegativeButton("Cancel", null)
.create()
.show();
} else {
requestPermissions(new String[]{READ_EXTERNAL_STORAGE},
1);
}
} else {
controller.startGalleryPick();
}
}
else {
controller.startGalleryPick();
}
同一片段中的另一个方法覆盖onRequestPermissionsResult:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
Timber.d("onRequestPermissionsResult: req code = " + " perm = " + permissions + " grant =" + grantResults);
switch (requestCode) {
// 1 = "Read external storage" allowed when gallery selected
case 1: {
if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) {
Timber.d("Call controller.startGalleryPick()");
controller.startGalleryPick();
}
}
break;
我读过的常见错误但不适用于我的案例:
权限对话框按预期显示,我可以选择"确定"。
非常感谢一些帮助,因为我已经通过十几个StackOverflow帖子无济于事。完整代码here,如果有人需要它。
答案 0 :(得分:5)
在您的活动级onRequestPermissionsResult()
中,处理活动发出的所有权限请求。
如果requestCode
与活动请求的不匹配(例如,在default
的{{1}}分支中),则链接到超类(switch
)。如果您不这样做,那么对于片段发起的请求,这可能会阻止super.onRequestPermissionsResult(requestCode, permissions, grantResults);
将结果路由到片段。