即使授予权限,checkSelfPermission 也会返回 false

checkSelfPermission returning false even if Permission is granted

所以我已经在这里坐了 4 个小时了,绞尽脑汁想知道为什么我的 2 台设备运行不正常。 问题是,checkSelfPermission 是 returning false,即使授予了权限! 我 100% 确定这不应该发生,因为它在 5-6 天前按预期工作。 这是我用来检查权限是否被授予的代码。

public boolean isStoragePermissionGranted() {
        if (Build.VERSION.SDK_INT >= 23) {
            if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    == PackageManager.PERMISSION_GRANTED) {
                Log.v("BaseActivity", "Permission is granted");
                return true;
            } else {
                Log.v("BaseActivity", "Storage Permission is revoked");
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                return false;
            }
        } else { //permission is automatically granted on sdk<23 upon installation
            Log.v("BaseActivity", "Permission is granted");
            return true;
        }
    }

现在,每当我第一次打开具有此代码的 activity (BaseActivity) 时,它都会按预期工作并请求用户获得存储权限。 但是,在这个 activity 的片段中,我想访问文件的地方,每当我调用这个方法时,它就开始 returning false。 这个方法我做了public,用过returntrue/false视情况而定。 下面是我如何检查是否在 Fragment 中授予了权限。

if (!((BaseActivity) getActivity()).isStoragePermissionGranted()) {
                        Toast.makeText(getActivity(), getString(R.string.storagePermissionError), Toast.LENGTH_LONG).show();
                        break;
                    }

我在 compileSdkVersiontargetSdkVersion 28,所以范围内的外部存储权限应该不是问题。我在这里做错了什么?为什么 isStoragerPermissionGranted() 方法总是 returning false 即使我 100% 已经授予我的应用程序 STORAGE 权限?

所以我发现应用程序出了什么问题。 问题出在 Vungle 广告 SDK,它设置了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> 

并且根据 https://developer.android.com/guide/topics/manifest/uses-permission-element#maxSdk 系统不会授予 WRITE_EXTERNAL_STORAGE 权限,即使直接在“设置”本身中设置也是如此。

所以这个 SDK 设置了这个标签,很难找到,因为它在 Merged Manifest 里面,我幸运地发现了这个东西。

要在不从您的应用中删除 SDK 的情况下解决此问题,请执行以下操作: 添加 tools:remove="android:maxSdkVersion"

于是就变成了这样:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:remove="android:maxSdkVersion"/>

到您自己 Manifest.xml 中设置了 maxSdkVersion 的标签。

在尝试了很多事情之后,这种方法对我来说效果很好

public boolean hasPermissions(Context context, String... permissions) {
      if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
        for (String permission : permissions) {
            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
    }
    return true;
}

权限数组

 private String[] permissions = (new String[]{Manifest.permission.CAMERA,
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE});

如果调用

    if (hasPermissions(this, permissions)) {
        Intent intent = getPickIntent();
        startActivityForResult(intent, 1001);
    } else {
        requestPermissions(new String[]{Manifest.permission.CAMERA,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSION_CODE);
    }