Подтвердить что ты не робот

Проверить навигационную панель

Я пытаюсь проверить, присутствует ли панель навигации Android для загрузки, чтобы я мог правильно настроить макет, есть ли у кого-нибудь предложения?

Это панель навигации, которую я пытаюсь обнаружить: enter image description here

P.S. Все, что я нашел до сих пор, - это "плохие" способы попробовать и удалить панель, которую я не хочу делать.

4b9b3361

Ответ 1

Пришло время, но я нашел более надежный способ, чем полагаться на hasPermanentMenuKey(), который не работает для более новых телефонов, таких как HTC One, которые имеют нет клавиши меню, но у вас есть ключи дома и назад, поэтому не нужно (или показывать) мягкую навигационную панель. Чтобы обойти это, попробуйте следующий код, который также проверяет кнопку возврата:

boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);

if(!hasMenuKey && !hasBackKey) {
    // Do whatever you need to do, this device has a navigation bar
}

Ответ 2

Нет надежного способа проверки панели навигации. Используя KeyCharacterMap.deviceHasKey, вы можете проверить, имеются ли на устройстве определенные физические ключи, но эта информация не очень полезна, поскольку устройства с физическими клавишами могут по-прежнему иметь панель навигации. Устройства, такие как OnePlus One или любое устройство, работающее с пользовательским ромом, имеют опцию в настройках, которые отключают физические клавиши, и добавляет панель навигации. Нет способа проверить, включен ли этот параметр, и deviceHasKey по-прежнему возвращает значение true для ключей, которые отключены этой опцией.

Это самое близкое, что вы можете получить:

boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);

if (hasBackKey && hasHomeKey) {
    // no navigation bar, unless it is enabled in the settings
} else {
    // 99% sure there a navigation bar
}

Если кнопка "Назад" и "Дом" не являются физически присутствующими на устройстве, у нее должна быть панель навигации, потому что пользователь вообще не сможет перемещаться. Тем не менее, вы никогда не сможете быть уверены в этом на 100%, так как производители могут реализовать deviceHasKey неправильно.

Ответ 3

Вот быстрый ответ, который сочетает решения Pauland и Philask. Боюсь, что у меня недостаточно приборов для тестирования, если они работают повсюду. Мне было бы интересно услышать другие результаты.

boolean hasNavBar(Context context) {
    Resources resources = context.getResources();
    int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
    if (id > 0) {
        return resources.getBoolean(id);
    } else {    // Check for keys
        boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
        boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
        return !hasMenuKey && !hasBackKey;
    }
}

Ответ 4

Другое решение (часть моего класса UtilsUISystem)

    public static boolean hasNavBar (Resources resources)
    {
        //Emulator
        if (Build.FINGERPRINT.startsWith("generic"))
            return true;

        int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
        return id > 0 && resources.getBoolean(id);
    }

Ответ 5

вы можете добавить этот код к своей активности в метод onCreate():

 View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
        (new View.OnSystemUiVisibilityChangeListener() {
            @Override
            public void onSystemUiVisibilityChange(int visibility) {
                if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
                    // TODO: The navigation bar is visible. Make any desired
                    // adjustments to your UI, such as showing the action bar or
                    // other navigational controls.
                } else {
                    // TODO: The navigation bar is NOT visible. Make any desired
                    // adjustments to your UI, such as hiding the action bar or
                    // other navigational controls.
                }
            }
        });

Ответ 6

Этот метод работал у меня

    int id = getResources().getIdentifier("config_showNavigationBar","bool","android");
        boolean result = id > 0 && getResources().getBoolean(id);
//
        if(result) {

            // Do whatever you need to do, this device has a soft Navigation Bar
        }

Он работал у меня и тестировался на многих устройствах.

Ответ 7

Что-то, что должно работать лучше, - это измерить экран.

Начиная с API 17 там getWindowManager().getDefaultDisplay().getRealSize(), который можно сравнить с размером, возвращаемым getWindowManager().getDefaultDisplay().getSize().

Если у вас разные результаты, я считаю безопасным сказать, что есть панель навигации, и если вы получаете те же результаты, ее нет. Одна вещь, на которую стоит обратить внимание, это ваш целевой SDK и поддерживаемые экраны, что может привести к масштабированию результата getSize(), если Android считает, что ваше приложение не будет работать на текущем устройстве без масштабирования.

Ниже API 17 вы можете измерить экран с помощью getWindowManager().getDefaultDisplay().getMetrics() как в ландшафтном, так и в портретном режимах, и, опять же, разные результаты, вероятно, означают наличие навигационной панели.

Однако, если вы получите те же результаты, вы на самом деле не знаете, так как телефоны могут удерживать навигационную панель на более коротком краю даже в ландшафте. Понятно, что если ширина или высота на 4-8% меньше стандартных размеров, таких как 1280x800, 1280x720, 1024x600, в то время как другое измерение равно, то снова, вероятно, есть навигация бар. Не делайте ставку на это. Слишком много разрешений, которые слишком мало отличаются друг от друга, чтобы это хорошо работало.

Ответ 8

boolean hasNavBar(Context context) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        // navigation bar was introduced in Android 4.0 (API level 14)
        Resources resources = context.getResources();
        int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
        if (id > 0) {
            return resources.getBoolean(id);
        } else {    // Check for keys
            boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
            boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
            return !hasMenuKey && !hasBackKey;
        }
    } else {
        return false;
    }
}

Ответ 9

Я вижу ответы выше, я хочу указать что "не существует" можно рассматривать как высоту 0; поэтому это может быть так:

public static int getScreenH(Context context) {
    DisplayMetrics dm = new DisplayMetrics();
    dm = context.getResources().getDisplayMetrics();
    int h = dm.heightPixels;
    return h;
}

public static int getDpi(Context context) {

    DisplayMetrics displayMetrics1 = context.getResources().getDisplayMetrics();
    int height1 = displayMetrics1.heightPixels;

    int dpi = 0;
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();

    @SuppressWarnings("rawtypes")
    Class c;
    try {
        c = Class.forName("android.view.Display");
        @SuppressWarnings("unchecked")
        Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
        method.invoke(display, displayMetrics);
        dpi = displayMetrics.heightPixels;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return dpi;
}

public static int getBottomStatusHeight(Context context) {
    int totalHeight = getDpi(context);

    int contentHeight = getScreenH(context);

    return totalHeight - contentHeight;
}

`` `

Ответ 10

Решение. Только устройства без постоянных аппаратных клавиш имеют панель навигации, поэтому вы можете проверить версию API и использовать hasPermanentMenuKey() для поиска аппаратных клавиш

 boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();