从mediapicker源码分析到系统URI查询

公司的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,你根据这个路径去查询就可以了,下面进入代码时间:

  1. 查询对应数据库的字段
  2. 根据上面的字段,查询你需要的信息
//查询每一列的字段
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());
    }

贴一下查询结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值