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

Ved*_*agh 3 android android-storage

所以我已经在这里坐了 4 个小时,我一直在挠头,为什么我的 2 个设备行为不端。问题是,即使授予了权限,checkSelfPermission 也会返回 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在,每当我第一次打开BaseActivity具有此代码的活动 ( ) 时,它都会按预期工作并请求用户获得存储权限。但是,在此活动中的片段中,我想在其中访问文件,每当我调用此方法时,它都开始返回 false。我已经公开了这个方法,它曾经根据情况返回真/假。这是我检查 Fragment 中是否授予权限的方法。

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

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

Ved*_*agh 5

所以我发现了这个应用程序有什么问题。问题是 Vungle 广告 SDK,它设置了

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" /> 
Run Code Online (Sandbox Code Playgroud)

根据https://developer.android.com/guide/topics/manifest/uses-permission-element#maxSdkWRITE_EXTERNAL_STORAGE即使直接在“设置”中设置,系统也不会授予权限。

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

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

所以它变成了这样:

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:remove="android:maxSdkVersion"/>
Run Code Online (Sandbox Code Playgroud)

maxSdkVersion您自己设置的标签Manifest.xml