[英]Installation fail - New app replacing old app, but works on Android 4.4
[英]New warning in Android 4.4
我最近注意到這些異常(已被捕獲但記錄在logcat中):
W/System.err( 2612): java.lang.RuntimeException: Canvas: trying to use a non-premultiplied bitmap android.graphics.Bitmap@535924e0
W/System.err( 2612): at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1088)
W/System.err( 2612): at android.graphics.Canvas.<init>(Canvas.java:139)
System.err( 2612): at com.example.imaging.ImageHelper.addShadow(ImageHelper.java:553)
我已經嘗試了解這個異常意味着什么(以及非預乘的位圖),但我不確定是什么導致了這個異常。 我們從服務器獲取的圖像是問題,還是我們在本地做的事情? (這不是導致異常的這一行,但它是其中之一)。
作為參考,我在這里添加了有問題的方法並突出顯示導致異常的方法:
public static Bitmap addShadow(Bitmap bitmap) {
try {
BlurMaskFilter blurFilter = new BlurMaskFilter(12, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);
shadowPaint.setShadowLayer(12, -3, -3, Color.parseColor("#33000000"));
int[] offsetXY = new int[2];
Bitmap shadowImage = bitmap.extractAlpha(shadowPaint, offsetXY);
Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true);
Canvas c = new Canvas(shadowImage32); // exception occurs here <----
c.drawBitmap(bitmap, -offsetXY[0], -offsetXY[1], null);
return shadowImage32;
} catch (Exception e) {
e.printStackTrace();
}
return bitmap; // if error return the original bitmap
}
我在完全相同的代碼中面臨完全相同的問題,但我需要在Android代碼中解決這個問題,而不是更改應用程序外的圖像,因為我正在使用從用戶設備加載的圖像。
在canvas調用之前我發現了以下內容:
// Fix the non pre-multiplied state.
if ( !shadowImage32.isPremultiplied() )
{
shadowImage32.setPremultiplied( true );
}
這里的問題是我的最小API級別為10, isPremultiplied()需要API 17,而setPremultiplied(true)需要API 19。
編輯:我已經使用帶有API 10的設備進行了測試,並且沒有這樣的Exception,所以我想在API 19中他們引入了預乘法處理和異常。 所以,最后,我的代碼有以下幾行:
// Fix the non pre-multiplied exception for API 19+.
if ( android.os.Build.VERSION.SDK_INT >= 19 && !shadowImage32.isPremultiplied() )
{
shadowImage32.setPremultiplied( true );
}
參考Xavi的回答,用一個非常古老的代碼我用反射調用了這個方法(以支持新設備):
if ( android.os.Build.VERSION.SDK_INT >= 19 )
{
try {
java.lang.reflect.Method method = shadowImage32.getClass().getMethod("setPremultiplied",boolean.class);
method.invoke(shadowImage32, true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.