精华内容
下载资源
问答
  • 很想知道扫描垃圾文件的时候扫描的哪些文件,以及逻辑是如何处理的,求解答,做毕业设计,希望指导一下!
  • 网上查了下android手机扫描内存或者SD卡里面的音频或者视频文件,进行显示。但是有些视频或者音频扫描不出来。有其中一个原因是当你添加了一个视频或者音频文件后,手机自身没有重新进行扫描。只有手机重启之后,...
     网上查了下android手机扫描内存或者SD卡里面的音频或者视频文件,进行显示。但是有些视频或者音频扫描不出来。有其中一个原因是当你添加了一个视频或者音频文件后,手机自身没有重新进行扫描。只有手机重启之后,手机自身才会进行扫描,才能使用传统的扫描方法扫描出视频、音频文件来。
     所以可以自行添加一个扫描手机内存的方法,在扫描完之后,再使用传统的视频、音频文件获取方式获取来获取。
    

    以下两个方法是用来启动扫描的广播使用的:

        //扫描SD卡的文件
        public void SendReceive_Scand_outside_Music(){
            IntentFilter intentfilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED);
            // intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
            intentfilter.addDataScheme("file");
            ScanSdOutsideReceive scanSdReceiver = new ScanSdOutsideReceive();
            MyApp.getInstance().registerReceiver(scanSdReceiver, intentfilter);
            mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
            //        MyApp.getInstance().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
    //       Uri.parse("file://" + Environment.getExternalStorageDirectory().getAbsolutePath())));
    
        }
    
        //扫描内存的文件
        public void SendReceive_Scand_inside_Music(){
            IntentFilter intentfilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_FINISHED);
            // intentfilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
            intentfilter.addDataScheme("file");
            ScanSdInsideReceive scanSdReceiver = new ScanSdInsideReceive();
            MyApp.getInstance().registerReceiver(scanSdReceiver, intentfilter);
            mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + Environment.getDataDirectory())));
        }  

    以下的办法就是扫描文件的广播:

    public class ScanSdOutsideReceive extends BroadcastReceiver{
    
    
        //private AlertDialog.Builder  builder = null; 
        //private AlertDialog ad = null; 
    //    private int count1; 
    //    private int count2; 
    //    private int count; 
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)){
    //            Cursor c2 = context.getContentResolver() 
    //            .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
    //                    new String[]{MediaStore.Audio.Media.TITLE, 
    //                    MediaStore.Audio.Media.DURATION, 
    //                    MediaStore.Audio.Media.ARTIST, 
    //                    MediaStore.Audio.Media._ID, 
    //                    MediaStore.Audio.Media.DISPLAY_NAME }, 
    //                    null, null, null);
            }
        }
    }
    public class ScanSdInsideReceive extends BroadcastReceiver{
    
    
        //private AlertDialog.Builder  builder = null; 
        //private AlertDialog ad = null; 
    //    private int count1; 
    //    private int count2; 
    //    private int count; 
        @Override 
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction(); 
     if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(action)){ 
    //            Cursor c2 = context.getContentResolver() 
    //            .query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
    //                    new String[]{MediaStore.Audio.Media.TITLE, 
    //                    MediaStore.Audio.Media.DURATION, 
    //                    MediaStore.Audio.Media.ARTIST, 
    //                    MediaStore.Audio.Media._ID, 
    //                    MediaStore.Audio.Media.DISPLAY_NAME }, 
    //                    null, null, null); 
            }    
        } 
    }

    执行完扫描的广播之后。再调用获取手机的视频、音频的文件方法,也就是我上面所说的传统的获取方式:

    获取视频:

                ContentResolver contentResolver = mContext.getContentResolver();
                Cursor cursor = contentResolver.query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);
    
    //          Cursor cursor = mContext.getContentResolver().query(
    //                  MediaStore.Video.Media.EXTERNAL_CONTENT_URI, null, null,
    //                  null, null);
                if (cursor != null) {
                    while (cursor.moveToNext()) {
                        int id = cursor.getInt(cursor
                                .getColumnIndexOrThrow(MediaStore.Video.Media._ID));
                        String title = cursor
                                .getString(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.TITLE));
                        String album = cursor
                                .getString(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.ALBUM));
                        String artist = cursor
                                .getString(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.ARTIST));
                        String displayName = cursor
                                .getString(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME));
                        String mimeType = cursor
                                .getString(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.MIME_TYPE));
                        String path = cursor
                                .getString(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.DATA));
                        long duration = cursor
                                .getInt(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.DURATION));
                        long size = cursor
                                .getLong(cursor
                                        .getColumnIndexOrThrow(MediaStore.Video.Media.SIZE));
    
    
                            }
                        }
    
                    }
                    cursor.close();
                }
    

    获取音频:

            // ContentProvider(内容提供者) 和 ContentResolver(内容解析器),用于管理和发布和应用程序相关的持久性数据
            ContentResolver resolver = mContext.getContentResolver();
            //  String[] projection = new String[]{MediaStore.Video.Media.TITLE};
            Cursor cursor = resolver.query(
                    MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null,
                    MediaStore.Audio.Media.DEFAULT_SORT_ORDER);
            if (null == cursor) {
                return null;
            }
            cursor.moveToFirst();
            if (cursor.moveToFirst()) {
                do {
                    RingItem m = new RingItem();
    //自己建的类,用于存放查询到的音乐信息
    //播放音乐是用的是创建MediaPlayer实例,为其传递音乐文件的路径
                    long id = 0;
                    String title = null;
                    String arrtist = null ;
                    String album=null;
                    long size=0;
                    long duration=0;
                    String url =null;
                    String name=null;
                    if(cursor.getColumnIndex(MediaStore.Audio.Media._ID)!=-1)
                        id = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media._ID));        //音乐id
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)!=-1)
                        title = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); // 标题
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)!=-1)
                        arrtist = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.ARTIST)); // 歌手
                    if ("<unknown>".equals(arrtist)) {
                        arrtist = MyApp.getInstance().getResources().getString(R.string.unknow_artist);
                    }
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)!=-1)
                        album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); // 专辑图片
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE)!=-1)
                        size = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.SIZE)); // 大小
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)!=-1)
                        duration = cursor.getLong(cursor .getColumnIndex(MediaStore.Audio.Media.DURATION)); // 时长
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)!=-1)
                        url = cursor.getString(cursor .getColumnIndex(MediaStore.Audio.Media.DATA)); // 音乐文件的路径
                    if(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)!=-1)
                        name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));// 音乐文件名
                    if(url!=null&&duration>0){
                        File file = new File(url);
                        if (file.exists()) {
    
    //此处添加music,音乐信息,到列表
    
                        }
                    }
                } while (cursor.moveToNext());
            }
            if (cursor != null) {
    //结果集移动到最后一列,再下移为空;释放资源
                cursor.close();
            }
    展开全文
  •  通过手机,把手写的文字转化成电子文字,无需任何的扫描仪,只要手机拍照,马上就能将纸的文字提取到你的手机上。拍照识别文字就用这招!  拍照识别文字,其实这项技术,也是借助于这几年AI的技术突飞猛进,...
    //有效的路由 API
    
    //navigateTo
    //navigateBack
    uni.navigateTo({
        url: '../test/test',
        animationType: 'pop-in',
        animationDuration: 200
    });
    uni.navigateBack({
        delta: 1,
        animationType: 'pop-out',
        animationDuration: 200
    });

     今天给大家介绍的是手写文字用手机拍照来转换成电子版的操作方法。

             手写的文字如何识别,在线拍照识别文字。    通过手机,把手写的文字转化成电子文字,无需任何的扫描仪,只要手机拍照,马上就能将纸上的文字提取到你的手机上。拍照识别文字就用这招!

          拍照识别文字,其实这项技术,也是借助于这几年AI的技术突飞猛进,目前图片的自动识别已经变得非常的容易了,通过拍照,就可以将我们传统的资料书籍马上变成电子文档中的文字。

          你只要使用手机,拍照,通过软件就可以自动识别出你拍照的图片里包含的文字,目前的AI技术发展,机器人已经能自动识别97%以上的准确度了。偶尔一些文字,技术没认出来的,你修改下就可以了。

        下面这个就是我们介绍的可以用来拍照识别的,界面如下,功能很多,各种识别都可以,你选择你需要识别的内容即可快速识别。在结果识别出来以后,你可以点击全部复制,将识别的结果复制发送给微信好友,或者点击发送到电脑上,一键直接发送到你的电脑里。

      除了我们日常生活中使用到拍照识别文字,在一些工作中我们也会遇到这样的情况,在各大企业都实现电子化办公以后,许多单位需要把一些过往的纸质版公文资料转换成电子档案,以便在需要时从电脑中调阅。但限于人力有限,无法全部一一录入,甚至也不太可能全部让人工来录入,不然工作量很大,而且录入也很枯燥,还容易出错,那么,如何把手头上的传统纸质资料快速地变成电子版?这就成了一个很现实的问题了。

        其实,用我们自己的手机就能实现了,通过手机拍照,然后使用软件程序通过将拍照的图片转为文字,就可以实现了,这些文字你可以粘贴到word文档里,做成word文稿发给其他同事,就这样轻松实现了将传统的资料转为电子文档或者电子书了。

       我们现在给大家介绍的这款软件就可以实现拍照识别图片中的文字,同时这款软件还实现了一些其他垂直行业的应用,你也许也能使用到的,比如增值税发票的自动识别功能,识别身份证,识别银行卡,拍照识别汽车、拍照识别植物和花卉等等功能,现在借助我们介绍的这个小程序就可以实现了。想要识别什么,选择就可以马上识别了!

     

         基于目前的AI技术发展,我们也正在不断的开发各种实用的功能,欢迎大家使用体验。如果有什么问题,或者需要开发其他更多的应用场景的,也欢迎联系我,我们这边可以为你开发。比如你这边有特定的纸质的表格文件,通过我们通用的文字识别,没有形成特定规则的文字,需要区分不同的表格的行和列等功能,我们都可以单独给你订制开发这样的功能。

     

     

    如需了解更多欢迎留言互动或者私信小编一起交流探讨 xwy7775

    展开全文
  • 项目中用ZXing做的二维码扫描,部分6.0的手机上扫描变形了,网上找了老半天终于是修改成功了,记录下解决办法。修改CameraConfigurationManager.java下的findBestPreviewSizeValue()方法中的一句代码:float ...

    项目中用ZXing做的二维码扫描,在部分6.0的手机上扫描变形了,网上找了老半天终于是修改成功了,记录下解决办法。

    修改CameraConfigurationManager.java下的findBestPreviewSizeValue()方法中的一句代码:

    float newDiff = Math.abs(screenResolution.x * 1.0f / newY - screenResolution.y * 1.0f / newX);
    private static Point findBestPreviewSizeValue(
                CharSequence previewSizeValueString, Point screenResolution) {
            int bestX = 0;
            int bestY = 0;
            float diff = Integer.MAX_VALUE;
            for (String previewSize : COMMA_PATTERN.split(previewSizeValueString)) {
    
                previewSize = previewSize.trim();
                int dimPosition = previewSize.indexOf('x');
                if (dimPosition < 0) {
                    Log.w(TAG, "Bad preview-size: " + previewSize);
                    continue;
                }
    
                int newX;
                int newY;
                try {
                    newX = Integer.parseInt(previewSize.substring(0, dimPosition));
                    newY = Integer.parseInt(previewSize.substring(dimPosition + 1));
                } catch (NumberFormatException nfe) {
                    Log.w(TAG, "Bad preview-size: " + previewSize);
                    continue;
                }
    
    //          int newDiff = Math.abs(newX - screenResolution.x) + Math.abs(newY - screenResolution.y);
                float newDiff = Math.abs(screenResolution.x * 1.0f / newY - screenResolution.y * 1.0f / newX);
                if (newDiff == 0) {
                    bestX = newX;
                    bestY = newY;
                    break;
                } else if (newDiff < diff) {
                    bestX = newX;
                    bestY = newY;
                    diff = newDiff;
                }
    
            }
    
            if (bestX > 0 && bestY > 0) {
                return new Point(bestX, bestY);
            }
            return null;
        }
    展开全文
  • android手机文件快速扫描,并归类

    万次阅读 热门讨论 2018-04-13 17:34:54
    一、前言 我使用我们的App的时候...下面不多说,先效果图(实现的UI可以各位自行实现,我这里只是提供文件扫描功能的实现)。 - 说明: 我们这个文件扫描是基于 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不是唯一的吗?不是与文件类型一一对应的吗?

    展开全文
  • 我想扫描手机上所有的.txt文件,查了网上的资料,大多采用的是递归扫描所有文件再判断文件类型的方法。 但是这样特别慢啊!ListView要很久才能加载完成。求教各位大神,有没有什么好的方法?小弟跪谢。
  • 我做的winform通过USB读取手机指定文件,向手机指定文件夹中写文件。但是扫描不到手机盘符和盘符下的文件,通过文件选择控件选到的手机文件路径也都是电脑的临时文件路径。求高手解答
  • android系统启动时会去扫描系统文件,并将系统支持的视频文件(mp4,3gp,wmv)扫描到媒体库(MediaStore)中,下面代码演示如何获得这些文件的信息: [java] view plaincopy public ...
  • 首先是扫描本地所有的音频文件,然后全部装进集合当中,接下来就是用ListView展示屏幕,大概就是这几个步骤了,接下来细讲 1,创建一个容器  进行过数据解析的朋友都应该知道JavaBean吧,用来装载解析出来的...
  • public static List allVideoList = null;// 视频信息集合 allVideoList = new ArrayList(); getVideoFile(allVideoList,Environment....// 获得视频文件 private void getVideoFile(final List li
  • Android系统扫描音频文件详解

    千次阅读 2017-09-21 14:06:56
    扫描文件MediaScannerService类的ServiceHandler中:private final class ServiceHandler extends Handler { @Override public void handleMessage(Message msg) { Bundle argumen
  • 现在来分享一下自己工作中具体是如何实现扫描二维码进行下载的。 生成二维码 草料二维码生成器https://cli.im/ 比如上面这个网站,可以在线生成二维码,然后打开手机上面可以扫描二维码的应用,就可以看到...
  • 我们最常常遇到的也就是保存图片到SD卡,然后打开系统的图库可以看得到,可是为什么微信QQ之类的应用可以,我们保存...这里要声明一点,后边的扫描要用到获取文件的Mimetype,不知道怎么获取的人看这里:http://blog.c
  • 直接代码: 下面这是获取扫描视频的代码。 package com.mediaplayer.utils; import java.util.ArrayList; import java.util.List; import com.mediaplayer.domain.VideoInfo; import android.co
  •  通过手机,把手写的文字转化成电子文字,无需任何的扫描仪,只要手机拍照,马上就能将纸的文字提取到你的手机上。拍照识别文字就用这招!  拍照识别文字,其实这项技术,也是借助于这几年AI的技术突飞猛进,...
  • Android使用MediaStore获取手机上文件

    万次阅读 2019-06-19 21:49:33
    一、MediaStore简介 MediaStore是android系统提供的一个多媒体...MediaStore.Files: 共享的文件,包括多媒体和非多媒体信息 MediaStore.Audio: 存放音频信息 MediaStore.Image: 存放图片信息 MediaStore.Vedio...
  • 是这样的,我做了一个简单的音乐播放器,其中使用了MediaStore获取手机里的mp3文件,并把mp3文件信息放到一个ListView中作为歌曲列表。 还有一个功能就是通过网络下载mp3文件。但是下载完成之后,歌曲列表里却不会...
  • 遇到一个需求,要用手机扫描纸质面单,获取面单的手机号,最后决定用tesseract这个开源OCR库,移植到Android平台是tess-two Android平台tess-two地址:https://github.com/tesseract-ocr 我把手机号扫描的算法...
  • 关于媒体文件扫描,我们需要弄明白两个问题: 1.什么时候开启媒体文件扫描 2.如何解析媒体文件(音频,视频,图片)信息插入到数据库中,对应code流程我们现在音乐,视频播放器,图库等应用关于音视频图片等信息都是...
  • Android 实现 Ocr手机扫描

    万次阅读 热门讨论 2018-01-16 17:27:00
    之前做手机扫描,更换了很多方案,过程中的笔记都这篇文章里,有兴趣可以看看 Ocr使用流程:http://blog.csdn.net/mr_sk/article/details/72877492 这里把算法整理了一下,封装了一个library(含Demo),地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,996
精华内容 22,398
关键字:

如何在手机上扫描文件