【问题标题】:checkSelfPermission returning false even if Permission is granted即使授予权限,checkSelfPermission 也会返回 false
【发布时间】:2019-11-13 20:09:49
【问题描述】:

所以我已经在这里坐了 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。 我已经公开了这个方法,它曾经根据情况返回真/假。 以下是我检查是否在 Fragment 中授予权限的方法。

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

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

【问题讨论】:

  • 您是否在 Manifest 中添加了这些权限?
  • 还可以尝试使用Settings->Apps->"Your_APP"->Permissions手动检查授予或未授予权限的位置
  • if (!((BaseActivity) getActivity()).isStoragePermissionGranted() 奇怪的构造。将函数设为静态并像 if (!BaseActivity.isStoragePermissionGranted(getActivity()) 一样调用它。
  • @Md.Asaduzzaman 是的,我已经在 Manifest 中添加了这些权限,并且我手动检查了是否在应用设置中授予了权限。
  • @blackapps 我无法将函数设为静态,因为 checkSelfPermission 不是静态函数。它不能从静态上下文中引用。正如我所说,这在 3-4 天之前按预期工作,然后突然停止工作。

标签: android android-storage


【解决方案1】:

所以我发现了这个应用程序出了什么问题。 问题在于 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 的标签。

【讨论】:

  • 上帝保佑你
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-20
    • 2017-02-12
    • 2021-10-31
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多