精华内容
下载资源
问答
  • 近日有用户就遇到了这一问题,但不知道怎么操作很是苦恼,所以针对这一情况,今天本文为大家整理分享的就是关于手机扫描文件的图文教程。图文教程如下:1、如果我们手机里没有WPS这一个软件,那我们就需要到手机用...

    在平时工作或学习时,越来越多的时候需要使用到扫描文件,那大家知道安卓手机怎么扫描文件吗?近日有用户就遇到了这一问题,但不知道怎么操作很是苦恼,所以针对这一情况,今天本文为大家整理分享的就是关于手机扫描文件的图文教程。

    图文教程如下:

    1、如果我们手机里没有WPS这一个软件,那我们就需要到手机用商店里先下载这一个软件,等待下载并且安装完成之后,我们就需要打开WPS这个软件了。

    2、打开WPS之后,我们就需要选择我们想要扫描的文件了。

    8aa1e7491b49bd3d03c3b58be6cc5d6c.png

    3、当我们找到我们想要扫描的文件之后,我们就需要把它打开了,打开之后,我们在最左边可以看到有一个“工具”这个选项,然后我们就需要打开工具这一个选项了。

    0b73064c9e3800979ba2c68c9fe36a3c.png

    fba9f7c505e5ac0700608b49fb0ca57a.png

    4、最后一步也是非常重要的一步,我们可以看到有文件这一个选项,然后我们就需要打开文件这个选项了,打开文件这个选项之后,我们可以看到有提取页面这个选项,然后我们点击提取页面就完成扫描文件了。

    dab47b0dda7ee64c131f76fdedc98945.png

    上面给大家分享的就是关于手机扫描文件的图文教程啦,有需要的可以按照上面的步骤来操作哦。

    展开全文
  • 主要为大家分享了Android扫描本地音乐文件开发案例,感兴趣的小伙伴们可以参考一下
  • 基于Android手机文件扫描 可以扫面出所有的txt文件 并且可以打开
  • Android快速查找手机文件内某种类型或者某几种类型文件,而且可以调用系统自带工具打开文件,不存在媒体库文件不全的问题。
  • android手机文件快速扫描,并归类

    万次阅读 热门讨论 2018-04-13 17:34:54
    一、前言 我在使用我们的App的时候发现发送文件的时候,从进入文件选择界面到文件完全加载出来,时间过长,大概10s左右,然后我想这个是否...我们这个文件扫描是基于 https://github.com/DroidNinja/Android-Fil...

    一、前言

    我在使用我们的App的时候发现发送文件的时候,从进入文件选择界面到文件完全加载出来,时间过长,大概10s左右,然后我想这个是否可以优化一下,然后进过自己查资料,瞎搞,弄出啦了。下面不多说,先上效果图(实现的UI可以各位自行实现,我这里只是提供文件扫描功能的实现)。
    - 说明:
    我们这个文件扫描是基于 https://github.com/DroidNinja/Android-FilePicker 这个开源框架的(这个框架还不错,可以对文件进行归类),这里只是进行了优化。


    • 效果图如下:
      这里写图片描述
    • 优化思路:
      1、基于原有的方案,优化代码;
      2、在不改变原有框架的前提下,寻找替代原有扫描文件方法的方案;
      3、剔除原有的扫描文件方案,找一个更优的框架进行替换。

    二、思路实现说明

    • 2.1 剔除原有的扫描文件方案,找一个更优的框架进行替换
      该方案被第一个排除:
      i、因为之前框架涉及的代码比较多,改动可能比较大,担心影响功能
      ii、看了一些框架,对比于原有的,不符合原有设计需求

    • 2.2 在不改变原有框架的前提下,寻找替代原有扫描文件方法的方案
      我在网上看了一个大牛的扫描方案 https://blog.csdn.net/bingjianit/article/details/78822490,大家可以看一看。他的大体思路如下:
      i、扫描全盘文件,剔除隐藏文件或者文件夹。
      ii、将文件夹存入专门存放文件夹的队列中,并且为每个文件夹创建一个线程,将当前的文件夹中的指定文件存入集合中
      iii、开启线程池,执行所有线程,执行效果类似于第二步,直到所有文件夹都遍历完(直到所有线程执行完毕),将所有文件输出。
      我将该方案替代我之前的扫描方案的代码中,运行发现扫描的速度与之前方案对比,扫描速度似乎更慢。我猜测问题可能是线程过多。经过查看原方案的代码,并与这个方案进行对比,排除了这个方案。

    • 2.3 基于原有的方案,优化代码
      排除了上面两个方案,那只能改进现有代码了(回到原地),通过查看原有方案的扫描文件的源码,发现该方案的实现方式是通过contentprovider进行查询(由此确定可能该实现方法可能是最快的),经过查询资料发现contentprovider存储文件的方式类似于数据库(好久没用这个contentprovider,忘了,哈哈),我后来发现这个查询文件是不是可以通过mime_type这个字段进行查询,然后下面就开始进入正文:
      首先先给一个各种文件对应的mime_type的链接 https://blog.csdn.net/mazaiting/article/details/78129532,这里面包好了.doc .mp4等等文件对应的mime_type。
      下面看扫描文件的核心方法:

    context.getContentResolver().query(uri,
                    projection,
                    selection,
                    selectionArgs,
                    MediaStore.Files.FileColumns.DATE_ADDED + " DESC");

    说明:该方法类似于数据库查询的方法。它有5个参数,这些参数我这里只做简单的描述,具体的大家可以自己自行百度。

    参数描述举例
    uri内容提供者中文件的路径比如:音频(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)
    projection需要查询出来的列文件的_id 文件的大小等
    selection查询的条件指定一个查询的条件,比如 selection = “mime_type = ?”;
    selectionArgs查询的条件的值比如:selectionArgs = new String[]{“video/mp4”};
    sortOrder排序比如:MediaStore.Files.FileColumns.DATE_ADDED + ” DESC”

    下面贴实现代码(导包移除):

    /**
     * TODO 扫描文件
     */
    public class DocScannerTask extends AsyncTask<Void, Void, List<Document>> {
        List<Runnable> runnables = new ArrayList<>();
    
        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
        };
    
        final String[] projection = DOC_PROJECTION;
        private final FileResultCallback<Document> resultCallback;
    
        ArrayList<Document> allFiles = new ArrayList<>();
        //TODO 指定扫描的文件类型
        String[] selectionArgs = new String[]{".doc", ".docx", ".xls", ".xlsx", ".pdf", ".txt", ".rar", ".html", ".mp3", ".mp4", ".apk"};
    
        private final Context context;
    
        List<Cursor> list = new ArrayList<>();
    
        public DocScannerTask(Context context, FileResultCallback<Document> fileResultCallback) {
            this.context = context;
            this.resultCallback = fileResultCallback;
    
        }
    
        /**
         * TODO 子线程请求数据
         *
         * @param voids
         * @return
         */
        @Override
        protected List<Document> doInBackground(Void... voids) {
            final ArrayList<Document> documents = new ArrayList<>();
            for (int i = 0; i < 4; i++) {
                final int j = i;
                Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        documents.addAll(getAllFiles(j));
                    }
                };
                runnables.add(runnable);
            }
    
            final ExecutorService executorService = Executors.newFixedThreadPool(3);
            for (Runnable runnable : runnables) {
                executorService.execute(runnable);
            }
            executorService.shutdown();
            //等待线程池中的所有线程运行完成
            while (true) {
                if (executorService.isTerminated()) {
                    break;
                }
            }
            return documents;
        }
    
        private ArrayList<Document> getAllFiles(int i) {
            String selection = null;
            String[] selectionArgs = null;
            Uri uri = MediaStore.Files.getContentUri("external");
            if (i == 0) {  //一些能通过mime_type查询出来的文档 .doc .pdf .txt .apk
                selection = "mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? ";
                selectionArgs = new String[]{"text/html", "application/msword", "application/pdf", "text/plain"};
    
            } else if (i == 1) { //一些不能通过mime_type查询出来的文档 .docx .xls .xlsx .rar
                selection = "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%.xls'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.docx'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.apk'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xlsx'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.rar'" + ")";
                selectionArgs = null;
    
            } else if (i == 2) { //视频文件
                uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                selection = "mime_type = ?";
                selectionArgs = new String[]{"video/mp4"};
            } else if (i == 3) {  //音频文件
    
                uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                selection = "mime_type = ? or mime_type = ?";
                selectionArgs = new String[]{"audio/mpeg", "audio/ogg"};
    }
    ArrayList<Document> documents = new ArrayList<>();
            final Cursor cursor = context.getContentResolver().query(uri,
                    projection,
                    selection,
                    selectionArgs,
                    MediaStore.Files.FileColumns.DATE_ADDED + " DESC");
    
            if (cursor != null) {
                documents = getDocumentFromCursor(cursor);
                cursor.close();
            }
            return documents;
        }
        @Override
        protected void onPostExecute(List<Document> documents) {
            super.onPostExecute(documents);
            if (resultCallback != null) {
                resultCallback.onResultCallback(documents);
            }
        }
        /**
         * TODO 从Cursor中获取数据
         *
         * @param data
         * @return
         */
        private ArrayList<Document> getDocumentFromCursor(Cursor data) {
            ArrayList<Document> documents = new ArrayList<>();
    
            while (data.moveToNext()) {
    
                int imageId = data.getInt(data.getColumnIndexOrThrow(_ID));
                String path = data.getString(data.getColumnIndexOrThrow(DATA));
                String title = data.getString(data.getColumnIndexOrThrow(MediaStore.Files.FileColumns.TITLE));
    
                //TODO 判断文件路径是否是指定的文件类型
                if (path != null && contains(selectionArgs, path)) {
                    Document document = new Document(imageId, title, path);
    
                    String mimeType = data.getString(data.getColumnIndexOrThrow(MediaStore.Files.FileColumns.MIME_TYPE));
                    if (mimeType != null && !TextUtils.isEmpty(mimeType))
                        document.setMimeType(mimeType);
                    else {
                        document.setMimeType("");
                    }
     document.setSize(data.getString(data.getColumnIndexOrThrow(MediaStore.Files.FileColumns.SIZE)));
    
                    if (!documents.contains(document))
                        documents.add(document);
                }
            }
            return documents;
        }
    
        /**
         * TODO 判断文件路径是否是types结尾
         *
         * @param types 扫描的文件类型
         * @param path  文件路径
         * @return
         */
        boolean contains(String[] types, String path) {
            for (String string : types) {
                if (path.endsWith(string)) {
                    return true;
                }
            }
            return false;
        }
    }
    

    代码实现说明:我一开始实现是完全用一个selection 和 selectionArgs 进行查询,发现速度很快,只需要大概1s就能完全加载完(从进入到显示)。查询的两个字段如下:

    selection = "mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ? or mime_type = ?";
    selectionArgs = new String[]{"application/x-rar-compressed", "text/html","audio/mpeg", "audio/ogg", "video/mp4","application/msword", "application/pdf", "application/vnd.ms-excel",
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
                    "text/plain","application/vnd.android.package-archive"};

    额,很长,哈哈,后面再测试的过程中发现一个问题,那就是有一些文件(.docx .xls .xlsx .rar)按照mime_type 来查询的话无法加载出来。这就尴尬了,抓耳挠腮,搞了一下午,硬是没找着,并且马上要提测了,干脆骗测试,手机了没有这个文件?哈哈,显然不行,工作要紧。然后在查找资料的过程中发现了以为大牛的方法不错,可以解决我的这个难题https://blog.csdn.net/zocki33250/article/details/48112669,他的方案是在条件那个字段那里写一个数据库查询的语句

    selection = "(" + MediaStore.Files.FileColumns.DATA + " LIKE '%.xls'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.docx'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.xlsx'" +
                        " or " + MediaStore.Files.FileColumns.DATA + " LIKE '%.rar'" + ")";
                selectionArgs = null;
    

    经过测试,完美解决,但是时间上又稍微慢了个1-2s,不过相对于之前的10s,已经快很多了。


    三、总结

    先写优点:
    1、明显提高了查询的速度
    2、个人认为该实现方案应该是比较好的(嘿嘿~)
    缺点:
    1、有局限性,需要知道所查询的文件的类型,然后再找到对应的mime_type
    2、有些文件查询不出来,得利用其他方法,比如查询.xls等文件,如果加入该方法,查询速度明显降低,经过测试,如果这个方法里面的类型增多,那么该方案将没有啥有事,打开依然很慢。

    四、写在最后

    我这个实现的方法只为了实现而实现,灵活性可能降低了一些,若各位大神有什么好的建议,欢迎指正,交流

    五、后记(测试优化)

    之前我用的手机是小米手机,其他机型没有进行适配,后来经过测试发现,部分厂商的手机(华为、oppo)会出现apk文件扫描不到的情景,代码已在上面进行修改

    六、疑问

    各位看官大佬,我想问一个问题,为什么有些厂商的手机的有些文件(.xls、.rar etc.)无法根据mime_type进行扫描呢?contentprovider里面文件存储的mime_type不是唯一的吗?不是与文件类型一一对应的吗?

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

    千次阅读 热门讨论 2021-05-27 18:19:30
    最近在做一个需求,手机文件的快速扫描功能。 先附上效果图: 二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个Fragment,方便复制粘贴,用哪个粘哪个,不要太感动呢...

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

    在这里插入图片描述

    二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个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之间的切换 有需要的可以粘贴哈.附上布局文件

    <?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.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扫描音乐文件

    2019-03-18 14:44:54
    Android扫描本地音乐文件的实现,在做音乐播放器的时候都需要搜索手机里面的音乐文件并显示到文件中,并显示到 ListView中。
  • 首先是扫描本地所有的音频文件,然后全部装进集合当中,接下来就是用ListView展示在屏幕上,大概就是这几个步骤了,接下来细讲 创建一个容器 进行过数据解析的朋友都应该知道JavaBean吧,用来装载解析出来的数据,...
  • 不说废话,直接上代码:public static List allVideoList = null;// 视频信息集合allVideoList = new ArrayList();getVideoFile(allVideoList,Environment....// 获得视频文件private void getVideoFile(final ...

    不说废话,直接上代码:

    public static List allVideoList = null;// 视频信息集合

    allVideoList = new ArrayList();

    getVideoFile(allVideoList,Environment.getExternalStorageDirectory());// 获得视频文件

    private void getVideoFile(final List list, File file) {// 获得视频文件

    file.listFiles(new FileFilter() {

    @Override

    public boolean accept(File file) {

    // sdCard找到视频名称

    String name = file.getName();

    int i = name.indexOf('.');

    if (i != -1) {

    name = name.substring(i);

    if (name.equalsIgnoreCase(".mp4")

    || name.equalsIgnoreCase(".3gp")

    || name.equalsIgnoreCase(".wmv")

    || name.equalsIgnoreCase(".ts")

    || name.equalsIgnoreCase(".rmvb")

    || name.equalsIgnoreCase(".mov")

    || name.equalsIgnoreCase(".m4v")

    || name.equalsIgnoreCase(".avi")

    || name.equalsIgnoreCase(".m3u8")

    || name.equalsIgnoreCase(".3gpp")

    || name.equalsIgnoreCase(".3gpp2")

    || name.equalsIgnoreCase(".mkv")

    || name.equalsIgnoreCase(".flv")

    || name.equalsIgnoreCase(".divx")

    || name.equalsIgnoreCase(".f4v")

    || name.equalsIgnoreCase(".rm")

    || name.equalsIgnoreCase(".asf")

    || name.equalsIgnoreCase(".ram")

    || name.equalsIgnoreCase(".mpg")

    || name.equalsIgnoreCase(".v8")

    || name.equalsIgnoreCase(".swf")

    || name.equalsIgnoreCase(".m2v")

    || name.equalsIgnoreCase(".asx")

    || name.equalsIgnoreCase(".ra")

    || name.equalsIgnoreCase(".ndivx")

    || name.equalsIgnoreCase(".xvid")) {

    VideoInfo vi = new VideoInfo();

    vi.setDisplayName(file.getName());

    vi.setPath(file.getAbsolutePath());

    list.add(vi);

    return true;

    }

    } else if (file.isDirectory()) {

    getVideoFile(list, file);

    }

    return false;

    }

    });

    }

    展开全文
  • NULL 博文链接:https://ouyangfeng521.iteye.com/blog/907128
  • 安卓三维扫描工具.zip

    2020-04-30 18:12:27
    安卓三维扫描工具 需要多种配件 包括激光笔 支架 旋转台 手机 配合使用
  • 如果你做过多媒体应用,一定会苦恼过...当手机或模拟器开机时,会调用android的MediaScanner,扫描sd卡和内存里的文件。以下是log信息。代码如下:12-13 15:39:11.062: VERBOSE/MediaPlayerService(67): Create new ...
  • Android扫描本地pdf文件和从网络下载pdf文件并打开实现文件的网络下载和打开,PDF依赖便捷好用
  • package bcoder....import android.util.Log;import java.io.File;import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.Stac...
  • 博客地址:http://blog.csdn.net/lowprofile_coding/article/details/48269011 1.获取扩展存储设备 2.获取sdcard2外部存储空间 3.获取可用的 EMMC 内部存储空间 4.获取其他外部存储可用空间 5.获取内部存储目录
  • android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息:public static List sysVideoList = null;// 视频信息集合sysVideoList...
  • 一、前言本来觉得so easy,真是没想到,还搞了老半天,搞的我大汗淋漓,要拍...通过浏览器访问,问题不大,例如下图:但是想通过手机访问的时候,问题就出现了,同样的参数,结果很不一样,而且基本搜不到自己想要...
  • 今天就教大家把Android手机变成“随身扫描仪”,让期末复习不再杂乱无章。文档识别:重点巧摘录一本书里到处都是勾画的重点,应该是复习时最头疼的,如果能把这些重点摘录出来复习起来就要轻松多了。现在用手机就...
  • } /** * 获取文件path文件夹下的文件列表 * @see #getSonNode(String) * @param path 手机上的文件夹 * @return path文件夹下的文件列表的信息,信息存储在Map中,Map的key的列表如下: * FILE_INFO_NAME : String ...
  • 安卓文档扫描

    2021-06-07 12:05:32
    不管是工作还是生活中,难免会遇到需要扫描文件给对方的情况。那么,周围环境没有扫描仪该怎么办呢?其实,手机里面有一个自带的扫描仪功能,只是你不知道也不会用罢了。今天就给分享一招手机里自动的扫描仪功能,...
  • 本文来自cnBeta想让你的手机变成3D扫描仪吗?本周,3D打印爱好者QLRO创建了一个基于Arduino的3D扫描仪,并开源了相关代码,稍有动手能力和条件的用户都能轻松制作。该开源项目去除了3D扫描过程中最耗时的组件,只...
  • Android默认情况下会将每个多媒体文件的信息保存在一个数据库中(在系统收到某些消息,比如开机、插拔SD卡、设备连接上电脑这种涉及到可能更改文件系统内容的情况下,会触发系统扫描文件系统中的多媒体文件变化情况并...
  • Android手机OCR+扫描APP

    2020-12-15 11:09:24
    今天带来两款手机端的文档扫描与OCR识别工具,我们平时在工作中可能都会有一些文档扫描或者文字提取及翻译的需求,自己旁边没有扫描仪的话便需要专门跑到别的地方去,平白浪费时间与精力,这时一款手机扫描APP便派上...
  • Android系统的开放,使其用户... /mnt/sdcard或者/sdcard这是Android手机中SD卡的文件夹路径,其中/mnt/sdcard/是android 2.2或更高版本所使用的,而/sdcard是android 2.1或早期版本的存储卡位置。2. /mnt/sdcard...
  • 在开发的过程中,有时候会遇到需要读取多媒体文件的需求,面对这样的需求,通常我们有两种解决方案:自己扫描全盘文件,或者使用ContentResolver读取系统记录。一般需求不是特别复杂的情况下,直接读取系统数据就OK...
  • 软件介绍手机文件日志是一款非常给力的日志管理的软件,通过扫描让用户了解到手机上面的那些文件作出了什么改变,并且以日志的方式来进行呈现,保证用户能够能够了解到你所想要了解的全部文件的日志内容,这种读取...
  • 网上查了下android手机扫描内存或者SD卡里面的音频或者视频文件,进行显示。但是有些视频或者音频扫描不出来。有其中一个原因是当你添加了一个视频或者音频文件后,手机自身没有重新进行扫描。只有手机重启之后,...
  • Android实现搜索手机内的PDF文件

    千次阅读 热门讨论 2019-09-23 18:01:58
    最近在做结算功能,需要上传发票功能,发票有电子和图片发票...刚开始使用的文件管理器搜索手机内的PDF文件,在4.4系统上面打开文件管理器可以过滤掉非.pdf格式文件,在6.0及以上系统没有过滤掉,用的是intent打开u...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,536
精华内容 10,214
关键字:

安卓手机如何扫描文件