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

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

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

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

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


person Smiles    schedule 08.09.2017    source источник
comment
Вы находите какой-либо ответ? Я застрял с той же проблемой   -  person TUSHAR    schedule 25.09.2017
comment
@TUSHAR Нет, я до сих пор не могу найти хорошего решения. Я думаю, что Android должен сделать его стандартизированным.   -  person Smiles    schedule 27.09.2017
comment
С появлением все большего количества полноэкранных телефонов, не только Samsung Galaxy S8/Note8, но и Xiaomi, Huawei и т. д. Если источники Android не сделают его стандартизированным как можно скорее, это может стать серьезной проблемой.   -  person Smiles    schedule 13.11.2017


Ответы (2)


Сначала укажите автора: 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());
    }
}
person Haomin    schedule 13.12.2018
comment
У меня сработало, это было единственное решение, которое у нас было для определения высоты полноэкранного окна на телефонах Samsung со складной панелью. - person hendersawn; 05.04.2019
comment
Любая идея о том, как обнаружить это на устройствах от другого производителя? - person John; 15.07.2019
comment
для разработчиков xamarin с той же проблемой проверьте это - person John; 16.07.2019
comment
хорошо, вот откуда: jianshu.com/p/ddfbabd614b6 - person vigilancer; 19.09.2019

Используйте этот метод, сработал для меня. Убедитесь, что представление было отрендерено первым, чтобы убедиться, что 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;
}
person Thomas Jansen    schedule 16.11.2017
comment
Это не работает, когда этот флаг установлен в окне активности: WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - person deadmoto; 07.04.2018