【问题标题】:Do I have to declare both WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE?我是否必须同时声明 WRITE_EXTERNAL_STORAGE 和 READ_EXTERNAL_STORAGE?
【发布时间】:2012-08-10 03:50:48
【问题描述】:

声明<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 就足够了,还是我还必须声明<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />? Javadocs 省略了这一重要信息。

【问题讨论】:

  • 我很确定不会自动授予任何权限
  • 您不必设置读取权限。在FileInputStream 上尝试BitmapFactory.decodeStream()
  • 写了一个答案,但现在我清楚地记得我的一个应用程序,我从来不需要读取权限。
  • 事实上文档中明确指出写权限也意味着读权限。

标签: android permissions android-sdcard


【解决方案1】:

最好是显式地声明两个权限,但仅声明 android.permission.WRITE_EXTERNAL_STORAGE 会在构建时自动将 android.permission.READ_EXTERNAL_STORAGE 添加到您的 APK。

您可以在 APK 上使用命令 aapt dump badging 来查看 Android 是否考虑使用写入权限暗示您也需要读取权限。

这是我的一个 APK 的 aapt 的一些输出,我在清单中声明 only WRITE_EXTERNAL_STORAGE

uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE',
  'requested WRITE_EXTERNAL_STORAGE'

【讨论】:

  • 为什么最好同时声明两者?在 Marsh 中,您必须请求运行时权限,并且必须为读取和写入都这样做是没有意义的,尤其是当写入隐式提供读取时。
【解决方案2】:

READ_EXTERNAL_STORAGE 仅存在于 Jelly Bean(16 级)。根据the docs,Jelly Bean 的所有应用程序都拥有该权限,即使没有声明它:

提供对外部存储的受保护读取访问。在 Android 4.1 中 默认所有应用程序仍然具有读取权限。这将被改变 在未来的版本中要求应用程序明确请求 使用此权限进行读取访问。如果您的申请已经 请求写访问,它也会自动获得读访问。 有一个新的开发人员选项可以打开读取访问限制, 让开发人员根据 Android 将如何测试他们的应用程序 未来的表现。

因此,您应该声明它以供将来兼容,但这可能不是问题的根源,除非您使用的是果冻豆手机并设置开发人员选项“保护 USB 存储”选项。

【讨论】:

  • +1,我已经找到了问题的根源;当然,这与此无关。谢谢!
  • -1 这不是对实际问题的回答。该文档明确指出,写权限也隐含地带来了读权限。因此,无需向编写的“面向未来”的应用程序声明这一点; is 仅需要用于需要只读访问权限的应用程序。
  • 我第一次看到评论比帖子更有用。 @ChrisStratton 100% 正确。
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 2023-03-30
  • 2016-03-08
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多