文章目录
一、分区存储模式下使用 MediaStore 插入图片
二、分区存储模式下使用 MediaStore 查询图片
三、相关文档资料
Android 分区存储系列博客 :
【Android 文件管理】应用可访问的存储空间 ( 存储空间分类 | 存储空间访问权限 | 分区存储 )
【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )
【Android 文件管理】分区存储 ( MediaStore 文件操作 )
一、分区存储模式下使用 MediaStore 插入图片
在上一篇博客 【Android 文件管理】分区存储 ( MediaStore 文件操作 ) 中 , 创建了一个文本文件 , 并向其写出一个字符串 ;
创建文件时注意 , 使用 MediaStore 向 " external.db " 数据库 中插入了文件数据 , 只是生成了文件索引 , 如果不向文件中写出数据 , 并不会真正的创建文件 ; 插入数据后 , 依据返回的 android.net.Uri 类型打开输出流 , 然后通过该输出流写出数据 , 文件创建完成 ;
图片创建流程 :
首先 , 获取 操作数据库的 Uri ;
// 操作 external.db 数据库 // 获取 Uri 路径 var uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
其次 , 构造插入数据库的 ContentValues 数据结构 , 设置的 “external.db” 数据库中的 “files” 数据表的各个字段与 MediaStore 中的常量对应关系如下 :
MediaStore.Downloads.RELATIVE_PATH : relative_path MediaStore.Downloads.DISPLAY_NAME : display_ame MediaStore.Downloads.TITLE : tittle MediaStore.Downloads.MIME_TYPE : mime_type // 将要新建的文件的文件索引插入到 external.db 数据库中 // 需要插入到 external.db 数据库 files 表中, 这里就需要设置一些描述信息 var contentValues: ContentValues = ContentValues() // 设置插入 external.db 数据库中的 files 数据表的各个字段的值 // 设置存储路径 , files 数据表中的对应 relative_path 字段在 MediaStore 中以常量形式定义 contentValues.put(MediaStore.Downloads.RELATIVE_PATH, "${Environment.DIRECTORY_MOVIES}/image") // 设置文件名称 contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "image.jpg") // 设置文件标题, 一般是删除后缀, 可以不设置 contentValues.put(MediaStore.Downloads.TITLE, "image") // 设置 MIME_TYPE contentValues.put(MediaStore.Downloads.MIME_TYPE, "image/jpg")
再次 , 获取该上下文对应的 ContentResolver , 调用 insert 方法 , 将上述构建的 ContentValues 插入到数据库中 , 返回 Uri ;
// uri 表示操作哪个数据库 , contentValues 表示要插入的数据内容 var insert: Uri = contentResolver.insert(uri, contentValues)!!
最后 , 根据插入数据返回的 Uri , 打开输出流 , 然后向输出流中写出图片数据 ;
// 向 Download/hello/hello.jpg 文件中插入数据 var os: OutputStream = contentResolver.openOutputStream(insert)!! var bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.icon) bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os) os.close()
图片数据写出完成 , 输出流正式关闭 , 图片创建成功 ;
创建完成后 , 可以在 " Device Explorer " 面板中显示新创建的图片 ;
关于 图片 MIME_TYPE :
图片文件创建 与 文本文件创建 唯一的区别就是需要设置 MIME_TYPE 字段 , 根据传入的图片格式设置不同的 mimetype , 如 : 传入 jpeg 图片 , 则设置字段值为 “image/jpg” ;
保存图片文件时 , 传入的 MIME_TYPE 为 “image/jpg” , 如果传错了 , 写成 “vedio/mp3” , 创建文件时不会抛出异常 , 但是使用该文件时会出错 ;
图片创建部分代码示例 :
/** * 创建图片文件 * 在 Download 目录下创建 hello.txt */ fun createImageFile(){ // 操作 external.db 数据库 // 获取 Uri 路径 var uri: Uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI // 将要新建的文件的文件索引插入到 external.db 数据库中 // 需要插入到 external.db 数据库 files 表中, 这里就需要设置一些描述信息 var contentValues: ContentValues = ContentValues() // 设置插入 external.db 数据库中的 files 数据表的各个字段的值 // 设置存储路径 , files 数据表中的对应 relative_path 字段在 MediaStore 中以常量形式定义 contentValues.put(MediaStore.Downloads.RELATIVE_PATH, "${Environment.DIRECTORY_MOVIES}/image") // 设置文件名称 contentValues.put(MediaStore.Downloads.DISPLAY_NAME, "image.jpg") // 设置文件标题, 一般是删除后缀, 可以不设置 contentValues.put(MediaStore.Downloads.TITLE, "image") // 设置 MIME_TYPE contentValues.put(MediaStore.Downloads.MIME_TYPE, "image/jpg") // uri 表示操作哪个数据库 , contentValues 表示要插入的数据内容 var insert: Uri = contentResolver.insert(uri, contentValues)!! // 向 Download/hello/hello.jpg 文件中插入数据 var os: OutputStream = contentResolver.openOutputStream(insert)!! var bitmap: Bitmap = BitmapFactory.decodeResource(resources, R.drawable.icon) bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os) os.close() }