我希望我的应用程序在启动时自动从文件中加载数据,然后为用户显示这些数据的摘要。我以为这很简单,但是...
我几乎让它工作了,但发现将数据文件放在 Android Studio 提供的模拟 Android 上会很棘手。因此,我将文件的基本版本作为资产放入包中。我的代码检查了文件,如果没有找到,将文件从资产复制到手机存储。到目前为止一切顺利,但后来我意识到这并没有真正满足要求,因为用户无法自定义文件(通过另一个应用程序或将文件的新版本放在她的手机上)。
我发现我需要使用“外部”存储(这不是真正的外部,它只是共享/公共存储)。所以我使用 getExternalStoragePublicDirectory() 来访问 Documents 文件夹。在将资产文件复制到 Documents 文件夹的代码部分中,当我尝试创建目标文件时,我得到“java.io.IOException:没有这样的文件或目录”。
这真的让我很困惑,因为我在它之前使用了 mkdirs() 以确保文件夹存在并且我试图首先创建文件。
在 S/O 上进行了大量研究之后,似乎我的问题可能是我没有权限在 Documents 文件夹中读取/写入。所以这就是我无法理解它应该如何工作的地方。
在我的 Activity 的 OnCreate() 中,我想从我的文件中加载数据。但我需要先检查权限。这保证第一次失败,因为用户之前从未授予我的应用此权限。
那么我需要请求许可。但这意味着我不能再在 OnCreate() 方法中加载我的数据,因为我将在回调方法 (onRequestPermissionsResult) 中异步获取用户的响应。
如果用户对我的请求说“不”,我需要确保应用程序正常退出。如果她说“是”,那么……什么?此时我处于回调中,并且我的 OnCreate() 方法不再运行。我怎样才能回到设置我的活动?
如果我在回调方法中加载数据文件,那仅适用于用户必须授予权限的初始情况。但在那之后,我的应用程序(很可能)不会失去权限,所以我的应用程序不需要请求它。在这种情况下永远不会执行回调。所以我的数据文件必须加载......在哪里?
但所有这些只有在用户运行 Android 6.0 或更高版本时才会发生。如果它是早期版本的 Android,那么我的应用程序可以在我的 Activity 的 OnCreate() 方法中加载数据。
哦……我的头好痛!
这一切应该如何运作?我不需要相关方法的链接。我需要一个概念模型——图表真的很有帮助!
这是图表中的解决方案: 权限概念图