android识别手机文件 快速扫描并优化加载速度

一.最近在做一个需求,手机文件的快速扫描功能。
先附上效果图:

android识别手机文件 快速扫描并优化加载速度_第1张图片

二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个Fragment,方便复制粘贴,用哪个粘哪个,不要太感动呢. 下面附上代码:

package com.example.wenjianshibie;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;

import android.os.Bundle;

import com.example.wenjianshibie.Adapter.MyFragmentPagerAdapter;
import com.example.wenjianshibie.Fragment.DocumentFileFragment;
import com.example.wenjianshibie.Fragment.MediaFragment;
import com.example.wenjianshibie.Fragment.OtherFragment;
import com.example.wenjianshibie.Fragment.PictureFragment;
import com.google.android.material.tabs.TabLayout;

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

public class MainActivity extends AppCompatActivity {
     
    TabLayout tabLayout;
    ViewPager viewPager;
    List<String> titles;
    List<Fragment> fragments;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tabLayout = (TabLayout) findViewById(R.id.mytab);
        viewPager = (ViewPager) findViewById(R.id.vp_myfile);

        titles = new ArrayList<>();
        titles.add("影音");
        titles.add("图片");
        titles.add("文档");
        titles.add("其他");
        //创建构造方法
        initView();
    }

    private void initView() {
     
        fragments = new ArrayList<>();
        //影音
        fragments.add(new MediaFragment());
        //图片
        fragments.add(new PictureFragment());
        //文档
        fragments.add(new DocumentFileFragment());
        //其他
        fragments.add(new OtherFragment());

        //适配器
        MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments, titles);

        viewPager.setAdapter(myFragmentPagerAdapter);
//        使用ViewPager进行设置
        tabLayout.setupWithViewPager(viewPager);
    }
}

这边附上Fragment 的适配器。

package com.example.wenjianshibie.Adapter;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

import java.util.List;
//1.Framgnt 适配器
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
     
 
    private FragmentManager fragmentManager;
    private List<Fragment> fragmentList;
    private List<String> title;
 
    public MyFragmentPagerAdapter(FragmentManager supportFragmentManager, List<Fragment> fragments,List<String> titles) {
     
        super(supportFragmentManager);
        fragmentManager = supportFragmentManager;
        fragmentList = fragments;
        title = titles;
 
    }
 
    @Override
    public Fragment getItem(int position) {
     
        return fragmentList.get(position);
    }
 
    @Override
    public int getCount() {
     
        return fragmentList.size();
    }
 
    @Override
    public CharSequence getPageTitle(int position){
     
        return title.get(position);
    }
}

这边用到了是TabLayout+ViewPager之间的切换 有需要的可以粘贴哈.附上布局文件


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <com.google.android.material.tabs.TabLayout
        android:id="@+id/mytab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabTextColor="#ffffff"
        app:tabBackground="@drawable/tab_background"
        app:tabMode="fixed"
        />
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vp_myfile"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/mytab"/>

RelativeLayout>

1.第一个Fragment 音视频功能.

package com.example.wenjianshibie.Fragment;

import android.app.ProgressDialog;

import android.os.Build;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ExpandableListView;

import androidx.annotation.RequiresApi;

import com.example.wenjianshibie.Adapter.ExpandablieAdapter;
import com.example.wenjianshibie.Base.FileInfo;
import com.example.wenjianshibie.Gongjulei.FileInfoManager;
import com.example.wenjianshibie.Adapter.ObserverAdapter;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import com.example.wenjianshibie.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 * 1.影音Fragment
 */
public class MediaFragment extends BaseFileFragment {
     
    private ExpandableListView expandableListview;
    private FileInfoManager bfm;
    private ArrayList<String> groupList = new ArrayList<>();
    private ArrayList<List<FileInfo>> bxFilesList = new ArrayList<List<FileInfo>>();
    private ExpandablieAdapter expandablieAdapter;
    private Map<String, List<FileInfo>> avChooseMap = new HashMap<>();
    private List<FileInfo> audioFiles = new ArrayList<>();
    private List<FileInfo> videoFiles = new ArrayList<>();
    private ProgressDialog progressDialog;
    @Override
    public int getLayoutResource() {
     
        return R.layout.fragment_media;
    }

