MediaStore 媒体库

MediaStore是Android系统中的多媒体数据库接口,用于管理图片和视频信息。通过ContentResolver可以方便地操作MediaStore,包括获取媒体信息、缩略图以及使用特定的MediaColumns。在使用时需要设置相应的权限,并理解query()方法的参数,如selection。同时,要注意文件的移动操作和根目录的处理。使用AndroidUtilCode库可以简化相关操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MediaStore是android系统提供的一个多媒体数据库,专门用于存放多媒体信息的,通过ContentResolver即可对数据库进行操作。

  • MediaStore.Image: 存放图片信息;
  • MediaStore.Vedio: 存放视频信息;

每个内部类中都又包含了

Media      媒体信息 (MediaStore.Video.Media.EXTERNAL_CONTENT_URI)

Thumbnails    缩略信息

MediaColumns   操作字段  (MediaStore.Images.ImageColumns._ID)

权限:

清单文件:

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

application里:

 android:requestLegacyExternalStorage="true"

 java代码里:

AndroidUtilCode/README-CN.md at master · Blankj/AndroidUtilCode (github.com)https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/README-CN.md

添加工具类的依赖:

implementation 'com.blankj:utilcodex:1.31.1'
PermissionUtils.permission(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
        .callback(new PermissionUtils.FullCallback() {
            @Override
            public void onGranted(@NonNull List<String> granted) {
                mPhotoViewModel.getAllPhotoAndVideo();
            }
            @Override
            public void onDenied(@NonNull List<String> deniedForever, @NonNull List<String> denied) {
            }
        })
        .request();

使用

都是通过 ContentResolver 和 Cursor 来操作的。

MediaStore.Image

//媒体库  内置图片的uri
Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Cursor cursor = context.getContentResolver().query(uri, null, selection, selectionArgs, SORT_ORDER);

MediaStore.Vedio 

//媒体库  内置视频的uri
uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
 cursor = context.getContentResolver().query(uri, null, selection, selectionArgs, SORT_ORDER);

query()参数解析 

public final Cursor query(
	Uri uri,                //数据资源路径
	String[] projection,    //查询的列
	String selection,       //查询的条件
	String[] selectionArgs, //条件填充值
	String sortOrder){}     //排序依据
)

  String selection   

是 where后面的:
字符串要用:'' (单引号)引起来

 用数字拼接出的字符串这个不用:(单引号)如:1,2,3

name LIKE 'G%' 这个就是查询条件
如:SELECT * FROM Websites WHERE name LIKE 'G%';

selector写法:

    String selector = name + " like '" + G + "%'"

一些selector写法:

private static final String SELECTION_LOCAL =
            /**
             *MediaStore.Images.Media.DATA  是一个列,放的是文件地址
             * _data like '/storage/0/DCIM/Camera%'   %号可能是下面的图片,视频名字
             */
            MediaStore.Images.Media.DATA + " like '" + ALBUM_LOCAL_DIR.getAbsolutePath() + "%'";
String selection = MediaStore.Images.Media._ID + " in (" + ids + ")";

// _id in (383073,1831503,1831505,1831515,1831526) 
 //查询条件: id =:id        id :
            String selection = MediaStore.MediaColumns._ID + " = ?";
            Pair<PhotoEntity, Integer> pair = mPhotoRepository.FirstPicAndCount(context, null, selection, new String[]{firstCollectionDESC + ""}, null);

 

 关于根目录

*getExternalStorageDirectory 根目录
*getExternalStoragePublicDirectory  根目录下的公共目录
  File delete = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "delete");

 

关于文件移动:

FileUtils.move(photo.path, newPath)

//媒体库移动后要扫描,才会生效... 
MediaScannerConnection.scanFile(context, new String[] {photo.path}

 查询的全部代码:

@SuppressLint("Range")
public class PhotoRepository {

    //查询媒体库所有图片和视频
    //图片uri
    public List<PhotoEntity> getAllPhotoAndVideo(Context context) {
        List<PhotoEntity> result = new ArrayList<>();
        Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if (cursor != null) {

            while (cursor.moveToNext()) {
                /**
                 *     public int id;
                 *     public String path;
                 *     public boolean isFavorite;
                 *     public boolean isVideo;
                 *     public long duration;
                 */
                int id = cursor.getInt(cursor.getColumnIndex(MediaStore.Images.Media._ID));
                String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                long duration = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.DURATION));
                result.add(new PhotoEntity(id, path, false, false, 0));

            }
            cursor.close();
        }


        Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        Cursor videoCursor = context.getContentResolver().query(videoUri, null, null, null, null);
        if (videoCursor != null) {
            while (videoCursor.moveToNext()) {
                /**
                 *     public int id;
                 *     public String path;
                 *     public boolean isFavorite;
                 *     public boolean isVideo;
                 *     public long duration;
                 */
                int id = videoCursor.getInt(videoCursor.getColumnIndex(MediaStore.Images.Media._ID));
                String path = videoCursor.getString(videoCursor.getColumnIndex(MediaStore.Images.Media.DATA));
                long duration = videoCursor.getLong(videoCursor.getColumnIndex(MediaStore.Images.Media.DURATION));
                result.add(new PhotoEntity(id, path, false, true, duration));

            }
            videoCursor.close();
        }

        return result;


    }


    //查询媒体库本地和截图的图片和视频


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值