Android OS 4.0 上的 Marshmallow 权限模型 READ_EXTERNAL_STORAGE 权限始终未授予
Android Marshmallow permission model on OS 4.0 READ_EXTERNAL_STORAGE permission always not granted
当 运行 我的应用程序在 Android OS 4.0 上并请求 READ_EXTERNAL_STORAGE
权限时遇到问题:
ActivityCompat.requestPermissions(ctx, requestedPermissions, requestCode);
我总是收到回电
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
grantResults != PackageManager.PERMISSION_GRANTED
使用 ActivityCompat.checkSelfPermission
检查权限总是返回 permissionDenied
。
通过使用系统对话框请求权限,它在 OS 6.0 上运行良好。
Android OS 4.x 除了 4.0 始终授予权限。
OS 4.0 其他权限(相机、日历、联系人、Phone)表现良好,但导致此问题的 READ_EXTERNAL_STORAGE
除外。
可能是 OS 问题?
What ActivityCompat.requestPermissions()
does 是:
如果您使用的是 Android 6.0+ 或
,请直接拨打真实的 requestPermissions()
使用 PackageManager
查看您是否拥有旧版本 Android
所请求的权限
READ_EXTERNAL_STORAGE
的问题在于它是在 API 级别 16 (Android 4.1) 中添加的。你不能在比那个版本更旧的 Android 上保留它,原因很简单,它不存在。
或者:
将 minSdkVersion
设置为 16,或者
用你自己的逻辑来处理这种情况,认识到 READ_EXTERNAL_STORAGE
在 API 级别 16
之前是无关紧要的
我在 Android 8.0 上处理 FOREGROUND_SERVICE
时发现了这个问题。不幸的是,我的解决方案依赖于异常处理,但它不需要处理支持权限的 API 级别。您可以使用此方法检查当前 API 级别是否存在权限:
private boolean permissionExistsOnCurrentApiLevel(String permission) {
try {
getPackageManager().getPermissionInfo(permission, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return true;
}
使用此方法,您可以实现自己的 ContextCompat.checkSelfPermission
版本,其中所有不存在的权限都被自动视为已授予:
private int myCheckSelfPermission(@NonNull Context context, @NonNull String permission) {
if(!permissionExistsOnCurrentApiLevel(permission)) {
return PackageManager.PERMISSION_GRANTED;
}
return ContextCompat.checkSelfPermission(this, permission);
}
当 运行 我的应用程序在 Android OS 4.0 上并请求 READ_EXTERNAL_STORAGE
权限时遇到问题:
ActivityCompat.requestPermissions(ctx, requestedPermissions, requestCode);
我总是收到回电
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
grantResults != PackageManager.PERMISSION_GRANTED
使用 ActivityCompat.checkSelfPermission
检查权限总是返回 permissionDenied
。
通过使用系统对话框请求权限,它在 OS 6.0 上运行良好。
Android OS 4.x 除了 4.0 始终授予权限。
OS 4.0 其他权限(相机、日历、联系人、Phone)表现良好,但导致此问题的 READ_EXTERNAL_STORAGE
除外。
可能是 OS 问题?
What ActivityCompat.requestPermissions()
does 是:
如果您使用的是 Android 6.0+ 或
,请直接拨打真实的 使用
PackageManager
查看您是否拥有旧版本 Android 所请求的权限
requestPermissions()
READ_EXTERNAL_STORAGE
的问题在于它是在 API 级别 16 (Android 4.1) 中添加的。你不能在比那个版本更旧的 Android 上保留它,原因很简单,它不存在。
或者:
将
minSdkVersion
设置为 16,或者用你自己的逻辑来处理这种情况,认识到
READ_EXTERNAL_STORAGE
在 API 级别 16 之前是无关紧要的
我在 Android 8.0 上处理 FOREGROUND_SERVICE
时发现了这个问题。不幸的是,我的解决方案依赖于异常处理,但它不需要处理支持权限的 API 级别。您可以使用此方法检查当前 API 级别是否存在权限:
private boolean permissionExistsOnCurrentApiLevel(String permission) {
try {
getPackageManager().getPermissionInfo(permission, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
return false;
}
return true;
}
使用此方法,您可以实现自己的 ContextCompat.checkSelfPermission
版本,其中所有不存在的权限都被自动视为已授予:
private int myCheckSelfPermission(@NonNull Context context, @NonNull String permission) {
if(!permissionExistsOnCurrentApiLevel(permission)) {
return PackageManager.PERMISSION_GRANTED;
}
return ContextCompat.checkSelfPermission(this, permission);
}