    @Override
    public void initView(View view) {
     
        expandableListview = view.findViewById(R.id.expandablelistview);
        expandableListview.setGroupIndicator(null);
        initData();
        setOnClick();
    }

    private void initData() {
     
        groupList.clear();
        bxFilesList.clear();
        groupList.add("音频");
        groupList.add("视频");
        bfm = new FileInfoManager();
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("数据加载中");
        progressDialog.setCanceledOnTouchOutside(false);
        if (avChooseMap.size() == 0){
     
            for (int i = 0; i < groupList.size(); i++) {
     
                List<FileInfo> bxFiles = new ArrayList<>();
                avChooseMap.put(groupList.get(i),bxFiles);
            }
        }
        setAudioData();
    }

    private void setAudioData() {
     
        //获取
        Observable.create(new ObservableOnSubscribe<List<FileInfo>>() {
     
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void subscribe(ObservableEmitter<List<FileInfo>> subscriber) throws Exception {
     
                //设置音频
                audioFiles = bfm.getMediaFiles(getActivity(), MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
//                设置视频
                videoFiles = bfm.getMediaFiles(getActivity(), MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
                subscriber.onComplete();
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new ObserverAdapter<List<FileInfo>>() {
     
                    @Override
                    public void onComplete() {
     
                        progressDialog.dismiss();
                        bxFilesList.add(audioFiles);
                        bxFilesList.add(videoFiles);
                        expandablieAdapter = new ExpandablieAdapter(getActivity(), groupList, bxFilesList,avChooseMap);
                        expandableListview.setAdapter(expandablieAdapter);
                    }
                });
    }

    private void setOnClick() {
     
        //父节点点击事件
        expandableListview.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
     
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
     
                expandablieAdapter.setChooseMap(avChooseMap);
                expandablieAdapter.notifyDataSetChanged();
                return false;
            }
        });
    }
}

2.然后是图片识别的Fragment 都是单独拆分开的.

package com.example.wenjianshibie.Fragment;

import android.app.ProgressDialog;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ExpandableListView;

import com.example.wenjianshibie.Adapter.ExpandabliePicAdapter;
import com.example.wenjianshibie.Base.FileInfo;
import com.example.wenjianshibie.Base.FolderInfo;
import com.example.wenjianshibie.Gongjulei.LocalMediaLoader;
import com.example.wenjianshibie.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 2.图片Fragment
 */
public class PictureFragment extends BaseFileFragment {
     

    private ExpandableListView expandableListview;
    private ExpandabliePicAdapter expandabliePicAdapter;
    private static String[] IMAGE_PROJECTION = new String[]{
     
            MediaStore.Images.Media.DATA,
            MediaStore.Images.Media.DISPLAY_NAME,
            MediaStore.Images.Media.DATE_ADDED,
            MediaStore.Images.Media._ID,
    };
    private List<String> folderList = new ArrayList<>();
    private List<List<FileInfo>> fileList = new ArrayList<>();
    private ProgressDialog progressDialog;
    private Map<String, List<FileInfo>> picChooseMap = new HashMap<>();

    @Override
    public int getLayoutResource() {
     
        return R.layout.fragment_picture;
    }

    @Override
    public void initView(View view) {
     
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("数据加载中");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();
        expandableListview = view.findViewById(R.id.expand_picture);
        expandableListview.setGroupIndicator(null);
        expandabliePicAdapter = new ExpandabliePicAdapter(getActivity(), folderList, fileList,picChooseMap);
        expandableListview.setAdapter(expandabliePicAdapter);
        initData();
        setOnClick();
    }

    private void initData() {
     
        folderList.clear();
        fileList.clear();
        new LocalMediaLoader(getActivity(), LocalMediaLoader.TYPE_IMAGE).loadAllImage(new LocalMediaLoader.LocalMediaLoadListener() {
     
            @Override
            public void loadComplete(List<FolderInfo> folders) {
     
                progressDialog.dismiss();
                for (int i = 0; i < folders.size(); i++) {
     
                    folderList.add(folders.get(i).getName());
                    fileList.add(folders.get(i).getImages());
                    List<FileInfo> fileInfos = new ArrayList<>();
                    picChooseMap.put(folders.get(i).getName(), fileInfos);
                }
                expandabliePicAdapter.setNewData(folderList, fileList);
                expandabliePicAdapter.notifyDataSetChanged();
            }
        });
    }

