Android 如何知道何时需要写入外部存储

Android 如何知道何时需要写入外部存储,android,android-permissions,Android,Android Permissions,我正在将我的Android应用程序的目标SDK版本升级到23(Android M),该版本具有新的运行时权限()。我的应用程序已在其清单中声明,现在必须在运行时请求该清单。当然,我只想在必要时提出要求 我对不同的存储类型有一个抽象,一个是通过普通的文件I/O实现本地存储(不是Android内容提供商的东西)。在这个类中,我获得了一个文件路径(如/mnt/sdcard/…或/data/data/…),在访问该文件(读写模式)之前,我想检查是否必须调用RequestPermissions进行写外部存

我正在将我的Android应用程序的目标SDK版本升级到23(Android M),该版本具有新的运行时权限()。我的应用程序已在其清单中声明,现在必须在运行时请求该清单。当然,我只想在必要时提出要求


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

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

您可以看到,您只需询问应用程序何时需要写入外部存储。 但是:

从API级别19开始,无需此权限即可 读取/写入由返回的应用程序特定目录中的文件
getExternalFilesDir(字符串)
getExternalCacheDir()

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

如果你不能使用
意图
来避免使用你的应用程序进行写操作,并且你知道有一天用户将不得不在外部进行写操作,我认为最好是在用户第一次使用“外部存储写入”路径时请求权限

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

你可以阅读:

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


“在这个类中,我得到一个文件路径”--这个路径到底从哪里来?如果它来自代码中的其他地方,那么您就知道它是否位于创建路径的外部存储上。如果路径来自应用程序外部(例如,
Intent
上的
Uri
),那么在您可能收到此类路径之前(例如在应用程序的第一次运行时),最好先向用户请求权限。这两种方法都是可能的:路径可以在应用程序内部创建,但我也会从Intent打开文件。此外,我还必须处理在以前版本的应用程序中使用过并存储在共享首选项中的路径。我当然不能问所有用户,因为许多用户不使用任何本地存储,只使用云存储。但我可以问他们第一次使用任何不在应用程序内部目录中的本地文件。我希望有更好的解决办法。你找到答案了吗?我正在尝试为API 23更新我的应用程序,但遇到了同样的问题,我如何判断路径是否为外部路径?新权限系统的理念是,在真正使用权限之前,不会请求权限。很多用户可能永远不需要请求该权限,因为应用程序中还有许多其他存储位置选项(例如云存储)。出于这些原因,我不会要求每个用户都授予该权限。好吧,那么你知道答案了,只在用户使用外部存储路径时才请求该权限,不是吗?询问用户希望如何存储数据,然后询问权限。什么是“外部存储路径”?假设您有任何本地文件路径。具体什么时候需要权限?我的意思是,您将能够知道用户希望将数据存储在哪里。因此,当您第一次需要写入getExternalFileDir()时,请询问权限