返回

Android 文件选择返回路径:告别繁琐,拥抱优雅

Android

前言

Android 系统中文件选择器是个让人又爱又恨的存在。它看似简单,却总能带来意外的烦恼,尤其是返回文件路径。本文将为你揭示Android文件选择返回路径的奥秘,让你告别繁琐,拥抱优雅。

一、难点剖析

选择文件后,如何获取其路径,这本应是一项简单至极的任务。然而,现实却并非如此。Android系统的碎片化导致了文件选择器的千差万别,各家厂商的自定义实现更是让问题雪上加霜。

二、问题解决方案

面对Android文件选择返回路径的难题,我们总结出以下解决方案:

1. ** 限制文件类型

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*"); // 匹配所有类型文件
intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] {"image/*"}); // 限制为图片类型

2. ** 借助第三方库

RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions
        .request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        .subscribe(new Action1<Boolean>() {
            @Override
            public void call(Boolean granted) {
                if (granted) {
                    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                    intent.setType("*/*"); // 匹配所有类型文件
                    intent.addCategory(Intent.CATEGORY_OPENABLE);

                    try {
                        startActivityForResult(intent, FILE_SELECT_CODE);
                    } catch (ActivityNotFoundException e) {
                        // Handle the exception
                    }
                }
            }
        });

三、返回路径处理

文件选择完成后,根据不同的设备和Android版本,返回路径的形式可能会有所不同。以下是对常见情况的处理方法:

1. ** Uri 路径

Uri uri = data.getData();
String path = uri.getPath();

2. ** 文件符

ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r");
FileDescriptor fd = pfd.getFileDescriptor();

3. ** 内容提供者

Cursor cursor = getContentResolver().query(uri, null, null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME);
cursor.moveToFirst();
String fileName = cursor.getString(columnIndex);

四、实例演示

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == FILE_SELECT_CODE && resultCode == RESULT_OK) {
        if (data != null) {
            Uri uri = data.getData();
            String path = null;

            if (uri.getScheme().equals("content")) {
                // Uri 路径
                path = uri.getPath();
            } else if (uri.getScheme().equals("file")) {
                // 文件符
                ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r");
                FileDescriptor fd = pfd.getFileDescriptor();
                path = fd.toString();
            } else if (uri.getScheme().equals("media")) {
                // 内容提供者
                Cursor cursor = getContentResolver().query(uri, null, null, null, null);
                int columnIndex = cursor.getColumnIndexOrThrow(OpenableColumns.DISPLAY_NAME);
                cursor.moveToFirst();
                path = cursor.getString(columnIndex);
            }

            if (path != null) {
                // 处理文件路径
            } else {
                // 文件路径获取失败
            }
        }
    }
}

五、结语

通过本文的深入剖析和实用解决方案,相信你已经掌握了Android文件选择返回路径的秘诀。从此以后,告别繁琐,拥抱优雅,让文件选择不再成为难题。

后记

随着Android系统的不断更新,文件选择器的实现可能还会发生变化。建议开发者密切关注官方文档和社区讨论,及时掌握最新动态,以便在项目中做出适当的调整。