公司的DEMO用到了mediapicker第三方库,因为之前做的时候都是调用系统本身的,没有深入关注。所以这次点进去看看源码。github地址
首先介绍一下它的使用,很简单:
先把他们的项目下载到本地,然后引入到你的项目里就可以了。
具体使用代码:
MediaOptions.Builder builder = new MediaOptions.Builder();
MediaOptions options = builder.selectVideo().canSelectMultiVideo(true).build();
MediaPickerActivity.open(MainActivity.this, REQUEST_MEDIA, options);
很简单的一个跳转,还可以根据canSelectMultiVideo设置是否可以选择多张。
看一下源码:
很简单的结构,其中activity不参与业务处理,都放在了fragment里面。
具体的选择和展示都是属于业务逻辑,咱们这里主要看我们需要的信息是怎么获取的。
主要逻辑都在MediaPickerFragment里面:
然后就到了我们今天说的重点:
Images.Media.EXTERNAL_CONTENT_URI
Video.Media.EXTERNAL_CONTENT_URI
这两个都是系统提供的URI,更多请查看:Android 自带的一些系统查询用URI
其实就是系统已经把你需要的图片视频等信息给你放到了一个数据库了面,上面的是数据库的URI,你根据这个路径去查询就可以了,下面进入代码时间:
- 查询对应数据库的字段
- 根据上面的字段,查询你需要的信息
//查询每一列的字段
private void getUriColumns(Uri uri) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
String[] columns = cursor.getColumnNames();
for (String string : columns) {
Log.e("1234", cursor.getColumnIndex(string) + " = " + string);
}
getUriData(uri);
}
我这里传入的URI是MediaStore.Video.Media.EXTERNAL_CONTENT_URI,查询的是视频的相关信息:
然后我们根据上面的字段,对数据库进行查询,获取你需要的信息就可以了。
private void getUriData(Uri uri) {
String[] projection = {"_data", "_display_name", "_size", "mime_type", "title", "language"};
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
cursor.moveToFirst();
do {
System.out.println("_data = " + cursor.getString(cursor.getColumnIndex("_data")));
System.out.println("_display_name = " + cursor.getString(cursor.getColumnIndex("_display_name")));
System.out.println("_size = " + cursor.getString(cursor.getColumnIndex("_size")));
System.out.println("mime_type = " + cursor.getString(cursor.getColumnIndex("mime_type")));
System.out.println("title = " + cursor.getString(cursor.getColumnIndex("title")));
System.out.println("language = " + cursor.getString(cursor.getColumnIndex("language")));
}
while (cursor.moveToNext());
}
贴一下查询结果: