【问题标题】:Grant permission required for EXTERNAL_STORAGE in Android M?在 Android M 中授予 EXTERNAL_STORAGE 所需的权限?
【发布时间】:2015-07-01 13:22:38
【问题描述】:

Android 权限WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE 会触发Android M 的新授予权限 对话框吗?

【问题讨论】:

    标签: android permissions android-6.0-marshmallow


    【解决方案1】:

    我同意 Guillaume Perrot 的回答。我在AndroidManifest.xmlREAD_WRITE_EXTERNAL_STORAGE的权限时遇到了类似的问题

    应用默认不显示权限,需要在应用权限中切换存储的切换按钮。然后我将build.gradle中的targetSdkVersion修改为小于23(MNC)和其他相关的数字sdkVersion,权限安装的应用。

    另一种方法是在需要权限的地方写requestpermission函数。代码如下:

     if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)==
        PackageManager.PERMISSION_GRANTED) {
        //do the things} else {
        requestPermissions(new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE },
          AnyNumber);
    

    因为我的声望低于 15,所以我不能投票给 Guillaume Perrot 的答案。就用这种方式来表达我的想法。

    【讨论】:

    • if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED) 即使我在设置中撤消了权限,也满足了。然后应用程序失败...
    【解决方案2】:

    如果检查 Android M 的版本,我解决了添加此问题

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
                        requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                }
    

    【讨论】:

      【解决方案3】:

      我的答案基于我使用模拟器对 M Preview SDK 版本 2 进行的测试。

      如果您以 MNC 预览 API 级别为目标,则默认情况下不会授予 WRITE_EXTERNAL_STORAGE 并将成为新动态权限 API 的一部分。

      您将在设备设置的新应用权限菜单中看到存储权限作为切换按钮,您可以使用Activity.requestPermissions 显示该权限的弹出窗口。

      但是,如果您针对 api 级别 Activity.requestPermissions 编译代码,因为预览版SDK 强制minSdkVersion="MNC" 使用新的API。

      这是与位置权限不同的行为:无论您定位的 API 级别是什么,用户都可以在权限菜单中关闭位置。

      对于权限菜单本身,权限切换状态默认为开启,如果:

      • 目标 API 级别
      • 目标 API 级别 = MNC,但您在设备上升级了之前安装的应用,其中目标 API 级别低于 MNC。

      否则,默认情况下您将看到切换为关闭。

      希望对你有帮助。

      【讨论】:

      • 我观察到的存储和位置权限之间的差异显然没有记录......我不知道这是设计使然,文档错误还是平台错误。
      【解决方案4】:

      根据文档:

      安装时授予的有限权限:当用户安装或更新应用程序时,系统会授予该应用程序该应用程序请求的属于 PROTECTION_NORMAL 的所有权限。

      所以因为 READ_EXTERNAL_STORAGE 属于 PROTECTION_NORMAL ,它不会触发对话框。

      但是由于 WRITE_EXTERNAL_STORAGE 的级别是 PROTECTION_DANGEROUS,它会属于文档中描述的这种行为:

      用户在运行时授予权限:当应用程序请求权限时,系统会向用户显示一个对话框,然后调用应用程序的回调函数通知它是否已授予权限。如果用户授予权限,则应用程序将获得该权限功能区域中在应用程序清单中声明的​​所有权限

      这里是保护级别的来源:

      detailed list

      【讨论】:

      • Android 文档说例如授予互联网权限没有问题,但现在很危险,因此只有两个假设:文档完全错误或 Android m 源代码中有关保护的更改水平。
      • 我认为文档对此并不完全清楚。唯一明确的一点是“系统授予应用程序请求的属于 PROTECTION_NORMAL 的所有权限。”
      • 我只是检查一下,在android m中一些权限已被降级,所以你的答案完全错误
      • 首先我说read Permmision是正常级别,所以一半肯定是对的...其次,你在哪里找到M中的permmision级别的数据?
      • Google 是你的朋友
      【解决方案5】:

      根据Android docs,您不需要请求关于读取和写入外部存储的权限。

      编辑:在最新的 Android M 版本中,您需要请求读取和写入权限

      【讨论】:

      • 你在哪里看到的?
      【解决方案6】:

      存储权限属于危险保护级别,因此如果App target SDK设置为23,所有危险保护级别权限在Android M安装时不会被授予。它们将在运行时授予。 是的,这些权限也可以在运行时撤销。

      没有权限对话框不会被自动触发,你需要通过API请求请求,例如requestPermissions()方法来显示该原生对话框。

      请查看危险等级权限列表here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        相关资源
        最近更新 更多