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代码里:
添加工具类的依赖:
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;
}
//查询媒体库本地和截图的图片和视频
}