    private void setOnClick() {
     

        //父节点点击事件
        expandableListview.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
     
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
     
                expandabliePicAdapter.setChooseMap(picChooseMap);
                expandabliePicAdapter.notifyDataSetChanged();
                return false;
            }
        });

        //子节点点击事件
        expandableListview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
     
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
     
                CheckBox fileCheckBox = v.findViewById(R.id.fileCheckBox);
                FileInfo fileInfo = fileList.get(groupPosition).get(childPosition);
                List<FileInfo> chooseFiles = picChooseMap.get(folderList.get(groupPosition));
                if (chooseFiles.contains(fileInfo)) {
     
                    chooseFiles.remove(fileInfo);
                    picChooseMap.put(folderList.get(groupPosition), chooseFiles);
                    fileCheckBox.setChecked(false);
                } else {
     
                    chooseFiles.add(fileInfo);
                    picChooseMap.put(folderList.get(groupPosition), chooseFiles);
                    fileCheckBox.setChecked(true);
                }
                return true;
            }
        });
    }
}

3.这边是文档识别的代码.

package com.example.wenjianshibie.Fragment;

import android.app.ProgressDialog;
import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ExpandableListView;

import com.example.wenjianshibie.Adapter.ExpandablieDocAdapter;
import com.example.wenjianshibie.Adapter.ObserverAdapter;
import com.example.wenjianshibie.Base.FileInfo;
import com.example.wenjianshibie.Gongjulei.FileInfoManager;
import com.example.wenjianshibie.R;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

/**
 *3.文档Fragment
 */
public class DocumentFileFragment extends BaseFileFragment {
     

    private ExpandableListView expandableListview;
    private List<String> groupList = new ArrayList<>();
    private ProgressDialog progressDialog;
    private ExpandablieDocAdapter expandablieDocAdapter;
    private Map<String, List<FileInfo>> docChooseMap = new HashMap<>();
    private FileInfoManager bfm;
    private List<List<FileInfo>> docFiles;

    public DocumentFileFragment() {
     
    }

    @Override
    public int getLayoutResource() {
     
        return R.layout.fragment_document_file;
    }

    @Override
    public void initView(View view) {
     
        bfm = new FileInfoManager();
        progressDialog = new ProgressDialog(getActivity());
        progressDialog.setMessage("加载中");
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.show();
        expandableListview = view.findViewById(R.id.expandablelistview);
        expandableListview.setGroupIndicator(null);
        initData();
        setOnClick();
    }
    private void initData() {
     
        groupList.clear();
        groupList.add("TXT");
        groupList.add("WORD");
        groupList.add("EXCEL");
        groupList.add("PPT");
        groupList.add("PDF");
        groupList.add("XML");
        groupList.add("HTML");
        if (docChooseMap.size() == 0){
     
            for (int i = 0; i < groupList.size(); i++) {
     
                ArrayList<FileInfo> strings = new ArrayList<>();
                docChooseMap.put(groupList.get(i),strings);
            }
        }
        docFiles = bfm.geDocListFile();
        if (docFiles == null){
     
            Observable.create(new ObservableOnSubscribe<List<List<FileInfo>>>() {
     
                @Override
                public void subscribe(ObservableEmitter<List<List<FileInfo>>> subscriber) throws Exception {
     
                    //优化完美
                    docFiles = bfm.scanFilet(DocumentFileFragment.this.getActivity());
                    subscriber.onNext(docFiles);
                    if (docFiles != null) {
     
                        progressDialog.dismiss();
                    }
                }
            }).subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread()).subscribe(new ObserverAdapter<List<List<FileInfo>>>() {
     
                @Override
                public void onNext(List<List<FileInfo>> strings) {
     
                    expandablieDocAdapter = new ExpandablieDocAdapter(getActivity(), groupList, strings,docChooseMap);
                    expandableListview.setAdapter(expandablieDocAdapter);
                    progressDialog.dismiss();
                }
                @Override
                public void onComplete() {
     
                    progressDialog.dismiss();
                }
                @Override
                public void onError(Throwable e) {
     
                    progressDialog.dismiss();
                }
            });
        }else {
     
            expandablieDocAdapter = new ExpandablieDocAdapter(getActivity(), groupList, docFiles,docChooseMap);
            expandableListview.setAdapter(expandablieDocAdapter);
            progressDialog.dismiss();
        }
    }

    private void setOnClick() {
     
        expandableListview.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
     
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
     
                expandablieDocAdapter.setChooseMap(docChooseMap);
                expandablieDocAdapter.notifyDataSetChanged();
                return false;
            }
        });

        expandableListview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
     
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
     
                CheckBox fileCheckBox = v.findViewById(R.id.fileCheckBox);
                FileInfo fileInfo = docFiles.get(groupPosition).get(childPosition);
                List<FileInfo> fileList = docChooseMap.get(groupList.get(groupPosition));
                if (fileList.contains(fileInfo)) {
     
                    fileList.remove(fileInfo);
                    docChooseMap.put(groupList.get(groupPosition), fileList);
                    fileCheckBox.setChecked(false);
                } else {
     
                    fileList.add(fileInfo);
                    docChooseMap.put(groupList.get(groupPosition), fileList);
                    fileCheckBox.setChecked(true);
                }
                return true;
            }
        });
    }
}

