mis*_*han 1 android android-fragments android-permissions
我运行代码时从不调用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();
}
Run Code Online (Sandbox Code Playgroud)
并且同一片段中的另一个方法覆盖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;
Run Code Online (Sandbox Code Playgroud)
我读过的常见错误但不适用于我的情况:
权限对话框按预期显示,我可以选择"确定".
非常感谢一些帮助,因为我已经通过十几个StackOverflow帖子无济于事.完整的代码在这里如果有人需要它.
在您的活动级别中onRequestPermissionsResult(),处理活动发出的任何权限请求.
如果与requestCode活动请求的不匹配(例如,在a的default分支中switch),则链接到超类(super.onRequestPermissionsResult(requestCode, permissions, grantResults);).如果您不这样做,那么可能会阻止FragmentActivity将结果路由到片段,以用于片段发起的请求.