麻烦概念化Android文件系统访问

时间:2017-06-27 23:37:32

标签: android file-io permissions conceptual-model

我希望我的应用在启动时自动加载文件中的数据然后为用户显示此数据的摘要。我觉得这很简单,但是......

我几乎让它工作了,但发现将数据文件放在Android Studio提供的模拟Android上会很棘手。所以我把这个文件的基本版本作为资产。我的代码检查了该文件,如果没有找到,则将文件从资产复制到手机存储。到目前为止一直很好,但后来我意识到这并不能真正满足要求,因为用户无法自定义文件(通过另一个应用程序或在手机上放置新版本的文件)。

我发现我需要使用“外部”存储(这不是外部存储,它只是共享/公共存储)。所以我使用getExternalStoragePublicDirectory()来访问Documents文件夹。在我的代码中将资产文件复制到Documents文件夹的部分,当我尝试创建目标文件时,我得到“java.io.IOException:No such file or directory”。

这真的让我感动了一段时间,因为我之前用mkdirs()来确保文件夹存在,我试图首先创建文件。

在S / O上进行了大量的讨论之后,似乎我的问题可能是我没有读取/写入Documents文件夹的权限。所以这就是我无法理解它应该如何工作的地方。

在我的Activity的OnCreate()中,我想从我的文件中加载数据。但我需要先检查权限。这可以保证第一次失败,因为用户之前从未向我的应用授予此权限。

那么我需要请求许可。但这意味着我无法再在OnCreate()方法中加载数据,因为我将在回调方法(onRequestPermissionsResult)中异步获取用户的响应。

如果用户对我的请求说“不”,我需要确保应用程序正常退出。如果她说'是',那么......什么?此时我正在回调,而我的OnCreate()方法不再运行。我怎样才能回到设置我的活动?

如果我在回调方法中加载数据文件,那只适用于用户必须授予权限的初始情况。但在那之后,我的应用程序(最有可能)不会失去许可,所以我的应用程序将不需要请求它。在这种情况下,永远不会执行回调。所以我的数据文件必须加载......在哪里?

但所有这些只有在用户运行Android 6.0或更高版本时才会发生。如果它是Android的早期版本,那么我的应用程序可以在我的Activity的OnCreate()方法中加载数据。

哦......我的头疼了!

所有这些都应该如何运作?我不需要相关方法的链接。我需要一个概念模型 - 图表真的有用!

以下是图表中的解决方案:Permissions Conceptual Diagram

1 个答案:

答案 0 :(得分:0)

  

如何重新开始设置我的活动?

将依赖于文件I / O的“设置我的活动”代码移动到单独的方法。在onCreate()中,检查您是否拥有该权限,如果有,请调用该方法来设置您的活动。如果没有,请致电requestPermissions()。在onRequestPermissionsResult()中,如果您现在拥有该权限,请调用该方法来设置您的活动。

请参阅this sample app,它使用运行时权限从外部存储执行磁盘I / O.权限处理逻辑在AbstractPermissionsActivity中被隔离,使主活动类处理真实的业务逻辑。

  

如果是早期版本的Android,那么我的应用可以在我的Activity的OnCreate()方法中加载数据。

好吧,你应该在后台线程上做这个磁盘I / O.您可以从onCreate()启动I / O.

如果您分别使用ContextCompatActivityCompat来检查和请求权限,那么您的代码将在旧设备上“做正确的事情”,因为这些类会为您进行版本检查。 / p>