当前位置: 首页 > 知识库问答 >
问题:

OS 4.0上的AndroidMarshmallow权限模型读取\外部\存储权限始终未授予

马才
2023-03-14

在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

通过使用system dialog请求权限,它在OS 6.0上运行良好。Android操作系统4。除4.0之外,始终授予许可。OS 4.0其他权限(摄像头、日历、联系人、电话)运行正常,但导致此问题的读取外部存储

也许是操作系统的问题?

共有2个答案

巴博耘
2023-03-14

我在处理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);
}
田向荣
2023-03-14

什么ActivityCompat.request权限()做的是:

>

使用PackageManager查看您是否在旧版本的Android上拥有请求的权限

READ_EXTERNAL_STORAGE的问题是它是在API Level 16(Android 4.1)中添加的。你不能把它放在比这更旧的Android版本上,原因很简单,它不存在。

要么:

>

把你自己的逻辑放进去处理这种情况,认识到READ_EXTERNAL_STORAGE在API级别16之前是不相关的

 类似资料:
  • 我最近更新了我的应用程序,以支持android 6Marshmallow。我按照指示https://developer.android.com/training/permissions/requesting.html 并添加了请求权限Manifest.permission.RECEIVE_SMS。当 im 运行以下代码时: 我得到 java.lang.SecurityException:权限拒绝:

  • 我正在尝试创建一个简单的应用程序,该应用程序可以从图库应用程序获取图像并将其显示在图像按钮上。我正在运行 Android 5.0.1 的手机上使用 API 21 进行测试。不幸的是,无论我尝试什么,我都会收到安全错误 - 即使我指定了权限。 我获取和检索图像的代码是: 当我尝试从Dropbox中选择图像时,代码有效,但当我从图库中选择图像时,我得到 我将READ_EXTERNAL_STORAGE的

  • 问题内容: 我在注册后使用以下方法进行程序化登录 用户已通过身份验证,但始终具有ROLE_ANONYMOUS我不知道为什么?有任何想法吗 ? 问题答案: 这种现象看起来很奇怪。Javi建议手动将安全性上下文持久化到会话中,但是应该由Spring Security的自动完成。 一个可能的原因,我可以想像是在你的登记处理的页面。 禁用指定URL的所有安全过滤器。如你所见,它可能会干扰Spring Se

  • 我已经创建了自己的android。这样我就可以使用隐藏的API调用“DisplayManager.connectWifiDisplay()”。 当我运行应用程序并调用该方法时,在通过Wifi Direct连接到显示器后, 我得到以下例外: java.lang.SecurityException:连接到wifi显示器所需的权限:用户10105和当前进程都没有android.Permission.CO

  • 在这一点上我得到了警告: 如何让它保存文件?当我在Eclipse上创建它时,这是可行的,但是现在我更新并移到了Android Studio中,它似乎坏了一些东西。

  • 我正在开发一个应用程序,它需要AndroidMarshmallow的位置权限。我遵循了实现它所需的所有步骤(函数调用)。当我运行应用程序时,它会弹出一个请求用户权限的框。当我选择是时,它会显示另一个弹出窗口,上面写着“检测到屏幕覆盖”,并将我带到显示应用程序列表的设置屏幕。在那里,我取消选中所有应用程序,然后按后退按钮返回我的应用程序。当调用回调时,我可以看到权限未被授予。它一直在发生。 为什么它