Android KitKat 从 DocumentsContract URI 获取 SD 卡真实路径
2024-03-22 09:09:46
从 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 卡上的真实路径,请按照以下步骤操作:
-
提取 DocumentId
DocumentId 是 URI 中冒号后面的数字。使用 DocumentsContract.getDocumentId() 方法提取它。
-
查询媒体提供程序
使用 ContentResolver.query() 方法查询 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,并指定 DocumentId 作为筛选条件。
-
获取真实路径
从返回的游标中获取文件的真实路径,这是 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 新存储访问框架。