Android 使用 Picasso 应用转换时,某些用户的应用程序崩溃
Android app crashes for some users when applying transformation with Picasso
我构建了一个应用程序,一些用户(管理员)可以在我的网页上登录到管理员帐户并更改一些内容,例如应用程序中的背景图片。作为后端,我使用 Parse.com,应用程序从那里加载其背景图像。我正在使用 Picasso 在应用程序中加载背景图片。在某些活动中,我希望背景模糊,所以我使用 this 模糊转换并使用以下代码加载图像:
int apiVersion = android.os.Build.VERSION.SDK_INT;
if(apiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
// Blur the image
final BlurTransformation blurTransformation = new BlurTransformation(this, 20);
// Load the background image with blur
Picasso.with(this)
.load(backgroundPictureURL)
.transform(blurTransformation)
.into(backgroundView);
} else {
// Load the background image without blur
Picasso.with(this)
.load(backgroundPictureURL)
.into(backgroundView);
}
我已经启用了 Parse 的崩溃报告,但我现在收到报告称某些用户在尝试应用模糊转换时该应用程序崩溃了。这是我收到的堆栈跟踪:
java.lang.RuntimeException: Transformation blurred crashed with exception.
com.squareup.picasso.BitmapHunter.run BitmapHunter.java:434
android.os.Handler.handleCallback Handler.java:739
android.os.Handler.dispatchMessage Handler.java:95
android.os.Looper.loop Looper.java:135
android.app.ActivityThread.main ActivityThread.java:5254
java.lang.reflect.Method.invoke Native Method
java.lang.reflect.Method.invoke Method.java:372
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run ZygoteInit.java:898
com.android.internal.os.ZygoteInit.main ZygoteInit.java:693
Caused by: android.renderscript.RSIllegalArgumentException: Bitmap has an unsupported format for this operation
android.renderscript.Allocation.validateBitmapFormat Allocation.java:537
android.renderscript.Allocation.copyTo Allocation.java:1257
se.myapplication.main.CustomUI.BlurTransformation.transform BlurTransformation.java:60
com.squareup.picasso.BitmapHunter.applyCustomTransformations BitmapHunter.java:429
com.squareup.picasso.BitmapHunter.hunt BitmapHunter.java:238
com.squareup.picasso.BitmapHunter.run BitmapHunter.java:159
java.util.concurrent.Executors$RunnableAdapter.call Executors.java:422
java.util.concurrent.FutureTask.run FutureTask.java:237
java.util.concurrent.ThreadPoolExecutor.runWorker ThreadPoolExecutor.java:1112
java.util.concurrent.ThreadPoolExecutor$Worker.run ThreadPoolExecutor.java:587
java.lang.Thread.run Thread.java:818
com.squareup.picasso.Utils$PicassoThread.run Utils.java:411
堆栈跟踪所指的模糊转换 class 中的代码行是这一行:
output.copyTo(blurredBitmap);
图像格式为 jpg 或 png,在我的 phone 和模拟器上尝试时,没有问题,所以崩溃似乎只发生在某些用户身上,他们似乎Android 5.0.1 和 5.0.2(就像我一样,对我来说没有问题)。
我对此一无所知,非常感谢您的帮助!是什么导致了这个问题,我该如何解决?
来自您的错误日志:
Caused by: android.renderscript.RSIllegalArgumentException: Bitmap has an unsupported format for this operation
他们正在使用位图图像。尽管通常您可以在应用操作之前检查元数据,但大多数服务不会,它们只是按文件名过滤(如 *.img、*.jpg、*.png)。
我曾经参与过一个项目,有时文件以某种方式生成,然后重新呈现为 bmp,以增加它们的 "quality"。虽然图像是 bmp 编码的,但它们被保存为 .jpg 名称。据我所知,这似乎很常见,特别是从互联网上获取的图像(名称和内容不匹配)
在 Marcin Koziński 的 this post 中找到了第 5 步和第 6 步的解决方案!
我构建了一个应用程序,一些用户(管理员)可以在我的网页上登录到管理员帐户并更改一些内容,例如应用程序中的背景图片。作为后端,我使用 Parse.com,应用程序从那里加载其背景图像。我正在使用 Picasso 在应用程序中加载背景图片。在某些活动中,我希望背景模糊,所以我使用 this 模糊转换并使用以下代码加载图像:
int apiVersion = android.os.Build.VERSION.SDK_INT;
if(apiVersion >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
// Blur the image
final BlurTransformation blurTransformation = new BlurTransformation(this, 20);
// Load the background image with blur
Picasso.with(this)
.load(backgroundPictureURL)
.transform(blurTransformation)
.into(backgroundView);
} else {
// Load the background image without blur
Picasso.with(this)
.load(backgroundPictureURL)
.into(backgroundView);
}
我已经启用了 Parse 的崩溃报告,但我现在收到报告称某些用户在尝试应用模糊转换时该应用程序崩溃了。这是我收到的堆栈跟踪:
java.lang.RuntimeException: Transformation blurred crashed with exception.
com.squareup.picasso.BitmapHunter.run BitmapHunter.java:434
android.os.Handler.handleCallback Handler.java:739
android.os.Handler.dispatchMessage Handler.java:95
android.os.Looper.loop Looper.java:135
android.app.ActivityThread.main ActivityThread.java:5254
java.lang.reflect.Method.invoke Native Method
java.lang.reflect.Method.invoke Method.java:372
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run ZygoteInit.java:898
com.android.internal.os.ZygoteInit.main ZygoteInit.java:693
Caused by: android.renderscript.RSIllegalArgumentException: Bitmap has an unsupported format for this operation
android.renderscript.Allocation.validateBitmapFormat Allocation.java:537
android.renderscript.Allocation.copyTo Allocation.java:1257
se.myapplication.main.CustomUI.BlurTransformation.transform BlurTransformation.java:60
com.squareup.picasso.BitmapHunter.applyCustomTransformations BitmapHunter.java:429
com.squareup.picasso.BitmapHunter.hunt BitmapHunter.java:238
com.squareup.picasso.BitmapHunter.run BitmapHunter.java:159
java.util.concurrent.Executors$RunnableAdapter.call Executors.java:422
java.util.concurrent.FutureTask.run FutureTask.java:237
java.util.concurrent.ThreadPoolExecutor.runWorker ThreadPoolExecutor.java:1112
java.util.concurrent.ThreadPoolExecutor$Worker.run ThreadPoolExecutor.java:587
java.lang.Thread.run Thread.java:818
com.squareup.picasso.Utils$PicassoThread.run Utils.java:411
堆栈跟踪所指的模糊转换 class 中的代码行是这一行:
output.copyTo(blurredBitmap);
图像格式为 jpg 或 png,在我的 phone 和模拟器上尝试时,没有问题,所以崩溃似乎只发生在某些用户身上,他们似乎Android 5.0.1 和 5.0.2(就像我一样,对我来说没有问题)。
我对此一无所知,非常感谢您的帮助!是什么导致了这个问题,我该如何解决?
来自您的错误日志:
Caused by: android.renderscript.RSIllegalArgumentException: Bitmap has an unsupported format for this operation
他们正在使用位图图像。尽管通常您可以在应用操作之前检查元数据,但大多数服务不会,它们只是按文件名过滤(如 *.img、*.jpg、*.png)。
我曾经参与过一个项目,有时文件以某种方式生成,然后重新呈现为 bmp,以增加它们的 "quality"。虽然图像是 bmp 编码的,但它们被保存为 .jpg 名称。据我所知,这似乎很常见,特别是从互联网上获取的图像(名称和内容不匹配)
在 Marcin Koziński 的 this post 中找到了第 5 步和第 6 步的解决方案!