4.其他Framgnt页面获取了手机系统文件

package com.example.wenjianshibie.Fragment;

import android.annotation.SuppressLint;

import android.os.Environment;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.ListView;

import com.example.wenjianshibie.Adapter.OtherAdapter;
import com.example.wenjianshibie.Base.FileInfo;
import com.example.wenjianshibie.Gongjulei.FileUtils;
import com.example.wenjianshibie.R;

import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

/**
 * 4.其他Fragment
 */
public class OtherFragment extends BaseFileFragment {
     

    private String mCurrentDir = Environment.getExternalStorageDirectory().getAbsolutePath();
    private final String rootDir = Environment.getExternalStorageDirectory().getPath();
    private List<FileInfo> fileInfoList = new ArrayList<>();
    private Set<String> chooseSet = new HashSet<>();
    private Map<String, FileInfo> temp = new HashMap<>();
    private List<FileInfo> chooseFiles = new ArrayList<>();
    private OtherAdapter otherAdapter;
    private ListView otherListView;

    public OtherFragment() {
     
    }

    @Override
    public int getLayoutResource() {
     
        return R.layout.fragment_other;
    }

    @Override
    public void initView(View view) {
     
        otherListView = view.findViewById(R.id.listview);
        otherAdapter = new OtherAdapter(getActivity(), fileInfoList, chooseSet);
        otherListView.setAdapter(otherAdapter);
        loadData();
        setOnClick();
    }

    @SuppressLint("CheckResult")
    private void loadData() {
     
        Observable.just(mCurrentDir).subscribeOn(Schedulers.io()).flatMap(new Function<String, ObservableSource<List<FileInfo>>>() {
     
            @Override
            public ObservableSource<List<FileInfo>> apply(String path) throws Exception {
     
                File currentDir = new File(path);
                File[] files = currentDir.listFiles(filter);
                List<FileInfo> infos = new ArrayList<>(files == null ? 1 : files.length);
                if (files != null)
                    for (File file : files) {
     
                        FileInfo info = FileUtils.getFileInfoFromFile(file);
                        info.setFileSize(file.isDirectory() ? "" : FileUtil.getFileSizeUnit(file.length()));
                        infos.add(info);
                    }
                Collections.sort(infos, comparator);
                if (!mCurrentDir.equals(rootDir)) {
     
                    FileInfo fileInfo = new FileInfo();
                    fileInfo.setFileName("..");
                    fileInfo.setFilePath(currentDir.getParent());
                    fileInfo.setFileSize("上层文件夹");
                    fileInfo.setDirectory(true);
                    fileInfo.setTime("");
                    infos.add(0, fileInfo);
                }
                return Observable.just(infos);
            }
        }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<List<FileInfo>>() {
     
            @Override
            public void accept(List<FileInfo> fileInfos) throws Exception {
     
                fileInfoList.clear();
                fileInfoList.addAll(fileInfos);
                otherAdapter.notifyDataSetChanged();
            }
        });
    }

