返回

Android KitKat 从 DocumentsContract URI 获取 SD 卡真实路径

Android

从 URI 获取真实路径:Android KitKat 新存储访问框架

概述

在 Android 4.4(KitKat)引入新的存储访问框架之前,从 SD 卡获取真实路径是一件相对简单的事情。然而,新框架改变了 Intent.ACTION_GET_CONTENT 返回的数据格式,这给开发者带来了挑战。本文将探讨如何解决此问题,并提供一种在 Android KitKat 及更高版本上从 URI 获取真实路径的方法。

背景

在 KitKat 之前,MediaStore.Images.Media.EXTERNAL_CONTENT_URI 可以用于查询外部存储设备上的图像文件。但是,在 KitKat 及更高版本中,Intent.ACTION_GET_CONTENT 返回了 DocumentsContract.Document 类型的 URI,其格式如下:

content://com.android.providers.media.documents/document/image:62

获取真实路径

要从 DocumentsContract URI 获取 SD 卡上的真实路径,请按照以下步骤操作:

  1. 提取 DocumentId

    DocumentId 是 URI 中冒号后面的数字。使用 DocumentsContract.getDocumentId() 方法提取它。

  2. 查询媒体提供程序

    使用 ContentResolver.query() 方法查询 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,并指定 DocumentId 作为筛选条件。

  3. 获取真实路径

    从返回的游标中获取文件的真实路径,这是 MediaStore.Images.Media.DATA 列的值。

示例代码

以下 Java 代码演示了如何从 DocumentsContract URI 获取真实路径:

public String getRealPathFromUri(Uri uri) {
    String documentId = DocumentsContract.getDocumentId(uri);
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
            projection,
            MediaStore.Images.Media._ID + " = ?",
            new String[] { documentId },
            null);
    if (cursor != null && cursor.moveToFirst()) {
        String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
        cursor.close();
        return path;
    }
    return null;
}

注意事项

需要注意的是,此方法仅适用于媒体提供程序 URI。对于其他类型的 URI,需要使用其他方法来获取真实路径。

常见问题解答

1. 我为什么需要获取真实路径?

在某些情况下,您需要获取文件的真实路径才能对其进行操作。例如,您可能需要将文件上传到服务器或将其保存到设备的特定位置。

2. 有没有其他方法来获取真实路径?

还有其他方法可以获取真实路径,但这些方法可能不适用于所有情况。例如,您可以使用 File.getAbsolutePath(),但它可能返回 null。

3. Android KitKat 中是否还有其他存储访问框架更改?

是的,Android KitKat 还有其他存储访问框架更改。例如,不再允许应用程序直接写入外部存储设备。

4. 这些更改对我的应用程序有什么影响?

这些更改可能会对您的应用程序产生重大影响。您需要确保应用程序与新存储访问框架兼容。

5. 在哪里可以找到有关新存储访问框架的更多信息?

有关新存储访问框架的更多信息,请参阅 Android 开发人员文档。

结论

获取 SD 卡上的真实路径对于执行某些操作是必要的。在 Android KitKat 及更高版本上,使用 DocumentsContract URI 而不是 MediaStore.Images.Media.EXTERNAL_CONTENT_URI。通过遵循本文提供的步骤,您可以成功从 URI 获取真实路径并充分利用 Android 新存储访问框架。