`
rain_2372
  • 浏览: 683214 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

android应用 获取本地指定类型文件 的两种最优方法

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

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

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

    广播的方式

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

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
分享到:
评论

相关推荐

    android如何获取相片的拍摄日期

    在Android系统中,获取照片的拍摄日期以及其他相关信息是通过读取图像文件的元数据来实现的。这些元数据通常存储在JPEG文件的Exchangeable Image File Format (EXIF) 标签中。以下是一些关键步骤和知识点,教你如何...

    android中读取本地文件demo

    在Android平台上,开发人员经常需要处理读取本地文件的需求,特别是在构建阅读类应用或文档管理器时。这个“android中读取本地文件demo”提供了一个示例,演示了如何读取存储在SD卡上的Word和PDF文件,并将它们的...

    android获取应用32位签名

    本文将深入探讨如何获取Android应用的32位签名,以及这个过程的重要性。 首先,我们需要理解Android应用签名的基本概念。在Android系统中,签名是一个数字证书,它包含了开发者的信息和用于验证APK的公钥。这个签名...

    Android7.0 Intent打开文件管理器 获取文件真实路径

    Android7.0 Intent打开文件管理器 获取文件真实路径。虽然网上很多demo,但是没有一个能够兼容所有Android机的,去网上学习了然后自己亲测过手机分别有Android7.0/6.0/4.3个版本。

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    JNI是Android提供的一种接口,使得Java应用程序可以调用C/C++编写的原生代码。这在需要高性能计算、访问硬件特性或利用已有的C库时特别有用。JNI的核心在于`JNIEnv`指针,它是Java虚拟机与本地代码之间的桥梁,提供...

    Android中获取后台正在运行的应用列表

    在Android设备中,按Back键会将当前的Activity出栈销毁,而按HOME键却会将之隐藏到后台。如若有多个这样的程序这样操作,我们不知道后台到底有多少个正在运行的应用程序。此程序的目的就列举出后台正在运行的应用...

    android获取本地及拍照的图片

    在Android开发中,获取本地图片和拍照功能是常见的应用场景,比如在社交应用或者个人资料编辑界面。本篇文章将详细介绍如何实现在Android应用中获取本地图片并显示在`ImageButton`上,以及如何调用相机拍摄新照片并...

    Android中获取应用程序(包)的信息 PackageManager的使用

    2. **获取应用元数据**:使用`getApplicationInfo()`方法,可以获取指定包名的应用的`ApplicationInfo`对象,该对象包含了应用的元数据,如标签、图标、是否是系统应用等。 3. **获取应用标签和图标**:`...

    用LogWriter将Android应用程序的日志信息写入文件

    `LogWriter`是一个自定义工具,用于将Android应用的日志信息写入本地文件,而不是仅仅依赖于系统的`Logcat`。这使得开发者能够更方便地保存、查看和分析日志数据,尤其是在设备无法连接到电脑或需要离线分析的情况下...

    android jni获取 Mac地址

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...

    android应用开发范例精解

    第2篇为应用开发篇,通过实例介绍了Android UI布局、Android人机界面、手机硬件设备的使用、Android本地存储系统、Android中的数据库、多线程设计、Android传感器、Android游戏开发基础、Android与Internet,以及...

    android从指定文件夹中显示图片

    在Android平台上,从指定文件夹显示图片涉及到一系列的步骤和技术,包括文件系统操作、图片加载库的使用以及UI设计。以下是对这个主题的详细讲解: 首先,我们需要理解Android的文件系统结构。Android设备通常有两...

    Android中获取系统内存信息以及进程信息

    不过,由于隐私限制,这个方法在Android 3.1及以上版本只能获取到当前应用或被授予`GET_TASKS`权限的应用的信息。 ```java ActivityManager.RunningTaskInfo taskInfo; List&lt;ActivityManager.RunningTaskInfo&gt; ...

    android 将assets 下的文件复制到手机内存中

    在Android开发中,有时我们需要将应用内部的资源文件,如配置文件、数据库文件或静态数据等,复制到手机的外部存储(内存或SD卡)以便于应用运行时使用。这个过程通常涉及到Android的文件系统操作和权限管理。下面将...

    Android读取文本文件的demo

    在Android开发中,读取文本文件是常见的任务,特别是在创建应用程序需要展示或处理文本数据时。这个"Android读取文本文件的demo"就是一个很好的学习示例,它演示了如何从res/raw目录下读取txt文件并将其内容显示在...

    Android中获取应用程序(包)的大小-----PackageManager的使用(二)

    获取`PackageInfo`有两种主要方式: 1. **通过包名查询**:使用`getPackageInfo(String packageName, int flags)`方法。传入应用的包名(例如"com.example.app")和标志(例如`GET_INSTALLED_PACKAGES`或`GET_SIZE_...

    android打开各种文件

    在Android系统中,打开各种类型的文件是一个常见的需求,这...通过上述方法,Android开发者可以轻松地实现根据文件类型自动打开相应应用程序的功能。记得在处理文件时始终考虑到用户体验和安全性,避免出现潜在的问题。

    android使用socket上传、下载文件

    本篇将详细讲解如何在Android应用中使用Socket进行文件的上传和下载操作。 首先,理解Socket的基本概念:Socket是应用程序与网络协议之间的接口,它允许两个网络应用程序通过TCP/IP协议进行通信。在Android中,我们...

    android获取程序详细权限列表

    `doInBackground`方法获取了指定包名的应用的`PackageInfo`对象,其中包含了`requestedPermissions`字段,这是一个字符串数组,列出了应用申请的所有权限。 需要注意的是,为了运行上述代码,你需要确保你的应用...

    Android如何获得网络资源的大小

    注意,这个方法返回的是整型值,对于较大的文件可能会溢出,因此对于大文件,推荐使用`getContentLengthLong()`获取long类型的结果。 6. **异常处理**:如果`getContentLength()`返回的值小于等于0,则可能意味着...

Global site tag (gtag.js) - Google Analytics