Android之MediaStore使用 (查找 音乐/视频/文档/自定义类型文件.apk .zip 等)

在日常开发中,我们经常会使用MediaStore来获取手机的音频、图片、视频等相关信息。下面3个是常见的内部类:

MediaStore.Audio 获取音频信息的类

MediaStore.Images 获取图片信息

MediaStore.Video 获取视频信息

query和sql的插叙语句差不多   里面有5个参数

getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
        mediaColumns, null, null, null);

第一个参数,uri,rui是什么呢?好吧,上面我们提到了Android提供内容的叫Provider,那么在Android中怎么区分各个Provider?有提供联系人的,有提供图片的等等。所以就需要有一个唯一的标识来标识这个Provider,Uri就是这个标识,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供联系人的内容提供者,可惜这个内容提供者提供的数据很少。

第二个参数,projection,真不知道为什么要用这个单词,这个参数告诉Provider要返回的内容(列Column)

第三个参数,selection,设置条件,相当于SQL语句中的where。null表示不进行筛选。

第四个参数  selectionArgs,这个参数是要配合第三个参数使用的,如果你在第三个参数里面有?,那么你在selectionArgs写的数据就会替换掉?

第五个参数,sortOrder,按照什么进行排序,相当于SQL语句中的Order by

 

我已经写好几个用来经常查询的方法 直接粘贴使用

 

    /**
     * 查找视频文件
     *
     * @param context
     * @return
     */
    public static ArrayList<VideoBeam> getVideoList(Context context) {
        ArrayList<VideoBeam> sysVideoList = new ArrayList<>();
        // MediaStore.Video.Thumbnails.DATA:视频缩略图的文件路径
        String[] thumbColumns = {MediaStore.Video.Thumbnails.DATA,
                MediaStore.Video.Thumbnails.VIDEO_ID};
        // 视频其他信息的查询条件
        String[] mediaColumns = {MediaStore.Video.Media._ID, MediaStore.Video.Media.SIZE,
                MediaStore.Video.Media.DATA, MediaStore.Video.Media.TITLE,
                MediaStore.Video.Media.MIME_TYPE, MediaStore.Video.Media.DURATION,
                MediaStore.Video.Media.DATE_TAKEN,};

        Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media
                        .EXTERNAL_CONTENT_URI,
                mediaColumns, null, null, null);

        if (cursor == null) {
            return sysVideoList;
        }
        if (cursor.moveToFirst()) {
            do {
                VideoBeam info = new VideoBeam();
                int id = cursor.getInt(cursor
                        .getColumnIndex(MediaStore.Video.Media._ID));
                Cursor thumbCursor = context.getContentResolver().query(
                        MediaStore.Video.Thumbnails.EXTERNAL_CONTENT_URI,
                        thumbColumns, MediaStore.Video.Thumbnails.VIDEO_ID
                                + "=" + id, null, null);
                if (thumbCursor.moveToFirst()) {
                    info.setThumbPath(thumbCursor.getString(thumbCursor
                            .getColumnIndex(MediaStore.Video.Thumbnails.DATA)));
                }
                info.setFilePath(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media
                        .DATA)));
                info.setMimeType(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Vi
Android 11 (API 级别 30) 及以上版本中,为了保护用户的隐私和数据安全,Android 增强了对应用程序访问存储空间的限制。在应用程序中,如果需要访问存储空间中的文件,需要使用 MediaStore API 来进行操作。以下是使用 MediaStore API 重命名存储空间(storage/emulated/0/DCIM)路径下的文件的示例代码: ```java ContentResolver resolver = getContentResolver(); String oldFilePath = "/storage/emulated/0/DCIM/old_file_name.jpg"; String newFilePath = "/storage/emulated/0/DCIM/new_file_name.jpg"; Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; String selection = MediaStore.Images.Media.DATA + "=?"; String[] selectionArgs = new String[] { oldFilePath }; ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATA, newFilePath); int rows = resolver.update(uri, values, selection, selectionArgs); if (rows > 0) { // 重命名成功 } else { // 重命名失败 } ``` 其中,resolver 表示 ContentResolver 对象,oldFilePath 表示原文件的路径,newFilePath 表示新文件的路径。首先,使用 ContentResolver.query() 方法来查询存储空间中原文件对应的 Uri,然后使用 ContentResolver.update() 方法来更新该 Uri 对应的文件名,该方法返回一个 int 类型的值,表示更新的行数。如果更新成功,则 oldFilePath 对应的文件名会被修改为 newFilePath 对应的文件名,否则文件名不变。 需要注意的是,为了访问存储空间中的文件,需要在 AndroidManifest.xml 文件中添加如下权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 同时,在 Android 10 (API 级别 29) 及以上版本中,需要在 AndroidManifest.xml 文件中添加如下代码,以保证应用程序能在后台访问存储空间: ```xml <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> ``` 另外,需要注意的是,对于存储空间中的文件,如果用户使用了其他应用程序进行编辑或删除等操作,那么该文件对应的 Uri 也会发生相应的变化,因此在使用 MediaStore API 操作文件时需要特别注意。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jonly_W

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值