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