    private FileFilter filter = new FileFilter() {
     
        @Override
        public boolean accept(File file) {
     
            return !file.isHidden();
        }
    };

    private Comparator<FileInfo> comparator = new Comparator<FileInfo>() {
     
        @Override
        public int compare(FileInfo f1, FileInfo f2) {
     
            if (f1.isDirectory() && f2.isDirectory())
                return f1.getFileName().compareToIgnoreCase(f2.getFileName());
            if (!f1.isDirectory() && !f2.isDirectory())
                return f1.getFileName().compareToIgnoreCase(f2.getFileName());
            return f1.isDirectory() ? -1 : 1;
        }
    };

    private void setOnClick() {
     
        otherListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
     
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
     
                FileInfo fileInfo = fileInfoList.get(position);
                String path = fileInfo.getFilePath();
                if (fileInfo.isDirectory()) {
     
                    mCurrentDir = path;
                    OtherFragment.this.loadData();
                } else {
     
                    CheckBox fileCheckBox = view.findViewById(R.id.fileCheckBox);
                    if (chooseSet.contains(path)) {
     
                        chooseSet.remove(path);
                        chooseFiles.remove(temp.get(path));
                        fileCheckBox.setChecked(false);
                    } else {
     
                        chooseSet.add(path);
                        FileInfo addInfo = temp.get(path);
                        if (addInfo == null) {
     
                            addInfo = fileInfo;
                            temp.put(path, addInfo);
                        }
                        chooseFiles.add(addInfo);
                        fileCheckBox.setChecked(true);
                    }
                }
            }
        });
    }
}

二、下面会主要复制一些重要性的代码可以用于参考.
由于代码量实在太大了,粘出来看的会很麻烦最后会附上源码路径哦. 下载下来就可以跑起来的非常方便的.
主要代码就是这个工具类,看不懂的可以在最后下载源码哦,这是是对文件识别做过优化的,因为这个东西之前就写好了,由于文件量大的话加载速度会特别慢所以对其进行了优化处理,之前将近加载一分钟,现在三到五秒就可以了。

package com.example.wenjianshibie.Gongjulei;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;

import androidx.annotation.RequiresApi;
import androidx.fragment.app.FragmentActivity;

import com.example.wenjianshibie.Base.FileInfo;

import java.io.File;
import java.util.ArrayList;
import java.util.List;



/**
 * 1.文件识别工具类
 */

public class FileInfoManager {
     
    //1.获取单个文件类型
    public static final String TEXT = "txt";
    public static final String WORD = "doc";
    public static final String EXCEL = "xls";
    public static final String PPT = "ppt";
    public static final String PDF = "pdf";
    public static final String XML = "xml";
    public static final String HTML = "html";
    //2.获取文件配置方法
    final String[] DOC_PROJECTION = {
     
            MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA,
            MediaStore.Files.FileColumns.MIME_TYPE,
            MediaStore.Files.FileColumns.SIZE,
            MediaStore.Files.FileColumns.TITLE
    };
    //初始化
    private FileInfoManager instance;
    //实体类
    private FileInfo fileInfo;
    private List<FileInfo> otherFile;
    private List<List<FileInfo>> otherlists;
    private ArrayList<List<FileInfo>> doclists;

    //构造方法
    public FileInfoManager getInstance() {
     
        if (null == instance) {
     
            instance = new FileInfoManager();
        }
        return instance;
    }

