我希望我的应用自动从启动&然后为用户显示此数据的摘要。我认为这很简单,但是...
我几乎让它起作用了,但是发现将数据文件放在Android Studio提供的模拟Android上会很棘手。因此,我将文件的基本版本作为资产放在软件包中。我的代码检查了该文件,如果找不到的话,将文件从资产复制到电话存储。到目前为止,一切都很好,但是我意识到这并没有真正满足要求,因为用户无法自定义文件(通过另一个应用程序或通过在手机上放置新版本的文件(。
我发现我需要使用"外部"存储(这不是外部的,它只是共享/公共存储(。因此,我使用getExternalStoragePublicDirectory((获取对文档文件夹的访问。在将资产文件复制到文档文件夹的代码的一部分中,我在尝试创建目标文件时获得了" java.io.io exception:no这样的文件或目录"。
这确实使我扔了一段时间,因为我已经在mkdirs((之前先确保了文件夹(s(,并且我试图首先创建文件。
在S/O上进行了大量戳戳之后,我的问题似乎是我没有权限可以在文档文件夹中读/写。因此,这是我无法确定应该如何工作的地方。
在我的活动的onCreate((中,我想从文件中加载数据。但是我需要先检查权限。这可以保证第一次失败,因为用户以前从未授予过我的应用程序。
因此,我需要请求许可。但这意味着我无法再将数据加载到ongreate((方法中,因为我将以回调方法(onrequestpermissionsresult(从异步获得用户的响应。
如果用户对我的请求说"不",我需要确保应用程序优雅地退出。如果她说"是",那...什么?在这一点上,我在回调中,我的ongreate((方法不再运行。我如何重新设置我的活动?
如果我将数据文件加载到回调方法中,则仅适用于用户必须授予权限的初始情况。但是之后,我的应用程序(很可能(不会丢失许可,因此我的应用程序无需要求它。在这种情况下,将永远不会执行回调。因此我的数据文件必须加载...
在哪里?但是,所有这些仅在用户运行Android 6.0或更高时才发生。如果它是Android的较早版本,那么我的应用程序可以将数据加载到我的活动的ongreate((方法中。
哦...我的头很痛!
所有这些应该如何工作?我不需要指向相关方法的链接。我需要一个概念模型 - 图确实会有所帮助!
这是图中的解决方案:权限概念图
我该如何重新设置我的活动?
将取决于文件I/O的"设置我的活动"代码移至单独的方法。在onCreate()
中,检查是否有许可,如果您这样做,请调用该方法来设置您的活动。如果没有,请致电requestPermissions()
。在onRequestPermissionsResult()
中,如果您现在有权限,请调用该方法设置您的活动。
请参阅此示例应用程序,该应用使用运行时权限从外部存储中执行磁盘I/O。许可处理逻辑是在AbstractPermissionsActivity
中隔离的,使主要活动类别以处理真实的业务逻辑。
如果它是Android的较早版本,那么我的应用程序可以将数据加载到我的活动的onCreate((方法中。
好吧,您应该在背景线程上进行此磁盘I/O。您可以从onCreate()
开始i/o。
如果您使用的是ContextCompat
和ActivityCompat
来检查和请求权限,则您的代码将在较旧的设备上"做正确的事情",因为这些类别为您进行版本检查。