脚本宝典收集整理的这篇文章主要介绍了【Fix Bug】针对 Google Photos 返回的图片Uri,裁剪照片失败,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
content://com.google.andROId.apps.photos.contentPRovider/-1/1/content://media/external/images/media/80/ORIginAL/NONE/image/jPEg/122783088
content://media/external/images/media/80
因为 Google Photos 返回的照片 Uri 不能被解析,所以导致无法加载图片进行裁剪。
有其他小伙伴提出的办法比较简单,首先获取 Google Photos 照片 Uri 的输入流,然后将 输入流 转为 bitmap 插入到媒体库,插入完成后会返回一个 媒体库 新的 uri ,此时这个 uri 就是我们想要的能被正确解析的格式。
核心代码如下:
// java
// 1. 获取 Google Photos 照片 Uri 的输入流,并转为 Bitmap
InputStream is = context.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);
// 2. 将 bitmap 保存到手机本地相册中获取返回的 uri
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
bitmap.comPress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), bitmap, "temp", null);
// 能被正确解析的 uri
Uri result = Uri.parse(path);
在选择照片并裁剪的流程中,增加一个照片墙的页面。即先将手机相册中的图片 uri 读取出来,然后展示在照片墙页面,用户在照片墙页面选择想要的照片。照片的 uri 此时是我们从媒体库中读取的,是可以被正确解析的格式。
核心代码如下:
// kotlin
// 判断是谷歌相册返回的 uri。如果后续谷歌的规则发生并更,这里也需要更改
val googlePrefix = "content://com.google.android.apps.photos.contentprovider"
val newUri = if (uri.toString().startsWith(googlePrefix, true)) {
// 处理谷歌相册返回的图片
saveimageToCache(context, uri)
}
/**
* 将谷歌相册图片保存到外置存储目录,然后返回 uri
*/
private suspend fun saveImageToCache(context: Context, uri: Uri): Uri {
val imageName = "${System.currentTimeMillis()}.jpg"
val parent = if (environment.MEDIA_mountED == Environment.getExternalStoragestate()) {
context.externalCacheDir?.absolutePath
} else {
context.cacheDir?.absolutePath
}
val path = parent + File.separator + imageName
withContext(Dispatchers.IO) {
copyInputStream(context, uri, path)
}
val result = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
FileProvider.getUriForFile(
context, "${context.packageName}.fileprovider",
File(parent, imageName)
)
} else {
Uri.FromFile(File(path))
}
"uri: $result".LOGV()
return result
}
/**
* 字节流读写复制文件
* @param context 上下文
* @param uri 图片uri
* @param outputPath 输出地址
*/
private fun copyInputStream(context: Context, uri: Uri, outputPath: String) {
"copy file begin...".logV()
VAR inputStream: InputStream? = null
var outputStream: FileOutputStream? = null
try {
inputStream = context.contentResolver.openInputStream(uri)
outputStream = FileOutputStream(outputPath)
val bytes = ByteArray(1024)
var num: Int
while (inputStream?.read(bytes).also { num = it ?: -1 } != -1) {
outputStream.write(bytes, 0, num)
outputStream.flush()
}
} catch (e: Exception) {
"exception: $e".logE()
} finally {
try {
outputStream?.close()
inputStream?.close()
"copy file end...".logV()
} catch (e: IOException) {
"exception: $e".logE()
}
}
}
RegisterForResultActivity
以上是脚本宝典为你收集整理的【Fix Bug】针对 Google Photos 返回的图片Uri,裁剪照片失败全部内容,希望文章能够帮你解决【Fix Bug】针对 Google Photos 返回的图片Uri,裁剪照片失败所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。