Android Android обнаруживает навигационную панель Samsung Galaxy S8 скрыть или показать программно

На некоторых устройствах, таких как Samsung S8, панель навигации можно скрыть или показать, что вопрос в каком-то состоянии. Панель навигации Samsung S8 можно скрыть или показать, нажав левую нижнюю кнопку

Я не нашел прямой способ определить, есть ли в исходном коде Android.

И я гуглю некоторые проблемы, такие как Хорошее решение для проверки панели навигации, но это не помогает.

Любая помощь очень ценится.

Ответ 1

Во-первых, укажите оригинального автора: https://www.jianshu.com/p/ddfbabd614b6

Для телефонов Samsung (например, S8, S9 и т.д.) Вы можете определить, отображается ли панель навигации, при прослушивании события Samsung.

private static final String SAMSUNG_NAVIGATION_EVENT = "navigationbar_hide_bar_enabled";

Тогда просто послушай это событие и сделай свое дело:

private void checkNavigationBar() {
    if (isSamsungVersionNougat()) { // check if Samsung phones
        // detect navigation bar
        try {
            // there are navigation bar
            if (Settings.Global.getInt(activity.getContentResolver(), SAMSUNG_NAVIGATION_EVENT) == 0) {
                // Your code
                // example: galleryViewModel.navigationBarHeight.set(getNavigationBarHeight());
            } else { // there are no navigation bar
                // Your code
                // example: galleryViewModel.navigationBarHeight.set(0);
            }
        } catch (Exception ignored) {
        }
        barHideEnableObserver = new BarHideEnableObserver(new Handler());
        activity.getContentResolver().registerContentObserver(
                Settings.Global.getUriFor(SAMSUNG_NAVIGATION_EVENT),
                true, barHideEnableObserver);
    } else {
        galleryViewModel.navigationBarHeight.set(getNavigationBarHeight());
    }
}

Ответ 2

Используйте этот метод, работал у меня. Убедитесь, что представление было отображено первым, чтобы удостовериться, что getHeight() не возвращает 0. Также убедитесь, что rootView, который вы используете, предназначен для просмотра всего экрана.

public static boolean hasNavBar (Activity activity, View rootView) {
    if (activity == null || rootView == null)
        return true;

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
        return true;

    Display d = activity.getWindowManager().getDefaultDisplay();
    DisplayMetrics realDisplayMetrics = new DisplayMetrics();
    d.getRealMetrics(realDisplayMetrics);

    int viewHeight = rootView.getHeight();
    if (viewHeight == 0)
        return true;

    int realHeight = realDisplayMetrics.heightPixels;
    return realHeight != viewHeight;
}