【问题标题】:How to know when WRITE_EXTERNAL_STORAGE is required如何知道何时需要 WRITE_EXTERNAL_STORAGE
【发布时间】:2016-01-04 04:04:27
【问题描述】:

我正在将我的 Android 应用的 Target SDK 版本升级到具有新运行时权限 (https://developer.android.com/training/permissions/requesting.html) 的 23 (Android M)。我的应用程序在其清单中声明了WRITE_EXTERNAL_STORAGE,现在我必须在运行时请求。当然,我只想在必要时提出请求。

我对不同的存储类型有一个抽象,一种是通过普通的文件 I/O(不是 Android 内容提供程序的东西)实现本地存储。在这个类中,我得到一个文件路径(如 /mnt/sdcard/... 或 /data/data/...),在访问该文件(读写模式)之前,我想检查是否必须调用RequestPermissions 用于 WRITE_EXTERNAL_STORAGE。

所以问题是:确定是否可以在没有该权限的情况下读取和写入文件(例如,因为它在 getExternalFilesDir() 中)的最安全和最简单的方法是什么?

【问题讨论】:

  • “在这个类中,我得到了一个文件路径”——这个路径到底是从哪里来的?如果它来自代码中的其他地方,那么无论您在哪里创建路径,您都知道它是否在外部存储上。如果路径来自您的应用程序外部(例如,Uri 上的 Intent),那么恕我直言,您最好在收到这样的路径之前询问用户的许可,例如在第一次运行你的应用程序。
  • 两种方式都是可能的:路径可以在应用程序内部创建,但我也从 Intents 打开文件。此外,我必须处理在以前版本的应用程序中使用并存储在共享首选项中的路径。我当然不能问所有用户,因为许多用户不使用任何本地存储,而只使用云存储。但是我可以问他们第一次使用不在应用程序内部目录中的任何本地文件。我希望有更好的解决方案。
  • 您找到答案了吗?我正在尝试为 API 23 更新我的应用程序并遇到同样的问题,我如何判断路径是否为外部路径?

标签: android android-permissions


【解决方案1】:

您可以看到here,当您的应用程序需要写入外部存储时,您只需请求WRITE_EXTERNAL_STORAGE。 但是:

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

首先,我建议您避免使用Intents 请求权限,因为这是一种最佳做法,可以大大改善用户体验。

如果您不能使用Intent 来避免使用您的应用程序编写,并且您知道有一天用户将不得不在外部编写,我认为最好在第一次用户时请求权限采用“写入外部存储”路径。

据我所知,在 API23 中您只需要请求一次权限,所以我认为最简单的方法是在用户需要该功能的第一次请求权限时,我认为当他'将再次执行它,权限仍将被接受。您可以使用here 显示的过程检查您授予的权限。

Here你可以阅读:

系统会提示用户授予权限一次,无论是在运行时还是在 安装时间(取决于用户的 Android 版本)。在那之后, 您的应用可以执行该操作而无需额外的 来自用户的交互。但是,如果用户不授予 权限(或稍后撤销),您的应用程序将无法 完全执行操作。

【讨论】:

  • 新权限系统的思想是权限在真正使用之前不会被请求。许多用户很有可能永远不必请求该权限,因为应用程序中有许多其他存储位置选项(例如云存储)。由于这些原因,我不会要求每个用户都授予该权限。
  • 好吧,那你就知道答案了,只在用户走外部存储路径时才请求权限,不是吗?询问用户希望如何存储数据,然后询问权限。
  • 什么是“外部存储路径”?假设您有任何本地文件路径。究竟什么时候需要许可?
  • 我的意思是你将能够知道用户想要存储数据的位置。因此,当您需要在 getExternalFilesDir() 中写入时,例如第一次询问权限
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
相关资源
最近更新 更多