android - Android:从 SD 卡中文件的 Uri 获取文件路径
问题描述
我们正在尝试获取保存在 SD 卡中的文件的路径,以传递给实用程序。但是,当我们使用 URI 打开游标时,只获取了两列,缺少路径(_data 列)。请让我知道如何获取路径。该查询适用于内部存储中的任何文件。
方案是“内容”。
代码片段
cursor = context.getContentResolver().query(uri, null, null, null, null);
if (null != cursor && cursor.moveToFirst())
{
int testcolCount = cursor.getColumnCount();
for (int i = 0; i < testcolCount; i++)
{
String colName = cursor.getColumnName(i);
String colValue = cursor.getString(i);
System.out.println("" + i + ": " + colName + ":" + colValue + "\n");
}
//This prints only two columns, _display_name and _size
}
解决方案
根本不要尝试获取路径,Android 10 及更高版本的应用程序私有目录之外的文件路径是无用的,因为您无权访问它们。
见https://developer.android.com/training/data-storage#scoped-storage
使用contentResolver
获取 aFileDescriptor
以传递给实用程序
注意来自https://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html#DATA
此常量在 API 级别 29 中已弃用。应用程序可能没有文件系统权限来直接访问此路径。应用程序不应尝试直接打开此路径,而应使用 ContentResolver#openFileDescriptor(Uri, String) 来获得访问权限。
推荐阅读
- amazon-s3 - 使用存储在 Amazon s3 上的公钥获取错误 EXTERNAL_OAUTH_JWS_CANT_RETRIEVE_PUBLIC_KEY
- wix - 使用 Wix 捆绑升级 MSI 卸载现有应用程序
- android - 在 Google oauth 上执行 android 身份验证时,如何在 google 服务器(google idP)上使用 SHA1 指纹和包名称进行验证?
- ethereum - @MetaMask / detect-provider:处理帐户已更改
- python - 字符串相似度最高的行对
- scala - Apache Spark requiredChildDistribution 和 outputPartitioning 有什么区别?
- java - Google Play 结算 Android
- php - 使用 COALESCE 更新 Mysql 数据库
- sql - 加入后如何获取唯一记录SQL SERVER
- java - 如何将我的绝对数字转换为 ascii 数字(最好没有循环)?