MediaStore

(一)概述

MediaStore 是 Android 系统提供的一个用于管理多媒体文件(如图片、视频、音频)信息的数据库,它提供对设备上媒体文件的访问和管理功能。
通过 MediaStore,应用程序可以查询、插入、更新和删除设备上的媒体文件信息,而无需直接读取文件系统。
这样做可以更安全、更高效地处理媒体文件,并能够适应 Android 系统不同版本的变化。

MediaStore 主要包含以下几个重要的类和常量:

  1. MediaStore.ImagesMediaStore.VideoMediaStore.Audio:分别用于访问图片、视频和音频文件的信息。

  2. MediaStore.Images.MediaMediaStore.Video.MediaMediaStore.Audio.Media:内部类,定义了访问每种媒体文件信息的列名和 Uri。

  3. MediaStore.Files.FileColumns:定义了媒体文件通用的列名称,如文件名称、文件大小、文件路径等。

  4. MediaStore.Audio.MediaColumnsMediaStore.Video.MediaColumnsMediaStore.Images.ImageColumns:分别定义了音频、视频、图片文件的列名称。

通过 MediaStore,应用程序可以执行诸如查询媒体文件信息、列出设备上的媒体文件、获取文件 Uri、获取媒体文件的缩略图等操作。例如,可以通过 MediaStore 查询设备中所有图片的信息,包括文件名、路径、大小等,然后在应用界面显示出来。

需要注意的是,从 Android 10(API 级别 29)开始,Android 引入了存储访问框架(Scoped Storage),这对应用程序访问外部存储中的文件带来了一些限制和变化。开发者在使用 MediaStore 时需注意不同 API 级别下的变化,以保证应用程序的兼容性和正确性。


2、MediaStore在哪里?
使用一个root过的手机,或者第三方模拟器,我们可以找到data/data这个路径

找到/data/data/ com.android.providers.media,里面database里存放着两个数据库:
external.db和internal.db,这就是 MediaStore 数据库的本体。

(二)从 MediaStore 获取数据

在 Manifest 中添加权限

1
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

这样还不够,由于到Android 10为止,READ_EXTERNAL_STORAGE 已经被列为危险权限,所以我们需要在运行时动态获取该权限。

1
2
3
4
5
//ContextCompat.checkSelfPermission()函数,接受两个参数:Context和权限名,返回值等于PackageManager.PERMISSION_GRANTED时说明同意授权
if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
//请求授权,接受三个参数:Activity实例;请求权限名的String数组;请求码(唯一值即可)
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), 1)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MainActivity : AppCompatActivity() {
private lateinit var writePermissionLauncher: ActivityResultLauncher<String>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)


writePermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()){
Log.v("pxd","获取权限结果:$it")
}
checkPermission()
}

fun checkPermission(){
if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
writePermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}
}
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信