zoukankan      html  css  js  c++  java
  • android应用 获取本地指定类型文件 的两种最优方法

    刚因为项目有需求,需求移动应用获取本地文件有下面两个

    第一个是指定要搜索的目录,第二个是文件类型,譬如“*.jpg;*.png;*.gif”.

    从资料中查询得到有多种方法,主要有两一种,一种是直接查询,另一种方式是利用广播的方式

    1. 广播的方式

    通过主动的方式通知系统我们需要文件列表,要向系统发送广播

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(“file://
    + Environment.getExternalStorageDirectory())));

    然后通过接收器获取系统文列表

    public class MediaScannerReceiver extends BroadcastReceiver
    {
        private final static String TAG = ”MediaScannerReceiver”;
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Uri uri = intent.getData();
            String externalStoragePath = Environment.getExternalStorageDirectory().getPath();
            if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
                // scan internal storage
                scan(context, MediaProvider.INTERNAL_VOLUME);
            } else {
                if (uri.getScheme().equals(“file”)) {
                    // handle intents related to external storage
                    String path = uri.getPath();
                    if (action.equals(Intent.ACTION_MEDIA_MOUNTED) &&
                            externalStoragePath.equals(path)) {
                        scan(context, MediaProvider.EXTERNAL_VOLUME);
                    } else if (action.equals(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE) &&
                            path != null && path.startsWith(externalStoragePath + ”/”)) {
                        scanFile(context, path);
                    }
                }
            }
        }
        private void scan(Context context, String volume) {
            Bundle args = new Bundle();
            args.putString(“volume”, volume);
            context.startService(
                    new Intent(context, MediaScannerService.class).putExtras(args));
        }
        private void scanFile(Context context, String path) {
            Bundle args = new Bundle();
            args.putString(“filepath”, path);
            context.startService(
                    new Intent(context, MediaScannerService.class).putExtras(args));
        }
    }
    注意部分:
    
    通过 Intent.ACTION_MEDIA_MOUNTED 进行全扫描
    
    通过 Intent.ACTION_MEDIA_SCANNER_SCAN_FILE 扫描某个文件
    
    上述方法是不支持对文件夹的 即:Uri data 必须是 文件的Uri  如果是文件夹的 其不会起作用的 切记!
    
    方法二 直接查找
          这种方法是最原始的方法,通过获取文件目录递归来查询文件
           正面是主要实现:
    /**
    
    * 获取指定位置的指定类型的文件
    
    *
    
    * @param path
    
    *            文件夹路径
    
    * @param type
    
    *            文件类型(如“*.jpg;*.png;*.gif”)
    
    * @return
    
    */
    
    public static void getFileList(String path, String type,
    
    final OnFileListCallback onFileListCallback) {
    
     
    
    new AsyncTask<String, String, String>() {
    
    ArrayList<FileInfo> list = new ArrayList<FileInfo>();
    
    @Override
    
    protected void onPostExecute(String result) {
    
    onFileListCallback.SearchFileListInfo(list);
    
    }
    
     
    
    @Override
    
    protected String doInBackground(String… params) {
    
    // TODO Auto-generated method stub
    
     
    
    String path = params[1].substring(params[1]
    
    .lastIndexOf(“.”) + 1);
    
    File file = new File(params[0]);
    
    scanSDCard(file,path,list);
    
    return null;
    
    }
    
     
    
    }.execute(path, type, “”);
    
    }
    
     
    
    /**
    
    * 扫描完成后的回调,获取文件列表必须实现
    
    *
    
    * @author cola
    
    *
    
    */
    
    public interface OnFileListCallback {
    
    /**
    
    * 返回查询的文件列表
    
    * @param list 文件列表
    
    */
    
    public void SearchFileListInfo(List<FileInfo> list);
    
    }
    
     
    
    private static void scanSDCard(File file, String ext, ArrayList<FileInfo> list) {
    
    if (file.isDirectory()) {
    
    File[] files = file.listFiles();
    
    if (files != null) {
    
    for (int i = 0; i < files.length; i++) {
    
    File tmp = files[i];
    
    if (tmp.isFile()) {
    
    String fileName = tmp.getName();
    
    String filePath = tmp.getName();
    
    if (fileName.indexOf(“.”) >= 0) {
    
    fileName = fileName.substring(fileName
    
    .lastIndexOf(“.”) + 1);
    
    if (ext != null && ext.equalsIgnoreCase(fileName)) {
    
    AspLog.i(TAG, filePath);
    
    FileInfo info = new FileInfo();
    
    info.fileName = filePath;
    
    info.filePath = tmp.getAbsolutePath();
    
    list.add(info);
    
    }
    
    }
    
    } else
    
    scanSDCard(tmp, ext, list);
    
    }
    
    }
    
    } else {
    
    if (file.isFile()) {
    
    String fileName = file.getName();
    
    String filePath = file.getName();
    
    if (fileName.indexOf(“.”) >= 0) {
    
    fileName = fileName
    
    .substring(fileName.lastIndexOf(“.”) + 1);
    
    if (ext != null && ext.equalsIgnoreCase(fileName)) {
    
    AspLog.i(TAG, filePath);
    
    FileInfo info = new FileInfo();
    
    info.fileName = filePath;
    
    info.filePath = file.getAbsolutePath();
    
    list.add(info);
    
    }
    
    }
    
    }
    
    }
    
    }

    本文地址:http://www.yidin.net/?p=9493

    更多资料:http://www.yidin.net/discuz

    更多相关的资料请到我的博客www.yidin.net 留言

    欢迎各位同学加入 android 技术二群 222392467 

  • 相关阅读:
    Spring学习,初识Spring
    Spring学习整理
    表单验证一些思考
    为什么要使用mybaits
    JDBC缺点分析
    Java 学习笔记提高篇
    Java基础学习笔记(四)
    Java基础学习笔记(三)
    Java学习笔记(二)
    centos7运行级别和图形界面相关操作
  • 原文地址:https://www.cnblogs.com/ondream/p/2992483.html
Copyright © 2011-2022 走看看