0

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

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

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

这真的让我很困惑,因为我在它之前使用了 mkdirs() 以确保文件夹存在并且我试图首先创建文件。

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

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

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

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

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

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

哦……我的头好痛!

这一切应该如何运作?我不需要相关方法的链接。我需要一个概念模型——图表真的很有帮助!


这是图表中的解决方案: 权限概念图

4

1 回答 1

0

我怎样才能回到设置我的活动?

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

请参阅此示例应用程序,它使用运行时权限从外部存储执行磁盘 I/O。权限处理逻辑被隔离在一个 中AbstractPermissionsActivity,让主活动类来处理真正的业务逻辑。

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

好吧,您应该在后台线程上执行此磁盘 I/O。您可以从onCreate().

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

于 2017-06-27T23:44:29.550 回答