android 获取文件uri,Android:从内容URI获取文件URI?

本文介绍了一个在Android 19及以上版本中,从`content://` URI获取文件或文件夹绝对路径的方法。该方法适用于外部存储和主存储,并通过`DocumentsContract`进行操作。然而,虽然能读取和打开文件,但无法直接用于删除SD卡上的文件。如果需要删除文件,可以创建`DocumentFile`实例并调用其`getUri()`方法得到`file:///`形式的URI。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你有一个file:///的内容Uri,你可以使用此方法获取Android 19或更高版本的文件夹或文件的绝对路径。

public static String getPath(final Context context, final Uri uri) {

final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

// DocumentProvider

if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

System.out.println("getPath() uri: " + uri.toString());

System.out.println("getPath() uri authority: " + uri.getAuthority());

System.out.println("getPath() uri path: " + uri.getPath());

// ExternalStorageProvider

if ("com.android.externalstorage.documents".equals(uri.getAuthority())) {

final String docId = DocumentsContract.getDocumentId(uri);

final String[] split = docId.split(":");

final String type = split[0];

System.out.println("getPath() docId: " + docId + ", split: " + split.length + ", type: " + type);

// This is for checking Main Memory

if ("primary".equalsIgnoreCase(type)) {

if (split.length > 1) {

return Environment.getExternalStorageDirectory() + "/" + split[1] + "/";

} else {

return Environment.getExternalStorageDirectory() + "/";

}

// This is for checking SD Card

} else {

return "storage" + "/" + docId.replace(":", "/");

}

}

}

return null;

}

您可以检查Uri的每个部分是否使用println。 下面列出了SD卡和设备主存储器的返回值。 您可以访问和删除文件是否在内存中但我无法使用此方法从SD卡中删除文件,只能读取或打开d使用此绝对路径的图像。 如果您找到了使用此方法删除的解决方案,请分享。SD卡

getPath() uri: content://com.android.externalstorage.documents/tree/612E-B7BF%3A/document/612E-B7BF%3A

getPath() uri authority: com.android.externalstorage.documents

getPath() uri path: /tree/612E-B7BF:/document/612E-B7BF:

getPath() docId: 612E-B7BF:, split: 1, type: 612E-B7BF

主记忆

getPath() uri: content://com.android.externalstorage.documents/tree/primary%3A/document/primary%3A

getPath() uri authority: com.android.externalstorage.documents

getPath() uri path: /tree/primary:/document/primary:

getPath() docId: primary:, split: 1, type: primary

如果您希望在获得路径后使用file:///获取Uri

DocumentFile documentFile = DocumentFile.fromFile(new File(path));

documentFile.getUri() // will return a Uri with file Uri

获取文件 URI 的方法取决于文件的来源和您的应用程序的运行环境。以下是几种获取文件 URI 的常见方法: 1. 从本地存储器获取文件 URI: ```java File file = new File(Environment.getExternalStorageDirectory(), "example.txt"); Uri uri = Uri.fromFile(file); ``` 2. 从应用程序资源获取文件 URI: ```java Uri uri = Uri.parse("android.resource://com.example.myapp/raw/example"); ``` 3. 从 ContentProvider 获取文件 URI: ```java Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); ``` 上述方法仅适用于 Android 7.0 及以下版本。从 Android 7.0 开始,您需要使用 FileProvider 来安全地共享文件 URI。使用 FileProvider 可以确保您的应用程序只能访问您明确授权的文件。 以下是使用 FileProvider 获取文件 URI 的示例代码: ```xml <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` ```java File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "example.jpg"); Uri uri = FileProvider.getUriForFile(this, "com.example.myapp.fileprovider", file); ``` 请注意,您需要在 AndroidManifest.xml 文件中注册 FileProvider,并在 res/xml 文件夹中创建 file_paths.xml 文件来指定要共享的文件路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值