web-dev-qa-db-ja.com

android Samsung GalaxyS8ナビゲーションバーの非表示または表示をプログラムで検出

Samsung S8などの一部のデバイスでは、ナビゲーションバーを表示または非表示にすることができます。これは、状況によっては問題になります。 Samsung S8のナビゲーションバーは、左下のボタンをクリックして表示または非表示にできます

Androidソースコードであっても、判断するための簡単な方法が見つかりませんでした。

そして、私は次のようないくつかの問題をグーグルで検索します ナビゲーションバーをチェックするための良い解決策 、しかしそれは役に立ちません。

どんな助けでも大歓迎です。

14
Smiles

まず、元の作者のクレジット: https://www.jianshu.com/p/ddfbabd614b6

サムスンの携帯電話(S8、S9など)の場合、サムスンのイベントを聞いてナビゲーションバーが表示されているかどうかを検出できます。

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());
    }
}
3
Haomin

この方法を使用して、私のために働いた。 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;
}
0
Thomas Jansen