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

二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个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;@Overrideprotected 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;}@Overridepublic Fragment getItem(int position) {return fragmentList.get(position);}@Overridepublic int getCount() {return fragmentList.size();}@Overridepublic CharSequence getPageTitle(int position){return title.get(position);}
}

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

<?xml version="1.0" encoding="utf-8"?>
<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.TabLayoutandroid: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.ViewPagerandroid: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;@Overridepublic int getLayoutResource() {return R.layout.fragment_media;}@Overridepublic 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)@Overridepublic 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>>() {@Overridepublic 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() {@Overridepublic 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<>();@Overridepublic int getLayoutResource() {return R.layout.fragment_picture;}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {expandabliePicAdapter.setChooseMap(picChooseMap);expandabliePicAdapter.notifyDataSetChanged();return false;}});//子节点点击事件expandableListview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic 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() {}@Overridepublic int getLayoutResource() {return R.layout.fragment_document_file;}@Overridepublic 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>>>() {@Overridepublic 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>>>() {@Overridepublic void onNext(List<List<FileInfo>> strings) {expandablieDocAdapter = new ExpandablieDocAdapter(getActivity(), groupList, strings,docChooseMap);expandableListview.setAdapter(expandablieDocAdapter);progressDialog.dismiss();}@Overridepublic void onComplete() {progressDialog.dismiss();}@Overridepublic 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() {@Overridepublic boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {expandablieDocAdapter.setChooseMap(docChooseMap);expandablieDocAdapter.notifyDataSetChanged();return false;}});expandableListview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic 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() {}@Overridepublic int getLayoutResource() {return R.layout.fragment_other;}@Overridepublic 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>>>() {@Overridepublic 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>>() {@Overridepublic void accept(List<FileInfo> fileInfos) throws Exception {fileInfoList.clear();fileInfoList.addAll(fileInfos);otherAdapter.notifyDataSetChanged();}});}private FileFilter filter = new FileFilter() {@Overridepublic boolean accept(File file) {return !file.isHidden();}};private Comparator<FileInfo> comparator = new Comparator<FileInfo>() {@Overridepublic 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() {@Overridepublic 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 .apkString 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 .apkString 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识别手机文件 快速扫描并优化加载速度相关推荐

  1. uniapp 开发h5 优化加载速度

    uniapp 开发h5 优化加载速度 1.选择manifest.json.点击H5配置.勾选发行时启用摇树优化 这个功能可以减少网站体积加快首页渲染速度 2.配置nginx服务器,启用gzip压缩,示 ...

  2. android手机文件快速扫描,并归类

    一.前言 我在使用我们的App的时候发现发送文件的时候,从进入文件选择界面到文件完全加载出来,时间过长,大概10s左右,然后我想这个是否可以优化一下,然后进过自己查资料,瞎搞,弄出啦了.下面不多说,先 ...

  3. 关于浏览器(五)fp fcf fmp 浏览器优化加载速度

    FP (First Paint) 首次绘制 FP (First Paint) 首次绘制: 标记浏览器渲染任何在视觉上不同于导航前屏幕内容之内容的时间点. FCP (First Contentful P ...

  4. MaccmsV10切换JS播放器,优化加载速度

    引言:默认自带dpplayer播放器和videoJs播放器 为什么要切换自己的播放器? 1:采集的影视资源大部分是外站的,外站资源平台一般都会标配播放器,便于放自己的一些广告和菠菜,无可厚非. 2:还 ...

  5. 如何优化网站页面提高网页的加载速度

    网站要想加载快无非就是减少http请求次数,下面说一下具体做法: 1:字符集声明 如果<head>部分未定义字符集,将增加页面渲染次数,速度减慢. 2:Meta信息完善程度 建议网站met ...

  6. vue php 加载速度,Vue加载优化,速度提高一倍。

    前言 之前做的一个Vue项目,流程大概是这这样的:从公众号进入,由外系统获取用户的openid等信息,然后再跳转到项目首页进行加载初始化操作. 业务最近反应进入首页很慢,于是大致排查了下,由于外系统需 ...

  7. Android 浏览器内核浅谈,基于WebKit内核的Android手机浏览器的性能研究与加载优化...

    南京邮电大学 硕士 2017 基于WebKit内核的Android手机浏览器的性能研究与加载优化 Performance Research and Load Optimization of Andro ...

  8. android 文件加密解决方法,一种Android平台的文件快速加密以及解密方法与流程

    本发明属于数据安全领域,具体涉及一种Android平台的文件快速加密以及解密方法. 背景技术: 目前移动办公系统极大地提升了企.事业单位的工作效率,而带装有办公应用的智能设备中会存储一些较高机密性的文 ...

  9. android加载h5速度慢的解决方案,WebView优化提高H5加载速度方案

    WebView优化提高H5加载速度方案 WebView加载H5经历的过程图示 上图体现的是用户打开一个H5页面,经历的过程与代码内部所作的事情的对应关系.javascript 用户:无感知(WebVi ...

最新文章

  1. 二叉树的非递归遍历(递归和非递归)
  2. 如何用MediaCapture解决二维码扫描问题
  3. Java数据结构和算法:二叉树
  4. [云炬创业基础笔记] 第四章测试5
  5. 2019春季学期第四周作业
  6. 基于小程序·云开发构建高考查分小程序丨实战
  7. Android官方开发文档Training系列课程中文版:通过NFC共享文件之发送文件到另一台设备
  8. eclipse不识别java,在Eclipse中运行的Maven项目存在问题,无法识别为Java项目
  9. linux deepin 15.9双系统,windows10安装双系统Deepin15.9遇到的坑
  10. Deeplabv3+ 环境配置-Anaconda3 + Pytorch1.8 + Cuda10.1 + opencv3.2.0
  11. Django开发利器——django-debug-toolbar
  12. GIS:揭开你神秘的面纱
  13. MySQL(6)-----数据类型
  14. 【Windows XP系统壁纸设置有哪些技巧】
  15. [样本分析] 海莲花CS样本
  16. cesium显示帧率FPS控件
  17. noj [1480] 懒惰的风纪委Elaine (多重背包)
  18. 笔记本cmd重启计算机的代码,怎么让电脑不断重启(用cmd实现)
  19. CQF笔记M1L3泰勒级数和转移概率密度函数
  20. linux怎么安装gem命令,实战定制yum仓库----gem命令常用的参数

热门文章

  1. Google Analytics与Google Adwords的转换数据差别
  2. HTML5部分查漏补缺
  3. Microsoft Office Word 2003稿纸加载项 无法卸载解决方法
  4. Scala基础教程--06--类与对象的详解
  5. 一天DNF外挂第一页打造方法 SEO思想终极转换
  6. 逆向学习(二) 安卓逆向
  7. 20222948 2022-2023-2 《网络攻防实践》第2周作业
  8. python3[爬虫基础入门实战] 爬取豆瓣电影排行top250
  9. eDonkey|emule服务器
  10. 中学理化生实验室标准化考场建设方案