如何获取通过MediaStore保存到外部存储的图片的绝对路径?
解决方案
你现在需要获取通过MediaStore保存到Pictures目录的图片绝对路径实现分享,可以按以下步骤调整代码:
步骤1:修改图片保存方法,获取保存后对应的Uri
原saveImage方法仅返回布尔值标识保存结果,需要调整逻辑返回保存成功后的MediaStore Uri,修改后的代码如下:
private fun saveImage(mbitmap: Bitmap?): Uri? { // 调整返回值为Uri,成功返回对应Uri,失败返回null if (mbitmap == null) return null val displayName = "Drawing" + System.currentTimeMillis() / 1000 val imageCollection = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY) } else { MediaStore.Images.Media.EXTERNAL_CONTENT_URI } val contentValues = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "$displayName.jpeg") put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") put(MediaStore.Images.Media.WIDTH, mbitmap.width) put(MediaStore.Images.Media.HEIGHT, mbitmap.height) // 可选:指定存储到Pictures根目录,安卓10及以上生效 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) } } return try { val savedUri = contentResolver.insert(imageCollection, contentValues) ?: throw IOException("无法创建MediaStore条目") contentResolver.openOutputStream(savedUri).use { outputStream -> if (!mbitmap.compress(Bitmap.CompressFormat.JPEG, 95, outputStream)) { throw IOException("Bitmap保存失败") } } savedUri } catch (e: IOException) { e.printStackTrace() null } }
调用该方法后,将返回的Uri保存为全局变量,如需获取绝对路径可以基于这个Uri查询。
步骤2:通过Uri查询图片绝对路径
如果确实需要拿到本地绝对路径,添加以下工具方法即可实现查询:
private fun getRealPathFromUri(uri: Uri): String? { val projection = arrayOf(MediaStore.Images.Media.DATA) contentResolver.query(uri, projection, null, null, null)?.use { cursor -> if (cursor.moveToFirst()) { val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) return cursor.getString(columnIndex) } } return null }
调用getRealPathFromUri(你拿到的保存后Uri)即可得到绝对路径,赋值给你的savedImagePath全局变量即可适配原分享逻辑。
更适配高版本系统的分享方案(无需获取绝对路径)
Android 10及以上版本已经不推荐直接操作文件绝对路径,你可以直接用拿到的Uri完成分享,适配性更强,修改后的分享代码如下:
private fun shareImage() { // 全局保存的图片Uri非空时执行分享 globalSavedImageUri?.let { uri -> val sharedIntent = Intent().apply { action = Intent.ACTION_SEND putExtra(Intent.EXTRA_STREAM, uri) type = "image/jpeg" // 给目标应用临时授予Uri读取权限,避免分享失败 addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } startActivity(Intent.createChooser(sharedIntent, "分享到")) } }
内容的提问来源于stack exchange,提问作者Sarthak Kumar
相关产品推荐
相关产品推荐

