Android Q 中的多媒体文件访问策略详解
104 浏览量
更新于2024-08-28
收藏 117KB PDF 举报
"Android Q 沙箱适配多媒体文件的小结主要涉及在Android Q系统中,由于安全性的提升,应用程序对多媒体文件的访问模式发生了变化。在新的Android版本中,应用需要适配新的沙箱机制,尤其是对外部媒体文件(如照片、视频和图片)的扫描、读取和写入操作。
在Android Q中,外部媒体文件的扫描依然通过`MediaStore`接口进行。`MediaStore`是一个系统提供的多媒体数据库,存储着设备上的音频、视频和图像信息。以下是一个示例代码,展示了如何查询本地视频信息:
```java
protected List<VideoInfo> doInBackground(Void... params) {
mContentResolver = context.getContentResolver();
String[] mediaColumns = {
MediaStore.Video.Media._ID,
MediaStore.Video.Media.DATA,
MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.DISPLAY_NAME,
MediaStore.Video.Media.SIZE,
MediaStore.Video.Media.DATE_ADDED,
MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.WIDTH,
MediaStore.Video.Media.HEIGHT
};
Cursor cursor = mContentResolver.query(
MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
mediaColumns,
null, null, MediaStore.Video.Media.DATE_ADDED
);
if (cursor == null) {
return null;
}
// 在Android Q中,MediaStore.Video.Media.DATA不再提供有效的文件路径
int ixData = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
int ixMime = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE);
...
}
```
在上述代码中,我们看到通过`ContentResolver`查询`MediaStore.Video.Media.EXTERNAL_CONTENT_URI`来获取视频信息。然而,需要注意的是,在Android Q及更高版本中,`MediaStore.Video.Media.DATA`字段不再提供可访问的文件路径,因为文件现在被隔离在应用的私有沙箱内。因此,应用不能直接使用这个字段来访问文件,而应该使用`ContentResolver`和`Uri`来操作文件。
对于读取多媒体文件,Android Q引入了`DocumentFile`类,它允许应用以安全的方式操作文件,包括创建、删除、重命名等。例如,要读取一个文件,应用需要先获取到对应的`Uri`,然后使用`ContentResolver.openInputStream()`打开输入流进行读取。
写入操作同样受到影响。在Android Q之前,应用可以直接写入外部存储的文件,但现在需要通过`ContentResolver`的`openOutputStream()`方法获取输出流,然后写入数据。在写入完成后,系统会自动更新`MediaStore`中的元数据。
此外,对于权限管理,Android Q要求应用需要`MANAGE_EXTERNAL_STORAGE`权限才能访问所有外部存储空间的文件,否则只能访问自己创建或修改的文件。在目标API级别29及以上时,开发者需要考虑适配这一权限变更,以确保应用在新系统上的正常运行。
总结起来,Android Q的沙箱机制对多媒体文件的处理提出了新的挑战,开发者需要调整代码,使用`MediaStore`、`ContentResolver`和`DocumentFile`等工具来适应这些变化,同时确保符合最新的权限管理规定,以保证应用在新平台上的兼容性和安全性。"
180 浏览量
2021-05-26 上传
2022-11-21 上传
2013-08-17 上传
2021-05-27 上传
2021-05-21 上传
2021-02-18 上传
2021-05-20 上传
2020-08-25 上传
weixin_38562085
- 粉丝: 6
- 资源: 964
最新资源
- 基于Python和Opencv的车牌识别系统实现
- 我的代码小部件库:统计、MySQL操作与树结构功能
- React初学者入门指南:快速构建并部署你的第一个应用
- Oddish:夜潜CSGO皮肤,智能爬虫技术解析
- 利用REST HaProxy实现haproxy.cfg配置的HTTP接口化
- LeetCode用例构造实践:CMake和GoogleTest的应用
- 快速搭建vulhub靶场:简化docker-compose与vulhub-master下载
- 天秤座术语表:glossariolibras项目安装与使用指南
- 从Vercel到Firebase的全栈Amazon克隆项目指南
- ANU PK大楼Studio 1的3D声效和Ambisonic技术体验
- C#实现的鼠标事件功能演示
- 掌握DP-10:LeetCode超级掉蛋与爆破气球
- C与SDL开发的游戏如何编译至WebAssembly平台
- CastorDOC开源应用程序:文档管理功能与Alfresco集成
- LeetCode用例构造与计算机科学基础:数据结构与设计模式
- 通过travis-nightly-builder实现自动化API与Rake任务构建