返回

Android KitKat中图库URI变化的解决方案:如何在不同版本中提取文件路径?

Android

Android KitKat中图库URI变化的解决方法

简介

在Android 4.4(KitKat)之前,Intent.ACTION_GET_CONTENT返回的URI是直观的,可以轻松地提取文件路径。然而,在KitKat中,图库的URI发生了变化,使得文件路径的提取变得更加复杂。

问题

KitKat中的图库URI类似于content://com.android.providers.media.documents/document/image:3951。与之前不同,这个URI不再包含文件路径。

解决方法

为了在KitKat及更高版本中处理此问题,我们需要使用DocumentsContractMediaStore的组合:

  1. 获取文件ID: 提取冒号后面的文件ID,如上例中的“3951”。
  2. 创建ContentResolver: 获取设备文件系统的访问权限。
  3. 查询MediaStore: 使用文件ID查询MediaStore以检索文件路径。

代码示例

以下是一个代码示例,演示如何在KitKat及更高版本中从Intent.ACTION_GET_CONTENT获取文件路径:

// ...

String documentId = DocumentsContract.getDocumentId(uri);
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = contentResolver.query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    projection,
    MediaStore.Images.Media._ID + " = ?",
    new String[]{documentId},
    null
);

int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
String filePath = cursor.getString(columnIndex);
cursor.close();

// ...

结论

通过使用DocumentsContractMediaStore的组合,我们可以解决Android KitKat中图库URI变化的问题,并从设备中获取文件路径。

常见问题解答

1. 为什么KitKat中的URI发生了变化?

URI变化是为了增强安全性,防止未经授权的应用程序访问设备上的文件。

2. 除了使用DocumentsContract,还有其他方法可以解决这个问题吗?

可以通过将ACTION_OPEN_DOCUMENTFLAG_OPEN_DOCUMENT标志结合使用,使用传统的API来访问文件。但是,这种方法已被弃用,不建议使用。

3. 该解决方法适用于所有文件类型吗?

是的,该解决方法适用于图片、视频、音频等所有文件类型。

4. 如何在非KitKat设备上实现该解决方法?

在非KitKat设备上,DocumentsContract不存在。因此,不需要任何特殊处理。

5. 是否存在任何第三方库可以简化文件路径提取过程?

有许多第三方库可以简化文件路径提取过程,例如:

  • Glide
  • Picasso
  • UriUtil