1

キャンバスを表示するための ImageView を持つアプリにウィジェットがあります。

ユーザークラッシュを調べると、そのエラーが非常に頻繁に表示されます(ただし、常にいくつかのデバイスでのみ):

 java.lang.RuntimeException: Unable to start receiver my.package.name.WidgetProvider: java.lang.IllegalArgumentException: RemoteViews for widget update exceeds maximum bitmap memory usage (used: 5715000, max: 5529600 /*these arent always the same :)*/ ) The total memory cannot exceed that required to fill the device's screen once.

私のキャンバスには動的なサイズがあり、ユーザーがサイズを変更すると自動的にサイズが変更され、指定されたアスペクト比があります。次のように作成されます。

Resources r = context.getResources();
    SharedPreferences widgets = context.getSharedPreferences("widgets", 0);

            //these are stored in onAppWidgetOptionsChanged when user resizes his widget
    int w = widgets.getInt(widgetId + "_width", 130);
    int h = widgets.getInt(widgetId + "_height", 160);

    w = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, w,
            r.getDisplayMetrics());
    h = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, h,
            r.getDisplayMetrics());

    float scaleX = (float) w / (float) 13;
    float scaleY = (float) h / (float) 16;

    float scale = 1.5f * (scaleX < scaleY ? scaleX : scaleY);//i multiplied it with 1.5 because the canvas was very unsharp

    w = (int) (13 * scale);
    h = (int) (16 * scale);

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
            R.layout.widget);


    Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_4444);
    Canvas canvas = new Canvas(bmp);


 [...]

    remoteViews.setImageViewBitmap(R.id.widget, bmp);

    appWidgetManager.updateAppWidget(widgetId, remoteViews);

キャンバスがウィジェットよりも 1.5​​ 倍大きいためだと思いますが、それ以外は非常に不鮮明です。

私に何ができる?

前もって感謝します。

メチンケール

4

1 に答える 1

1

ドキュメントでは、次のように指定されています。

RemoteViews オブジェクトが使用するビットマップ メモリの合計は、画面を 1.5 倍にするのに必要な量を超えることはできません。(画面幅 x 画面高さ x 4 x 1.5) バイト。

したがって、それを使用してビットマップのサイズを制御し、レイアウトで ImageView scaleType fitCenter を使用して、ウィジェットのビットマップに合わせてスケーリングします。

于 2013-10-26T05:29:32.690 に答える