如何知道何时需要使用WRITE_EXTERNAL_STORAGE权限

4
我正在将我的Android应用程序的目标SDK版本升级到23(Android M),其中包含新的运行时权限(https://developer.android.com/training/permissions/requesting.html)。我的应用程序在其清单中声明了WRITE_EXTERNAL_STORAGE,现在必须在运行时请求。当然,我希望只在必要时才请求。
我有一个不同存储类型的抽象,其中一个通过普通文件I/O实现本地存储(而不是Android内容提供程序)。在这个类中,我获取一个文件路径(如/mnt/sdcard/...或/data/data/...),在访问该文件之前(读写模式),我想检查是否需要调用RequestPermissions以进行WRITE_EXTERNAL_STORAGE。
因此问题是:确定文件是否可以在没有该权限的情况下进行读写的最安全和最简单的方法是什么(例如,因为它在getExternalFilesDir()内部)?

在这个类中,我获取了一个文件路径——这个路径具体来自哪里?如果它来自你代码中的其他地方,那么你知道它是否在创建路径的任何位置都是外部存储。如果路径来自应用程序之外(例如,在Intent上的Uri),那么在您可能收到此路径之前,最好在应用程序第一次运行时向用户请求权限。 - CommonsWare
可以在应用程序内创建路径,也可以从意图中打开文件。此外,我还必须处理在应用程序先前版本中使用并存储在共享首选项中的路径。我肯定不能询问所有用户,因为许多用户不使用任何本地存储,而只使用云存储。但是,我可以在他们第一次使用不在应用程序内部目录中的任何本地文件时询问他们。我希望有更好的解决方案。 - Philipp
你找到答案了吗?我正在尝试为API 23更新我的应用程序,遇到了同样的问题,如何判断路径是否为外部路径? - Chen
1个回答

1
你可以在这里看到,当你的应用程序需要写入外部存储时,只需要请求WRITE_EXTERNAL_STORAGE权限。 但是:

从API 19级开始,在调用getExternalFilesDir(String)getExternalCacheDir()返回的应用特定目录中读/写文件时,不需要此权限。

首先,我建议你避免使用Intent请求权限,因为这是最佳实践,可以大大提高用户体验。
如果你无法使用Intent避免与应用程序写入有关的问题,并且你知道某一天用户必须进行外部写入,则最好在用户第一次进行“写入外部存储”时请求权限。
据我所知,在API23中,您只需要一次请求权限,因此我认为最简单的方法是在用户需要功能的第一次请求权限,然后当他再次执行时,权限将保持被接受状态。您可以使用此处所示的过程检查已授予的权限。
这里,您可以阅读到:
用户会被提示一次授权,无论是在运行时还是安装时(取决于用户的Android版本)。之后,您的应用程序可以执行操作而无需额外与用户交互。但是,如果用户不授予权限(或稍后撤销权限),则您的应用程序将完全无法执行该操作。

新权限系统的想法是,只有在真正需要使用权限时才会请求。很可能许多用户永远不必请求该权限,因为应用程序中有许多其他存储位置的选项(例如云存储)。出于这些原因,我不会要求每个用户授予该权限。 - Philipp
好的,那你知道答案了,只有在用户选择外部存储路径时才询问权限,对吧?先询问用户想如何存储数据,然后再问是否需要权限。 - arodriguezdonaire
"外部存储路径"是什么?假设您有任何本地文件路径。在什么情况下需要权限? - Philipp
我的意思是,您将能够知道用户想要存储数据的位置。因此,当您需要在getExternalFilesDir()中写入时,例如第一次请求权限。 - arodriguezdonaire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接