适配Android Q 分区存储/文件沙盒

在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");

//播放单个视频的示例
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值