一.最近在做一个需求,手机文件的快速扫描功能。
先附上效果图:
二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个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