【问题标题】:WRITE_EXTERNAL_STORAGE still required with KitKat?KitKat 仍然需要 WRITE_EXTERNAL_STORAGE 吗?
【发布时间】:2015-04-16 15:04:17
【问题描述】:

documentation 中所述,从 API 级别 19 开始,WRITE_EXTERNAL_STORAGE 权限不应成为要求。因此,我已将其写入清单:

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

但是,当我运行使用 Google Maps V2 并因此需要访问外部存储的应用程序时,我收到了 SecurityException

java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

我运行该应用程序的手机是 KitKat (4.4),它的 API 级别为 19。据我了解,该应用程序应该能够在未经许可的情况下正常运行。为什么我还是会收到错误消息?

【问题讨论】:

标签: android android-permissions


【解决方案1】:

从 API 级别 19 开始,WRITE_EXTERNAL_STORAGE 权限不应成为要求

仅当您使用 Context 上的方法(如 getExternalFilesDir())时,才能访问特定于您的应用的外部存储的标准位置。对于其他位置,比如Environment上的方法上报的路径,还是需要权限的。

或者,引用the documentation that you linked to

例如,从 Android 4.4(API 级别 19)开始,当您的应用想要写入外部存储上自己的应用特定目录(由 getExternalFilesDir 提供的目录)时,您的应用不再需要请求 WRITE_EXTERNAL_STORAGE 权限())。

此外,欢迎第三方库出于自身原因要求您拥有此权限。

为什么我还是会收到错误消息?

看起来 MapsV2 在其设置过程中正在验证您是否拥有该权限。这是 MapsV2 的特权。也许他们正在寻求在不需要此许可的有限区域之外使用外部存储。也许他们没有更新代码中的权限检查,但未能更新。 MapsV2 是封闭源代码,很难分析这类事情。

【讨论】:

    【解决方案2】:

    根据WRITE_EXTERNAL_STORAGE 文档(强调我的):

    从 API 级别 19 开始,不需要此权限 读取/写入文件在您的应用程序特定目录中返回 getExternalFilesDir(String) 和 getExternalCacheDir()。

    Google Maps API 可能正在使用外部存储上的目录,这些目录不是特定于您的应用程序,因此您需要包含所有 API 级别的权限。

    【讨论】:

      猜你喜欢
      • 2015-09-06
      • 2021-05-02
      • 2012-04-15
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2015-02-18
      • 2011-09-09
      • 2015-05-21
      相关资源
      最近更新 更多