📜  内容 uri 到文件路径 android (1)

📅  最后修改于: 2023-12-03 15:36:48.573000             🧑  作者: Mango

内容 URI 到文件路径 Android

在 Android 中,数据可以以不同的形式存储,包括文件系统和数据库。对于开发者来说,有时需要将内容 URI 转换为文件路径,以在应用程序中使用存储的文件。这篇文章将介绍内容 URI 到文件路径的转换方法。

1. 获取内容 URI

要将内容 URI 转换为文件路径,首先需要获取内容 URI。可以使用 IntentContentResolver 来获取内容 URI。例如,使用 Intent 启动一个选择文件的活动,可以在 onActivityResult 方法里获取内容 URI:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICKFILE_REQUEST_CODE && resultCode == RESULT_OK) {
        Uri contentUri = data.getData();
        // TODO: Convert content URI to file path
    }
}
2. 转换成文件路径
2.1 使用 getContentResolver() 方法

Android 提供了一个 getContentResolver() 方法,可以用来获取 ContentResolver 对象,通过这个对象可以对数据进行操作。使用 ContentResolver 中的 query() 方法可以查询指定的内容 URI,返回一个 Cursor 对象,其中包含文件的信息。可以使用 Cursor 对象中的 _data 列来获取文件路径。

public static String getFilePathFromContentUri(Context context, Uri contentUri) {
    ContentResolver contentResolver = context.getContentResolver();
    String[] projection = {MediaStore.Images.Media.DATA};
    Cursor cursor = contentResolver.query(contentUri, projection, null, null, null);
    if (cursor == null) {
        return null;
    }
    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String filePath = cursor.getString(columnIndex);
    cursor.close();
    return filePath;
}

以上是一个获取图片文件路径的方法。MediaStore.Images.Media.DATA 表示 _data 列,它包含了文件的完整路径。

2.2 使用 DocumentFile

另一个方法是使用 DocumentFile 类,通过这个类可以对文件进行访问。可以使用 DocumentFile.fromSingleUri() 方法将内容 URI 转换为 DocumentFile 对象,然后调用 DocumentFile.getUri() 方法获取文件的 URI,再使用 Uri.getPath() 方法获取文件路径。

public static String getFilePathFromContentUri(Context context, Uri contentUri) {
    DocumentFile documentFile = DocumentFile.fromSingleUri(context, contentUri);
    String filePath = documentFile.getUri().getPath();
    return filePath;
}
3. 注意事项

在转换内容 URI 为文件路径的过程中,有些内容 URI 可能无法转换为文件路径,例如返回的 URI 可能是 content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/abc.mp3,它是一个虚拟文件,没有实际的文件路径。因此,必须先验证要转换的 URI 是否可以转换为文件路径,否则可能会导致应用程序崩溃。

4. 总结

本文介绍了两种将内容 URI 转换为文件路径的方法,在使用它们时需要注意要验证要转换的 URI 是否可以转换为文件路径。这对于想对存储的文件进行操作的开发者来说是非常有用的。