我有一个奇怪的情况,不知道如何进一步调试。我需要从图库中获得所选图像的真实的路径,这样我就可以通过API将其上传到服务器。它工作完美,我可以在虚拟Pixel 6 API 25上分辨出来,但在我的真实设备上失败,三星Galaxy S20,API 33。但它只在一些照片上失败。从我可以告诉他们是在应用程序之外拍摄的。如果我用相机拍照,它会得到真实的的路径。如果我以后选择相同的图像,它会得到真实的路径。大多数所有的图像,其中没有采取的应用程序失败。似乎是一些断开与路径可能?
我使用下面的代码来获取真实的的路径:gist.Github
我把范围缩小到了这个代码:
println("DEBUG: Getting uri IS Media:" + uri.path)
val docId = DocumentsContract.getDocumentId(uri)
val split = docId.split(":").toTypedArray()
val type = split[0]
var contentUri: Uri? = null
if ("image" == type) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
} else if ("video" == type) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
} else if ("audio" == type) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
}
val selection = "_id=?"
val selectionArgs = arrayOf(
split[1]
)
println("DEBUG: getDataColumn:" + contentUri.toString()+" , " + selection + " , " + split[1])
val path = getDataColumn(context, contentUri, selection, selectionArgs)
println("DEBUG: getDataColumn Returned: " + path)
return path
上传有效图像时,我的日志具有:
调试:正在获取URI IS媒体:/文档/图像:1000000891
调试:获取数据列:内容://媒体/外部/图像/媒体,_id=?,1000000891
调试:返回getDataColumn:/存储/模拟/0/图片/1672900608138.jpg
在现有图像上,我得到:
调试:正在获取URI IS媒体:/文档/图像:1000000660
调试:获取数据列:内容://媒体/外部/图像/媒体,_id=?,1000000660
调试:返回getDataColumn:无效
有什么线索吗?
1条答案
按热度按时间uoifb46i1#
所以我已经找到了这个问题的解决方案。API 33+他们添加了新的权限,需要读取文件,其中没有添加您的应用程序:
图片和照片:读取介质图像
视频:阅读_媒体_视频
音频文件:读取媒体音频
参见此处以供参考:Android Behavior changes