android视频处理一:获取手机视频

奋斗之后,我们不一定成功,但是绝对不会后悔。

  1. 获取手机视频数据
  2. 子线程处理
  3. 防重复加载方法的优化

获取手机数据

在手机内部,任何功能都是以程序处理的。在使用手机多媒体内容的时候,凡事存储在手机中的,在手机中有媒体扫描器,会扫描手机内部的数据,生成相应数据库。

在root下的手机,我们可以直接查看相应内容

data/data/com.android.providers.media/databases

截图:

通过内容提供者进行获取数据内容:

/**

获取手机中视频内容

关键代码
*/

private void getdata(){

    Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URL;

    String[] projections = {
                MediaStore.Video.Media.DISPLAY_NAME,//名称
                MediaStore.Video.Media.DURATION,//时长
                MediaStore.Video.Media.SIZE,//大小
                MediaStore.Video.Media.DATA,//路径
            };

    /**
        关于query()中的参数进行说明一下

        Cursor cursor = getContentResolver().
                query(@NonNull Uri uri, @Nullable String[] projection,
            @Nullable String selection, @Nullable String[] selectionArgs,
            @Nullable String sortOrder)

        @params uri:  查询路径
        @params projection: 需要查询的相关列
        @params selection : 选择条件
        @params selectionArgs:
        @params sortOrder: 指定查询结果排列方式  /ASC/DESC
    */
    Cursor cursor = getContentResolver().query(uri,projections,null,null,null);

/*
查询出来的结果会按照 projection 的要求进行存储。
*/

while(cursor.moveToNext()){
    String name = cursor.getString(0);
    long duration = cursor.getString(1);
    long size = cursor.getString(2);
    //对于size查询出来一bytes单位,但是在界面显示的时候,我们还是要使用 kb,M,Tb这些常人能够看懂的单位才可以。那么在android中有一个方法:Formatter.formatFilesSize(Context , long).本身为android方法,所以可以在android库中查看,不多说了

    String data = cursor.getString(3);
    /*
    此时已经得到需要的信息,然后进行自己项目的处理方法。
    比如加载到适配器进行显示。
    1:创建相应的POJO 
    2:创建自己的适配器
    3:进行调用
    这里非重要代码,所以省略了···
    */

}
//完成工作后记得关闭相应的cursor
cursor.close();
}

问题:查询手机中的任何内容,属于耗时操作的范围。所以需要使用自从子线程进行处理。

子线程中处理耗时操作

1.优化getdata()方法:

/**


*/
private void getdata(){
    new Thread(new Runable(){
        @override
        public void run(){
                //加入上面getdata中的代码
                ···
            }
        }).start();

}

因为android中只有一个主线程,所以在子线程中无法操作UI界面
所以结合Handler来进行处理

2:创建Handler

private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg){
//处理Ui变化操作
};
};

3:在getdata()方法中发送消息,交给handler处理Ui变化
在run()方法中添加如下代码即可

//处理UI界面变化
handler.sendEmptyMessage(0);

最后:完整的getdata()方法如下:

private void getdata(){
    new Thread(new Runable(){
        @override
        public void run(){
                Uri uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URL;

    String[] projections = {
                MediaStore.Video.Media.DISPLAY_NAME,//名称
                MediaStore.Video.Media.DURATION,//时长
                MediaStore.Video.Media.SIZE,//大小
                MediaStore.Video.Media.DATA,//路径
            };
    Cursor cursor = getContentResolver().query(uri,projections,null,null,null);

while(cursor.moveToNext()){
    String name = cursor.getString(0);
    long duration = cursor.getString(1);
    long size = cursor.getString(2);//查询出来一bytew
    String data = cursor.getString(3);
}
cursor.close();
handler.sendEmptyMessage(0);
            }
        }).start();

}

如果说对于android多线程有问题的朋友,在下之前写过一篇关于线程的blog,可以查看,希望有所帮助。

android多线程编程

放重复加载

/**
比如说我们有个方法只执行一次,但是在多个事件中都有调用

所以我们要做一个判断,来进行防重复调用,加载

方法很简单,但是我很受用,以前我的思路都是在调用的地方进行判断的赋值

而这中思路更加方便
*/

private boolean isLoad = false;
private void startActivity(){
    if(!isload){
        isLoad = true;
        //做自己逻辑的处理
    }
}

DONE。


Excellence is a continuous process and not accident.
—come on

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值