    //查找external多媒体文件
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public List<FileInfo> getMediaFiles(Activity cxt, Uri uri) {
     
        try (Cursor mCursor = cxt.getContentResolver().query(uri, new String[]{
     MediaStore.Audio.Media.DATA}, null, null, " date_modified desc")) {
     
            int count = mCursor.getCount();
            List<FileInfo> data = new ArrayList<>();
            if (count > 0) {
     
                if (mCursor.moveToFirst()) {
     
                    do {
     
                        String path = mCursor.getString(0);
                        if (FileUtils.isFileExist(path)) {
     
                            File file = new File(path);
                            fileInfo = new FileInfo();
                            fileInfo.setFileName(file.getName());
                            Log.i("文件1:---", file.getName());
                            fileInfo.setFilePath(file.getAbsolutePath());
                            if (!file.isDirectory()) {
     
                                fileInfo.setFileSize(String.valueOf(file.length()));
                                fileInfo.setTime(DateUtil.getDateTime(file.lastModified()));
                                String exspansion = FileUtils.getExspansion(file.getName());
                                fileInfo.setExspansion(exspansion);
                            }
                        }
                        data.add(fileInfo);
                    } while (mCursor.moveToNext());
                }
                return data;
            } else {
     
                return data;
            }
        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return null;
    }

    //    String selection = MediaStore.Files.FileColumns.MIME_TYPE + "= ? "
    //                               + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
    //                               + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
    //                               + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? "
    //                               + " or " + MediaStore.Files.FileColumns.MIME_TYPE + " = ? ";
    //
    //    String[] selectionArgs = new String[]{"text/plain", "application/msword", "application/pdf", "application/vnd.ms-powerpoint", "application/vnd.ms-excel"};
    //查找external多媒体文件
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    private List<FileInfo> getFilesByType(Activity cxt, String fileType) {
     
        List<FileInfo> data = new ArrayList<>();
        try (Cursor mCursor = cxt.getContentResolver().query(MediaStore.Files.getContentUri("external"), new String[]{
     MediaStore.Files.FileColumns.DATA, MediaStore.Files.FileColumns.DATE_ADDED, MediaStore.Files.FileColumns.SIZE, MediaStore.Files.FileColumns.TITLE}, MediaStore.Files.FileColumns.MIME_TYPE + " = ? ", new String[]{
     FileType.getFileOpenProgramByType(fileType)}, " date_modified desc")) {
     
            int count = mCursor.getCount();
            if (count > 0) {
     
                while (mCursor.moveToNext()) {
     
                    String path = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA));
                    int time = mCursor.getInt(mCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATE_ADDED));
                    int size = mCursor.getInt(mCursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE));
                    File file = new File(path);
                    if (!file.exists())
                        continue;
                    fileInfo = new FileInfo();
                    fileInfo.setFileName(file.getName());
                    Log.i("文件2:---", file.getName());
                    fileInfo.setFilePath(file.getAbsolutePath());
                    if (!file.isDirectory()) {
     
                        fileInfo.setFileSize(String.valueOf(size));
//                        fileInfo.setTime(DateUtil.getDateTime(time));
                        fileInfo.setExspansion(FileUtils.getExspansion(file.getName()));
                    }
                    data.add(fileInfo);
                }
            }
        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return data;
    }

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public synchronized List<List<FileInfo>> getDocFiles(FragmentActivity activity) {
     
        List<FileInfo> mTxtDocuments = getFilesByType(activity, TEXT);
        List<FileInfo> mDocDocuments = getFilesByType(activity, WORD);
        List<FileInfo> mXlsDocuments = getFilesByType(activity, EXCEL);
        List<FileInfo> mPptDocuments = getFilesByType(activity, PPT);
        List<FileInfo> mPdfDocuments = getFilesByType(activity, PDF);
        List<FileInfo> mXmlDocuments = getFilesByType(activity, XML);
        List<FileInfo> mHtmlDocuments = getFilesByType(activity, HTML);
        doclists = new ArrayList<>();
        doclists.add(mTxtDocuments);
        doclists.add(mDocDocuments);
        doclists.add(mXlsDocuments);
        doclists.add(mPptDocuments);
        doclists.add(mPdfDocuments);
        doclists.add(mXmlDocuments);
        doclists.add(mHtmlDocuments);
        return doclists;
    }
    /**
     * 扫描文件
     *
     * @param activity
     * @return
     */
    public List<List<FileInfo>> scanFilet(FragmentActivity activity) {
     

        List<FileInfo> mTxtDocuments = new ArrayList<>();
        List<FileInfo> mDocDocuments = new ArrayList<>();
        List<FileInfo> mXlsDocuments = new ArrayList<>();
        List<FileInfo> mPptDocuments = new ArrayList<>();
        List<FileInfo> mPdfDocuments = new ArrayList<>();
        List<FileInfo> mXmlDocuments = new ArrayList<>();
        List<FileInfo> mHtmlDocuments = new ArrayList<>();
        doclists = new ArrayList<>();
        //QYJ优化文件加载
        final String[] projection = DOC_PROJECTION;
        Uri uri = MediaStore.Files.getContentUri("external");
        //一些能通过mime_type查询出来的文档 .doc .pdf .txt .apk
        String selection = "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%.txt'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.log'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.java'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.doc'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.docx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.rtf'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xls'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xlsx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.ppt'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.pptx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.pdf'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xml'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.html'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.htm'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xhtml'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.json'" + ")";
        String[] selectionArgs = null;

        final Cursor c = activity.getContentResolver().query(uri,
                projection,
                selection,
                selectionArgs,
                MediaStore.Files.FileColumns.DATA);
        int count = c.getColumnIndex(MediaStore.Files.FileColumns.DATA);
        while (c.moveToNext()) {
     
            String path = c.getString(count);
            File file = new File(path);
            if (!file.exists())
                continue;
            fileInfo = new FileInfo();
            fileInfo.setFileName(file.getName());
            Log.i("文件3:---", file.getName());
            fileInfo.setFilePath(file.getAbsolutePath());
            if (!file.isDirectory()) {
     
                fileInfo.setFileSize(String.valueOf(file.length()));
//                fileInfo.setTime(DateUtil.getDateTime(file.lastModified()));
                fileInfo.setExspansion(FileUtils.getExspansion(file.getName()));
            }
            if (FileUtils.checkSuffix(path, new String[]{
     "txt", "log", "java"})) {
     
                mTxtDocuments.add(fileInfo);
            } else if (FileUtils.checkSuffix(path, new String[]{
     "doc", "docx", "dot", "rtf", "wps"})) {
     
                mDocDocuments.add(fileInfo);
            } else if (FileUtils.checkSuffix(path, new String[]{
     "xls", "xlsx"})) {
     
                mXlsDocuments.add(fileInfo);
            } else if (FileUtils.checkSuffix(path, new String[]{
     "ppt", "pptx"})) {
     
                mPptDocuments.add(fileInfo);
            } else if (FileUtils.checkSuffix(path, new String[]{
     "pdf"})) {
     
                mPdfDocuments.add(fileInfo);
            } else if (FileUtils.checkSuffix(path, new String[]{
     "xml"})) {
     
                mXmlDocuments.add(fileInfo);
            } else if (FileUtils.checkSuffix(path, new String[]{
     "html", "htm", "xhtml", "json"})) {
     
                mHtmlDocuments.add(fileInfo);
            }
        }
        doclists.add(mTxtDocuments);
        doclists.add(mDocDocuments);
        doclists.add(mXlsDocuments);
        doclists.add(mPptDocuments);
        doclists.add(mPdfDocuments);
        doclists.add(mXmlDocuments);
        doclists.add(mHtmlDocuments);
        return doclists;
    }


    public List<List<FileInfo>> geDocListFile() {
     
        return doclists;
    }

    public List<List<FileInfo>> getOtherListFile() {
     
        return otherlists;
    }
}

三、主要代码优化模块是下面这一块,也不算优化吧,只是指定的去查询就会节省很多时间,如果我们想查别的也可以在这个模块的基础上去修改,这边只提供了一个模型。

 //一些能通过mime_type查询出来的文档 .doc .pdf .txt .apk
        String selection = "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%.txt'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.log'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.java'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.doc'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.docx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.rtf'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xls'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xlsx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.ppt'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.pptx'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.pdf'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xml'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.html'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.htm'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xhtml'" +
                " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.json'" + ")";
        String[] selectionArgs = null;

四、源码模型已经搭好了,可以在这个模块的基础上进行修改,下面附上源码地址:点这里 提取码:k1tf

你可能感兴趣的:(代码,android)