【问题标题】:Testing out MANAGE_EXTERNAL_STORAGE permission测试 MANAGE_EXTERNAL_STORAGE 权限
【发布时间】:2021-06-18 21:40:45
【问题描述】:

我想为我的文件管理器应用程序支持 MANAGE_EXTERNAL_STORAGE 权限。我已按照以下步骤执行此操作。我在清单中添加了以下行

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

并使用以下代码请求主要活动的权限:

if (Environment.isExternalStorageManager()) {
    //todo when permission is granted
} else {
    //request for the permission
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}

我的问题不在于获得许可。这是另外一回事。当我不小心将我的旧 APK 用于支持存储访问的旧版 Android 10 设备时,它实际上可以在 Android Studio 中的 Android 11 的 Pixel 4 模拟器上运行。它要求写入权限 (WRITE_EXTERNAL_STORAGE),而我认为该权限在 Android 11 上不再可用。当我进入权限时,我没有看到存储 (WRITE_EXTERNAL_STORAGE) 权限(我在 Android 6 上看到- 10 台设备),我看到了 Android 11 的管理 (MANAGE_EXTERNAL_STORAGE) 权限。这是怎么回事?系统是否将WRITE_EXTERNAL_STORAGE 映射到MANAGE_EXTERNAL_STORAGE 权限?

我问的原因是我的用户将他们的手机从 Android 10 升级到 11,他们报告说该应用程序(仅包含 WRITE_EXTERNAL_STORAGE)在启动时没有响应。它如何在我的带有 Pixel 4 Android 11 的模拟器上运行?是否有可能真正获得我的用户获得的相同行为?我没有真正的 Android 11 设备。

谢谢。

【问题讨论】:

  • 我认为是因为android的向后兼容性
  • 也可能是因为您的旧 apk 在清单中将 requestLegacyExternalStorage 设置为 true
  • 非常感谢您的回复,Ishaan Kumar。不过,根据文档,这在 Android 11 中已被弃用。
  • 是的,它在 Android 11 中已弃用,但仍可用于支持向后兼容性

标签: android storage scoped-storage


【解决方案1】:

根据我自己的经验,从 API 30(android 11 及以上)开始,以下权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

被完全忽略(但对于 API 29 及更低版本必须包含在您的清单中。

话虽如此,只要您的清单上提供以下权限,用户将被提升为在其手机设置中手动启用scoped storage

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

您必须注意的事项 当面向 API 30 及更高版本时,请确保优雅地处理外部存储,否则操作系统可能会拒绝此权限,并且如果 try/catch 没有同样优雅地实现,您的应用程序可能会崩溃。下面的片段

if (Environment.isExternalStorageManager()) {
    //todo when permission is granted
} else {
    //request for the permission here
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    Uri uri = Uri.fromParts("package", getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}

此外,不要忘记在清单中添加android:requestLegacyExternalStorage="true",这将使您的应用用户能够选择退出scoped storage(仅当您的目标 API 为 29,android 10 时)并且您的用户可以访问您的安卓 11 及以上版本的应用。

【讨论】:

  • 非常感谢这个“android:requestLegacyExternalStorage="true"”,现在我可以安心睡觉了
【解决方案2】:

here所述,

在 Android 11 上运行但以 Android 10(API 级别 29)为目标的应用仍然可以请求 requestLegacyExternalStorage 属性。此标志允许应用程序暂时选择退出与范围存储相关的更改,例如授予对不同目录和不同类型媒体文件的访问权限。在您将应用更新为面向 Android 11 后,系统会忽略 requestLegacyExternalStorage 标志。

由于您的旧 APK 以 Android 10 为目标,Android 操作系统可以使用 requestLegacyExternalStorage 来支持向后兼容性。

Android 这样做是因为所有不针对 Android 11 的应用程序都将停止协同工作,这对所有用户来说都是一种痛苦。为什么要打扰用户在更新到 Android 11 后他们无法使用他们现有的应用程序。在这种情况下,除非所有开发者都更新他们的应用程序,否则没有人会更新。

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 2021-01-22
    • 2021-12-29
    • 2022-01-18
    • 2012-01-18
    • 2022-01-05
    • 1970-01-01
    • 2023-03-18
    • 2016-01-25
    相关资源
    最近更新 更多