Android Q(Android 10)
之前,需要添加权限,如下:
1 2 |
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> |
Android Q(Android 10)
开始 在App
专属目录下本App
可以随意操作,无需申请权限,不过App
专属目录会在App
卸载时跟随删除。看下面几个目录(通过Application
的context
就可以访问)。
- getFilesDir() :/data/user/0/本应用包名/files
- getCacheDir():/data/user/0/本应用包名/cache
- getExternalFilesDir(null):/storage/emulated/0/Android/data/本应用包名/files
- getExternalCacheDir():/storage/emulated/0/Android/data/本应用包名/cache
getFilesDir
和getCacheDir
是在手机自带的一块存储区域(internal storage
),通常比较小,SD
卡取出也不会影响到,App
的sqlite
数据库和SharedPreferences
都存储在这里。所以这里应该存放特别私密重要的东西。
getExternalFilesDir
和getExternalCacheDir
是在SD
卡下(external storage
),在sdcard/Android/data/包名/files
和sdcard/Android/data/包名/cache
下,会跟随App
卸载被删除。
files
和cache
下的区别是,在手机设置-找到本应用-在存储中,点击清除缓存,cache
下的文件会被删除,files
下的文件不会。
谷歌推荐使用getExternalFilesDir
。我们项目的下载是个本地功能,下载完成后是存本地数据库的,不是放网络上的,所以下载的音视频都放到了这下面,项目卸载时跟随App都删除了。getExternalFilesDir
方法需要传入一个参数,传入null
时得到就是sdcard/Android/data/包名/files
,传入其他字符串比如"Picture"得到sdcard/Android/data/包名/files/Picture
。
参考代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
/** * 获取app缓存路径 * * @param context Application Context * @return 缓存路径 */ @NonNull public static String getCacheDir(Context context) { String cacheDir; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) { //外部存储可用 final File file = context.getExternalCacheDir(); if (null == file) { cacheDir = context.getCacheDir().getPath(); } else { cacheDir = file.getPath(); } } else { //外部存储不可用 cacheDir = context.getCacheDir().getPath(); } return cacheDir; } /** * 获取app文件路径 * * @param context Application Context * @return app文件路径 */ @NonNull public static String getFilesDir(Context context) { String filesDir; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) { //外部存储可用 final File file = context.getExternalFilesDir(null); if (null == file) { filesDir = context.getFilesDir().getPath(); } else { filesDir = file.getPath(); } } else { //外部存储不可用 filesDir = context.getFilesDir().getPath(); } return filesDir; } |