文章目录
在2019年10月份Android Q正式发布了,新增文件沙盒系统。在Android Q的机器上,并且使用了target 为29以上Android SDK版本,任何非沙盒/sdcard/*或者Environment.getExternalStorageDirectory()的目录都无法创建和访问文件。
1. 沙盒文件目录
1.1外部沙盒
对应目录/storage/emulated/0/Android/data/包名/
等同于目录/sdcard/Android/data/包名/
//获取路径/storage/emulated/0/Android/data/包名/files
context.getExternalFilesDirs("")
//获取路径/storage/emulated/0/Android/data/包名/cache
//此目录可以放一些临时文件,在退出应用的时候清空,避免应用大小越来越大
context.getExternalCacheDir()
//获取路径/sdcard/Android/data/包名/
Environment.getExternalStorageDirectory() + File.separator + "Android" + File.separator + "data" + File.separator + "包名" + File.separator;
1.2内部沙盒
这个目录就是data/data/包名,在之前android手机sdcard都需要额外安装的时候手机内置的一个很小的存储空间内。
这个目录在没有root的手机上无法通过adb命令访问,root后或者部分手机厂商有修改的情况下通过adb可以获取权限
//获取路径/data/user/0/包名/files 等同于/data/data/包名/files
context.getFilesDir()
//这种方式也可以 获取路径/data/data/包名/files
new File("/data/data/包名/files")
外部文件只能访问应用沙盒下的文件,即目录getExternalFilesDirs(),文件的适配我们只需要将 /sdcard/*和Environment.getExternalStorageDirectory()目录替换为getExternalFilesDirs()就可以正常访问了
文件沙盒会随着应用的卸载一起删除。在应用设置界面,清除存储空间的时候会清空沙盒内的所有文件,清除缓存的时候不会删除沙盒的文件。
2. 媒体文件的访问
2.1 访问视频
- 访问媒体视频
//查询手机内的全部视频
Cursor videoCursor = mResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, new String[] {
MediaStore.Video.Media.DATA,
MediaStore.Video.Media._ID,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.DATE_ADDED,
}, String.format("%1$s IN (?, ?, ? ,?,?,?,?) AND %2$s > %3$d AND %2$s < %4$d",
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.DURATION, mMinVideoDuration, mMaxVideoDuration), new String[] {
"video/mp4",
"video/ext-mp4",
"video/quicktime",//部分oppo手机会记录这个mp4的格式
"video/x-flv",
"video/flv",
"video/3gpp",
"video/mov"
}, MediaStore.Video.Media.DATE_ADDED + " DESC");
//播放单个视频的示例