簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM