Android查询本地文件(最快速度)

本文介绍了一种利用RxJava在Android应用中快速查询本地不同类型的文件的方法,包括图片、视频、音频、文档和压缩文件等,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android本地文件快速查询

引用权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

使用框架

compile 'io.reactivex:rxjava:1.2.1'
compile 'io.reactivex:rxandroid:1.2.1'

 

参考地址

手机文件类型:http://www.cnblogs.com/hibraincol/archive/2010/09/16/1828502.html

Rxjava:http://gank.io/post/560e15be2dca930e00da1083

关键代码

package com.example.administrator.hxwx.externalstoragepack;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;

import java.util.ArrayList;
import java.util.List;

import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;

/**
 * Created by Administrator on 2017/7/13 0013.
 */
public class LocalFileTool
{
   public static final String[] picType=new String[]{"image/bmp","image/jpeg","image/png"};
    public static final String[] aviType=new String[]{"video/3gpp","video/x-ms-asf","video/x-msvideo",
            "video/vnd.mpegurl","video/x-m4v","video/quicktime","video/mp4","video/mpeg",
    };
    public static  final String[] volumType=new String[]{"audio/x-mpegurl","audio/mp4a-latm","audio/x-mpeg","audio/mpeg","audio/ogg","audio/x-wav","audio/x-ms-wma"};
    public static final String[] docType=new String[]{"application/msword","application/pdf","application/vnd.ms-powerpoint","text/plain","application/vnd.ms-works"};
    public static final String[] zipType=new String[]{"application/x-gtar","application/x-gzip","application/x-compress","application/zip"};

   // final static Object lock=new Object();

     public static void readFile(final String[] mimeType,Context context, final IReadCallBack iReadCallBack)
     {

         Observable.just(context).map(new Func1<Context, List<String>>() {
             @Override
             public List<String> call(Context context1) {


                    List<String> paths = new ArrayList<String>();
                    Uri[] fileUri = null;
                    fileUri = new Uri[]{MediaStore.Files.getContentUri("external")};

                    String[] colums = new String[]{MediaStore.Files.FileColumns.DATA};
                    String[] extension = mimeType;

                    //构造筛选语句
                    String selection = "";
                    for (int i = 0; i < extension.length; i++) {
                        if (i != 0) {
                            selection = selection + " OR ";
                        }
                        selection = selection + MediaStore.Files.FileColumns.MIME_TYPE + " LIKE '%" + extension[i] + "'";
                    }

                    //获取内容解析器对象
                    ContentResolver resolver = context1.getContentResolver();
                    //获取游标
                    for (int i = 0; i < fileUri.length; i++) {
                        Cursor cursor = resolver.query(fileUri[i], colums, selection, null, null);
                        if (cursor == null) {
                            return null;
                        }//游标从最后开始往前递减,以此实现时间递减顺序(最近访问的文件,优先显示)
                        long beginTime = System.currentTimeMillis();
                        if (cursor.moveToLast()) {

                            do {
                                //输出文件的完整路径
                                String data = cursor.getString(0);
                                paths.add(data);

                            } while (cursor.moveToPrevious());

                        }
                        cursor.close();
                        android.util.Log.e("endTime", System.currentTimeMillis() - beginTime + "");
                    }
                    return paths;


             }
         }).observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()).
                 subscribe(new Action1<List<String>>() {
                     @Override
                     public void call(List<String> strings) {
                         iReadCallBack.callBack(strings);
                     }
                 });

     }



   public interface IReadCallBack
    {
        void callBack(List<String> localPath);
    }




}

 

 

调用示例

LocalFileTool.readFile(LocalFileTool.docType, getActivity(), new LocalFileTool.IReadCallBack() {
    @Override
    public void callBack(List<String> localPath) {
        for (String path : localPath)
            android.util.Log.e("doc:", path);
    }
});
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值