如何获取可直接用于Glide的Android有效图片路径?
解决Glide无法加载
/external/images/media/119格式路径的问题 首先明确:你拿到的/external/images/media/119不是真实文件路径,它是MediaStore中图片对应的内容URI的路径部分,直接传给Glide肯定报错;而你用Cursor查_data返回null,是因为Android 10(API 29)及以上系统限制了_data列的访问,不再返回真实文件路径。
最优解决方案:直接用Content Uri加载Glide
不需要转成文件路径,Glide原生支持加载Content Uri,你只需要把这个路径补全为合法的Content Uri即可:
// 把你的路径拼接成完整的Content Uri val mediaUri = Uri.parse("content://media${yourPath}") // 直接传给Glide加载 Glide.with(context) .load(mediaUri) .into(yourImageView)
比如你的路径是/external/images/media/119,拼接后就是content://media/external/images/media/119,直接用这个Uri就能让Glide正常加载。
为什么原来的方法无效?
Android 10及以上引入了分区存储机制,禁止APP直接访问外部存储的真实文件路径,MediaStore查询中的_data列不再返回有效路径,所以你通过cursor获取的path会是null。
若确实需要获取可访问的文件路径(不推荐)
如果业务必须拿到文件路径,可以通过ContentResolver打开输入流,将文件复制到APP的私有目录后使用:
fun getCopiedImagePath(context: Context, uri: Uri): String? { try { context.contentResolver.openInputStream(uri)?.use { inputStream -> val outputFile = File(context.cacheDir, "temp_image_${System.currentTimeMillis()}.jpg") FileOutputStream(outputFile).use { outputStream -> inputStream.copyTo(outputStream) } return outputFile.absolutePath } } catch (e: Exception) { e.printStackTrace() } return null }
但这种方式会产生临时文件,需要注意清理,优先推荐直接用Content Uri加载Glide。
内容的提问来源于stack exchange,提问作者Duseop
相关产品推荐
相关产品推荐

