基本操作
在目前版本下,可以获取到设备目录的一些API如下:
1 | val addr1 = context.filesDir.absolutePath |
打印一下结果
1 | dir1: /data/user/0/$packagename/files |
先下结论:addr3
是我们熟悉的地址,但在新的app里面很可能用不了了(不推荐使用),后面讨论。这里推荐使用addr1
和addr2
的方式进行存储.
分区存储
造成这一切的原因是Android从10开始的分区存储配置,接下来我们根据targetAPI版本进行讨论
API 28(Android9)及以下
如果应用的配置在这一范围内,那么开发者将无需为存储位置而烦恼,对于需要存储在应用外部,甚至不希望应用卸载时候被删除的数据,可以任意操纵Environment.getExternalStorageDirectory()
下的目录及文件,代价仅仅是向系统申请android.permission.READ_EXTERNAL_STORAGE
权限
targetAPI是23(6.0)以上的工程,记得先动态申请用户权限
API 29(Android10)
在这一级别的工程里,如果直接调用如下代码:
1 | try{ |
以上代码mkdir
将返回false
createNewFile
将会打印出一个Exception:java.io.IOException: No such file or directory
。
但google在这里给了开发者一点缓冲的时间,只要在app mainfest中加入 android:requestLegacyExternalStorage="true"
app的访问外部存储行为可以保持在API 29
以下,不受分区存储要求限制
API 30(Android11)及以上
在这一版本及以上,APP将被强制使用分区存储,推荐使用context.fileDir
:获取APP的内部存储空间(即data/data/{packagename}/files
)context.getExternalFilesDir
:获取APP的外部存储空间(即/storage/emulated/0/Android/data/{packagename}/files
)