一挂脑、MediaStore簡介
MediaStore是android系統(tǒng)提供的一個多媒體數(shù)據(jù)庫宠页,專門用于存放多媒體信息的胁塞,通過ContentResolver即可對數(shù)據(jù)庫進行操作碘举。
MediaStore.Files: 共享的文件,包括多媒體和非多媒體信息
MediaStore.Audio: 存放音頻信息
MediaStore.Image: 存放圖片信息
MediaStore.Vedio: 存放視頻信息
每個內(nèi)部類中都又包含了Media,Thumbnails和相應的MediaColumns格侯,分別提供了媒體信息岭辣,縮略信息和 操作字段吱晒。
二、MediaStore使用
都是通過 ContentResolver 和 Cursor 來操作的沦童。
2.1仑濒、MediaStore.Files
2.1.1叹话、查詢所有類型文件
/**
* 獲取所有文件
**/
public static List<FileEntity> getFilesByType(Context context) {
List<FileEntity> files = new ArrayList<>();
// 掃描files文件庫
Cursor c = null;
try {
mContentResolver = context.getContentResolver();
c = mContentResolver.query(MediaStore.Files.getContentUri("external"), null, null, null, null);
int columnIndexOrThrow_ID = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns._ID);
int columnIndexOrThrow_MIME_TYPE = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE);
int columnIndexOrThrow_DATA = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA);
int columnIndexOrThrow_SIZE = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE);
// 更改時間
int columnIndexOrThrow_DATE_MODIFIED = c.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_MODIFIED);
int tempId = 0;
while (c.moveToNext()) {
String path = c.getString(columnIndexOrThrow_DATA);
String minType = c.getString(columnIndexOrThrow_MIME_TYPE);
LogUtil.d("FileManager", "path:" + path);
int position_do = path.lastIndexOf(".");
if (position_do == -1) {
continue;
}
int position_x = path.lastIndexOf(File.separator);
if (position_x == -1) {
continue;
}
String displayName = path.substring(position_x + 1, path.length());
long size = c.getLong(columnIndexOrThrow_SIZE);
long modified_date = c.getLong(columnIndexOrThrow_DATE_MODIFIED);
File file = new File(path);
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified()));
FileEntity info = new FileEntity();
info.setName(displayName);
info.setPath(path);
info.setSize(ShowLongFileSzie(size));
info.setId((tempId++) + "");
info.setTime(time);
files.add(info);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
return files;
}
2.1.2、指定獲取的文件字段
String[] columns = new String[]{MediaStore.Files.FileColumns._ID, MediaStore.Files.FileColumns.MIME_TYPE, MediaStore.Files.FileColumns
.SIZE, MediaStore.Files.FileColumns.DATE_MODIFIED, MediaStore.Files.FileColumns.DATA};
c = mContentResolver.query(MediaStore.Files.getContentUri("external"), columns, null, null, null);
2.1.3墩瞳、根據(jù)文件夾的名稱查詢
//查找文件夾ScreenRecord下的文件
c = mContentResolver.query(MediaStore.Files.getContentUri("external"), null, MediaStore.Video.Media.BUCKET_DISPLAY_NAME+"=?", "ScreenRecord", null);
2.1.4驼壶、查詢指定類型的文件
String select = "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%.doc'" + " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.docx'" + ")";
c = mContentResolver.query(MediaStore.Files.getContentUri("external"), null, select , null, null);
2.1.5、指定排序類型喉酌,如根據(jù)id倒序查詢
c = mContentResolver.query(MediaStore.Files.getContentUri("external"), null, null, null, MediaStore.Files.FileColumns._ID+"DESC");
2.2歉井、MediaStore.Audio
2.2.1挟纱、查詢音頻文件
c = mContentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
2.3、MediaStore.Image
2.3.1、查詢圖片文件
c = mContentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
2.4虚茶、MediaStore.Vedio
2.4.1、查詢視頻文件
/**
* 獲取視頻文件
**/
public static List<FileEntity> getFilesByVideo(Context context) {
List<FileEntity> files = new ArrayList<>();
// 掃描files文件庫
Cursor c = null;
try {
mContentResolver = context.getContentResolver();
c = mContentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
int columnIndexOrThrow_ID = c.getColumnIndexOrThrow(MediaStore.Video.Media._ID);
int columnIndexOrThrow_MIME_TYPE = c.getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE);
int columnIndexOrThrow_DATA = c.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
int columnIndexOrThrow_SIZE = c.getColumnIndexOrThrow(MediaStore.Video.Media.SIZE);
// 更改時間
int columnIndexOrThrow_DATE_MODIFIED = c.getColumnIndexOrThrow(MediaStore.Video.Media.DATE_MODIFIED);
int tempId = 0;
while (c.moveToNext()) {
String path = c.getString(columnIndexOrThrow_DATA);
String minType = c.getString(columnIndexOrThrow_MIME_TYPE);
LogUtil.d("FileManager", "path:" + path);
int position_do = path.lastIndexOf(".");
if (position_do == -1) {
continue;
}
int position_x = path.lastIndexOf(File.separator);
if (position_x == -1) {
continue;
}
String displayName = path.substring(position_x + 1, path.length());
long size = c.getLong(columnIndexOrThrow_SIZE);
long modified_date = c.getLong(columnIndexOrThrow_DATE_MODIFIED);
File file = new File(path);
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified()));
FileEntity info = new FileEntity();
info.setName(displayName);
info.setPath(path);
info.setSize(ShowLongFileSzie(size));
info.setId((tempId++) + "");
info.setTime(time);
files.add(info);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
c.close();
}
}
return files;
}
2.5秩彤、query()參數(shù)解析:
public final Cursor query(
Uri uri, //數(shù)據(jù)資源路徑
String[] projection, //查詢的列
String selection, //查詢的條件
String[] selectionArgs, //條件填充值
String sortOrder){} //排序依據(jù)
2.6肛冶、數(shù)據(jù)庫字段
MediaStore 提供了所有數(shù)據(jù)庫中的字段宏定義,操作起來十分方便。
比如:
INTERNAL_CONTENT_URI; //內(nèi)部庫URI
EXTERNAL_CONTENT_URI; //外部庫URI
CONTENT_TYPE; //內(nèi)容提供者類型
DEFAULT_SORT_ORDER; //排序方式
MediaStore.Files沒有EXTERNAL_CONTENT_URI突诬,所以只能用getContentUri()自行獲取苫拍,得出的URI其實是Uri.parse("content://media/external/files")
這個不難理解,以MediaStore.Images.Media為例攒霹,其URI有三種寫法:
Uri uri1 = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
Uri uri2 = MediaStore.Images.Media.getContentUri("external");
Uri uri3 = Uri.parse("content://media/external/images/media");