Как проверить цвет строки состояния в Android? - PullRequest
3 голосов
/ 21 апреля 2011

Как проверить цвет строки состояния в Android?

Зачем мне это проверять?Я создал значки в строке состояния в соответствии с рекомендациями по проектированию , однако на некоторых устройствах (Samsung Galaxy S) строка состояния черная и работает под управлением Android 2.1.

Рекомендации по статусузначки панели отлично выглядят на Android 2.3 (Nexus S) и в эмуляторе (ранее Android 2.1) со светло-серой строкой состояния по умолчанию.Тем не менее, черные иконки, которые рекомендуются для версии до 2.3, не выглядят четко на Samsung Galaxy S.

Я хотел бы предоставить белый значок, если Android работает под управлением 2.1 или 2.2 с черной строкой состояния.

В основном проблема заключается в том, что рекомендации по дизайну Android на самом деле не охватывают телефоны, которые изменили пользовательский интерфейс, например Samsung Galaxy S. Например, Samsung Galaxy S с Android 2.1 должен иметь светло-серую строку состояния, ноесть черный.Это не вписывается в рекомендации Google по дизайну.

Ответы [ 3 ]

1 голос
/ 29 апреля 2011

С помощью adb (вы найдете в комплекте для разработки под Android) с командой "pull" или просто корневым файловым менеджером, вам нужно получить доступ к /system/framework/framework-res.apk. Распаковать, это как использование zip (!) apktool . Внутри вы найдете растровые изображения графики. Выберите те, которые содержат «статусбар», вы просто посмотрите на них, и вы увидите, хотите ли вы массово с ним или нет.

Самое сложное - вернуть их обратно, для чего вам нужно будет повторно сжать их, с помощью apktool . Растровые изображения имеют дополнительную строку с информацией о том, как их растянуть. Apktool избавляется от них, или, лучше сказать, просто скрывает их.

Действительно сложная часть заключается в том, что вы меняете часы и цвета уведомлений с белого на черный, и для этого вам нужно будет изменить классы.dex, в какую часть я застрял.

Самый простой способ - загрузить и установить CyanogenMod, он позволяет получить доступ к этим параметрам.

Приветствие.

1 голос
/ 21 апреля 2011

Обычно вы предполагаете связать это через файл манифеста, но есть способ получить значение: используйте Build.VERSION.SDK_INT и сравните его с Build.VERSION_CODES, http://developer.android.com/reference/android/os/Build.VERSION.html

выВы можете получить более интересное прочтение в блоге разработчика Android здесь

- edit -

Вам нужно будет выяснить, на каком устройстве вы находитесь BUILD но не забывайте, что у людей тоже есть темы ...

Если не считать разрыва фреймворка и приложения в строке состояния, это будет лучшим ... здесьэто ссылка , если вы хотите попробовать покопаться в StatusBar и получить ее из необработанного Framework.jar ...

Вот ссылка на парня, который упоминает , как онобрабатывается игра в строке состояния.

0 голосов
/ 26 ноября 2013

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

/**
 * Returns estimated value of the lightness of the status bar background
 * @return
 */
private int getStatusBarBackgroundLightValue()
{
    // better this than nothing
    Drawable bg = getResources().getDrawable(android.R.drawable.status_bar_item_background);
    int height = Math.max(1, bg.getIntrinsicHeight());
    int width = Math.max(1, bg.getIntrinsicWidth());
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    bg.setBounds(0, 0, width, height);
    bg.draw(canvas);

    long sum = 0;
    for (int x=0; x<width; x++){
        for (int y=0; y<height; y++){
            int color = bitmap.getPixel(x, y);
            int r = (color >> 16) & 0xFF;
            int g = (color >> 8) & 0xFF;
            int b = (color) & 0xFF;
            int max = Math.max(r, Math.max(g, b));
            int min = Math.min(r, Math.min(g, b));
            int l = (min + max)/2;
            sum = sum + l;
        }
    }
    bitmap.recycle();
    bitmap = null;
    canvas = null;
    bg = null;
    sum = sum / (width * height);
    // should be [0..255]
    return (int)Math.min(255, Math.max(sum, 0));
}
...