android - 从 Uri 获取真实路径 - DATA 在 android Q 中已弃用
问题描述
我成功地实现了一种方法,通过Uri
返回的ACTION_PICK
意图从图库中检索图像的真实路径。这是一个示例:
// getRealPathFromURI(intent.getData());
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
就像这个答案一样。
最近更新compileSdkVersion
到29
,显然是每个人都使用的属性已弃用。在官方文档中,他们建议改用FileDescriptor,问题是我不知道具体如何。DATA
我唯一发现的是这个问题。虽然没有找到正确的答案。
请使用建议的方式或任何其他方式帮助我解决该弃用问题。
谢谢你。
更新:
遵循@CommonsWare的 回答并将返回的 Uri(用户选择的图像)复制到本地目录,使用context.getContentResolver.openInputStream(Uri)
.
甚至尝试从 Google Drive 中检索文件 - 并且成功了。唯一的问题是花费了很长时间(5MB 文件大约需要 20 秒)。
作为奖励,我被清除删除外部存储权限,使用应用程序的本地目录不需要该权限。
我没有更多的外部路径!
解决方案
一周前我也提出了这个问题。
我的解决方案是InputStream
从 URI 创建一个,然后OutputStream
通过复制输入流的内容来创建一个。
注意:您可以使用异步调用来调用此方法,因为复制非常大的文件可能会有一些延迟,并且您不想阻塞您的 UI
@Nullable
public static String createCopyAndReturnRealPath(
@NonNull Context context, @NonNull Uri uri) {
final ContentResolver contentResolver = context.getContentResolver();
if (contentResolver == null)
return null;
// Create file path inside app's data dir
String filePath = context.getApplicationInfo().dataDir + File.separator
+ System.currentTimeMillis();
File file = new File(filePath);
try {
InputStream inputStream = contentResolver.openInputStream(uri);
if (inputStream == null)
return null;
OutputStream outputStream = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0)
outputStream.write(buf, 0, len);
outputStream.close();
inputStream.close();
} catch (IOException ignore) {
return null;
}
return file.getAbsolutePath();
}
推荐阅读
- typescript - 打字稿通用与联合
- sql - 如何将现有数据中的 24 小时转换为 12 小时
- file - 如何检查文件中的 IP 地址有效性?
- sql - SQL Server bcp 实用程序导出/写入不完整的数据
- django - django中的QuesrySet错误
- python - 如何离线安装 Pytorch?
- php - 我怎样才能让我的销售价格与我的正常价格有不同的颜色?
- windows - 如何在windows的“omnidb”中将csv文件数据导入postgresql
- gradle - 如何改进并行 gradle 构建的构建失败报告?
- ios - 如何将触摸绘制的路径与给定的贝塞尔路径进行比较?