📅  最后修改于: 2023-12-03 15:36:48.573000             🧑  作者: Mango
在 Android 中,数据可以以不同的形式存储,包括文件系统和数据库。对于开发者来说,有时需要将内容 URI 转换为文件路径,以在应用程序中使用存储的文件。这篇文章将介绍内容 URI 到文件路径的转换方法。
要将内容 URI 转换为文件路径,首先需要获取内容 URI。可以使用 Intent
或 ContentResolver
来获取内容 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
}
}
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
列,它包含了文件的完整路径。
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;
}
在转换内容 URI 为文件路径的过程中,有些内容 URI 可能无法转换为文件路径,例如返回的 URI 可能是 content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/abc.mp3
,它是一个虚拟文件,没有实际的文件路径。因此,必须先验证要转换的 URI 是否可以转换为文件路径,否则可能会导致应用程序崩溃。
本文介绍了两种将内容 URI 转换为文件路径的方法,在使用它们时需要注意要验证要转换的 URI 是否可以转换为文件路径。这对于想对存储的文件进行操作的开发者来说是非常有用的。