使用URI中的ParcelFileDescriptor在Android中进行图像选择

时间:2013-12-26 07:07:37

标签: android image android-intent uri

我的应用正在使用ACTION_GET_INTENT创建一个Intent来查找图像mime类型。返回后,我整理了一个冗长而精细的过程,检查数据的意图,从URI的内容解析器获取游标,检查uri.toString()并处理某些URI与其他URI不同。例如,“content://com.google.android.gallery3d”将为“content://com.google.android.apps.docs.storage”等等。

这变得很痛苦,特别是因为KitKat出现并引入了更多的URI来处理。

但是我在一些与SAF和KitKat相关的Google Developer页面上提供了这段建议代码。这似乎完美无缺。我在所有已安装的“文件选择器”类型的应用程序上测试了KitKat,JB和GB设备。它永远不会失败。

**所以我的问题是......这段代码是否可靠?还有什么需要注意的吗? 如果这是首选的方法,为什么这么多SO帖子如何处理从选择图像返回的Intent / URI?

代码示例见于: https://developer.android.com/guide/topics/providers/document-provider.html 请查看“位图”部分。

try {
        final ParcelFileDescriptor parcelFileDescriptor = myContext.getContentResolver().openFileDescriptor(
                imageUri, "r");
        final FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
        final Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fileDescriptor);
        parcelFileDescriptor.close();
        return bitmap;
    } catch (Exception e) {
        Log.e(tag, "Failed to Parse Image Uri", e);
        throw new Exception("failed to parse image uri");
    }

1 个答案:

答案 0 :(得分:0)

您上面提到的代码是所有设备的完美解决方案。因为我们有自动备份文件夹和一些特定的设备uri问题。因此,如果您使用FileDescriptor,它将在所有设备中正常工作。 我也使用了相同的代码并在11.3设备(如2.3.3版本到4.4.2)中进行了测试。 上述代码的优点是: 我们可以从设备库中选择任何图像,包括自动备份文件夹。但是您提到的现有代码不适用于从库中选择视频(仅适用于自动备份文件夹)。