1

ショート問題

DisplayMetrics.densityDpi は、ルート化されたデバイスではゼロのようです。

長い問題

アプリで次のコードを使用しています。

public static int getIconSize(Activity activity) {

    int size;

    DisplayMetrics metrics = new DisplayMetrics();
    activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);

    switch (metrics.densityDpi) {
    case DisplayMetrics.DENSITY_LOW:
        size = 36;
        break;
    case DisplayMetrics.DENSITY_MEDIUM:
        size = 48;
        break;
    case DisplayMetrics.DENSITY_TV:
        size = 64;
        break;
    case DisplayMetrics.DENSITY_HIGH:
        size = 72;
        break;
    case DisplayMetrics.DENSITY_XHIGH:
        size = 96;
        break;
    case DisplayMetrics.DENSITY_400:
        size = 120;
        break;
    case DisplayMetrics.DENSITY_XXHIGH:
        size = 144;
        break;
    case DisplayMetrics.DENSITY_560:
        size = 168;
        break;
    case DisplayMetrics.DENSITY_XXXHIGH:
        size = 192;
        break;
    default:
        size = (int) (metrics.densityDpi * (3/10));
    }   
    return size;
}

これを使用して、実行時にアプリによって作成されるアイコンをスケーリングし、他のアプリから取得したアイコンをスケーリングします。これらのアイコンは常に適切なサイズであるとは限らないためです。

これはうまく機能しますが、(一部の)ルート化されたデバイスでは失敗するようです。サイズはゼロとして返されるため、コードから、metrics.densityDpi はゼロに等しくなければならないと結論付けることができます。(これをテストするためのルート化された電話はありません)

マニフェストのセクションを調べました<supports-screens>が、デフォルト値が必要なもののようです。

これが起こっている理由とおそらく修正を知っている人はいますか?

ありがとうございました

4

1 に答える 1

2

ルート化された電話が常に DensityDpi の値を返すとは限らないようです。質問のコードの最後にこれを追加することでこれを解決しました。密度が正しく返されるようです。

    if (size == 0) {
        size = (int) (metrics.density * 48);
    }
于 2014-12-21T19:31:46.713 に答える