OS 4.0上的Android棉花糖权限模型READ_EXTERNAL_STORAGE权限始终未授予



在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);
}

相关内容

最新更新