在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
。
通过系统对话框请求权限,在OS6.0上运行良好。安卓操作系统4.x除了4.0之外,权限总是被授予的。OS 4.0除了READ_EXTERNAL_STORAGE
导致此问题外,其他权限(相机、日历、联系人、电话)运行良好。
也许是操作系统问题?
ActivityCompat.requestPermissions()
的作用是:
-
如果你在安卓6.0+或上,请拨打真正的
requestPermissions()
-
使用
PackageManager
查看您是否在旧版本的Android 上拥有请求的权限
READ_EXTERNAL_STORAGE
的问题是它是在API 16级(Android 4.1)中添加的。你不能在旧版本的Android上使用它,原因很简单,因为它不存在。
任一:
-
将
minSdkVersion
设置为16或 -
将您自己的逻辑用于处理这种情况,认识到
READ_EXTERNAL_STORAGE
在API 16级之前是不相关的
我在安卓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);
}