我成功地实现了从相册中检索图像的方法,通过ACTION_PICK
意图返回的Uri
来获取真实路径。以下是示例:
// 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秒)。
额外的好处是,我被允许删除外部存储权限,这是不需要使用应用程序的本地目录的。
对我来说没有外部路径了!
FileOutputStream(yourFullPath).use { oStream -> contentResolver.openInputStream(uri)?.use { iStream -> oStream.write(iStream.readBytes()) } }
。 - Stanley Wintergreen