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

时间:2019-11-13 20:09:49

标签: 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;
        }
    }

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

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

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

2 个答案:

答案 0 :(得分:0)

所以我发现了应用程序出了什么问题。 问题是Vungle ads 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"/>

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

答案 1 :(得分:-1)

尝试了很多东西后,这种方法对我来说效果很好

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