2014-12-21 2 views
1

Short проблемаAndroid: DisplayMetrics densityDpi возвращает ноль на укорененных устройств

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>, но мне кажется, что значения по умолчанию - это те, которые мне нужны.

Кто-нибудь знает причину, по которой это происходит, и, возможно, исправить?

Спасибо

ответ

2

Похоже коренится телефоны не всегда возвращают значение densityDpi. Я решил это, добавив это в конце кода в мой вопрос. плотность, кажется, возвращена правильно.

if (size == 0) { 
     size = (int) (metrics.density * 48); 
    } 
+0

Использование 'density' также работало для меня, когда я столкнулся с этой проблемой в эмуляторе Genymotion с разрешением 240x320. – Sam

Смежные вопросы