1. 程式人生 > >Android 隱藏手機底部虛擬按鍵

Android 隱藏手機底部虛擬按鍵

現在的手機比較流行底部帶虛擬按鍵,比如華為、nexus,一般情況下對開發一個APP沒啥影響,但是不一般情況下就會有影響的,比如全屏錄影功能,

用簡單的方法直接獲取camera支援的手機螢幕解析度然後用SurfaceView全屏渲染出來,這時由於底部虛擬按鍵佔用了一定的高度的螢幕空間,這時影象會被壓縮,

特別是拍頭像時會很明顯,如圖:


接下來加上幾個方法就OK 了,程式碼如下

    /**
     * 隱藏虛擬按鍵,並且全屏
     */
    protected void hideBottomUIMenu(){
        //隱藏虛擬按鍵,並且全屏
        if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
            View v = this.getWindow().getDecorView();
            v.setSystemUiVisibility(View.GONE);
        } else if (Build.VERSION.SDK_INT >= 19) {
            //for new api versions.
            View decorView = getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
//                    | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
                    | View.SYSTEM_UI_FLAG_IMMERSIVE;
            decorView.setSystemUiVisibility(uiOptions);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }
/**
     * 檢查是否存在虛擬按鍵欄
     * @param context
     * @return
     */
    public static boolean hasNavBar(Context context) {
        Resources res = context.getResources();
        int resourceId = res.getIdentifier("config_showNavigationBar", "bool", "android");
        if (resourceId != 0) {
            boolean hasNav = res.getBoolean(resourceId);
            // check override flag
            String sNavBarOverride = getNavBarOverride();
            if ("1".equals(sNavBarOverride)) {
                hasNav = false;
            } else if ("0".equals(sNavBarOverride)) {
                hasNav = true;
            }
            return hasNav;
        } else { // fallback
            return !ViewConfiguration.get(context).hasPermanentMenuKey();
        }
    }

    /**
     * 判斷虛擬按鍵欄是否重寫
     * @return
     */
    private static String getNavBarOverride() {
        String sNavBarOverride = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            try {
                Class c = Class.forName("android.os.SystemProperties");
                Method m = c.getDeclaredMethod("get", String.class);
                m.setAccessible(true);
                sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
            } catch (Throwable e) {
            }
        }
        return sNavBarOverride;
    }

hideBottomUIMenu()onCreate()裡面呼叫就可以了,之後的效果,底部虛擬按鍵也成為了SurfaceView的一部分,不僅僅只是透明瞭哦,如圖:

當然以上程式碼不一定只能用於錄影,相關功能需求都可以使用,哈哈,現在又可以愉快玩耍了大笑

相關推薦

Android 隱藏手機底部虛擬按鍵

現在的手機比較流行底部帶虛擬按鍵,比如華為、nexus,一般情況下對開發一個APP沒啥影響,但是不一般情況下就會有影響的,比如全屏錄影功能, 用簡單的方法直接獲取camera支援的手機螢幕解析度然後用

Android適配底部虛擬按鍵的方法

最近專案進行適配的時候發現部分(如華為手機)存在底部虛擬按鍵的手機會因為虛擬按鍵的存在導致擋住部分介面,因為需要全屏顯示,故呼叫虛擬按鍵隱藏方法使之隱藏,然而發現出現如下問題: 手動操作隱藏虛擬按鍵後出現長白條區域 不自動隱藏 滑出狀態列後虛擬按鍵也出來,狀

Android手機去掉底部虛擬按鍵欄方法

需要root手機,在手機檔案系統system資料夾中的build.prop檔案最後加一句程式碼qemu.hw.mainkeys=1(qemu:虛擬作業系統模擬器;hw:硬體;mainkeys:主要按鍵)

android隱藏底部虛擬按鍵

最近使用騰訊封裝的weview  sdk,發現播放視訊全屏時底部虛擬按鍵消失了, 於是發現了這個方法 view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) 佈局中隨便一個view都可以呼叫此方法

禁用Android底部虛擬按鍵

Android裝置螢幕底部一般都有虛擬按鍵,上面有 back、home等按鈕。 網上搜索到的在程式碼中通過隱藏導航欄的方法來禁止虛擬按鍵,例如: View decorView = getWindow().getDecorView(); int uiOpt

android隱藏全面屏虛擬鍵盤實現

 下面是使用介紹必須放到setContentView前面   /** * 隱藏虛擬按鍵,並且設定成全屏 */ protected void hideBottomUIMenu() { if (Build.VERSIO

Android隱藏系統底部工具欄(Navigation bar)

為適配無實體鍵機型,Android系統預設自帶底部虛擬按鍵工具欄。由於專案需求,需要隱藏底部工具欄,網上推薦更改base/core/res/res/values/dimens.xml中<dimen name="navigation_bar_height">0dp&

Android 遮蔽掉下方虛擬按鍵方法

1、遮蔽系統底部的虛擬按鍵 frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 在PhoneWIndowManager.java檔案中有如下程式碼: String n

關於處理底部虛擬按鍵的坑

做專案的時候遇到佈局被虛擬按鍵遮住我採用了在onCreate裡新增getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);來隱藏掉虛擬按鍵,解決這個問題,之後很

Android適配之虛擬按鍵遮擋佈局

android適配中,有時候會遇到手機自帶的虛擬鍵遮擋住底部導航欄或其他佈局的情況,如下圖:這時候怎麼辦? 解決方法: 在activity的onCreate方法中看情況加上下面的程式碼: //狀態列 @ 頂部getWindow().addFlags(WindowMan

Android隱藏和顯示虛擬導航欄

隱藏導航欄 /** * 隱藏虛擬按鍵,並且全屏 */ public static v

Android適配華為手機虛擬按鍵顯示或隱藏

華為的一些手機的螢幕上的虛擬按鍵是可以顯示或者隱藏的,因此在佈局適配的時候就要考慮到這個問題,要不然當虛擬按鍵被隱藏後介面的佈局就會出現問題,下面給出一種解決方法,(原文來自:安卓適配碰到的一些問題) 因為虛擬按鍵的開啟會涉及到view的重繪,因此可以重寫根l

android監聽虛擬按鍵的顯示與隱藏

虛擬按鍵在華為手機中大量存在,而虛擬按鍵的存在無疑增加了螢幕適配的難度,往往許多時候我們的介面需要根據虛擬按鍵的顯示與否(虛擬按鍵的顯示隱藏是使用者可以動態調整的)來調整介面的ui顯示,但android系統本身(似乎)並沒有提供此類介面(PS:反正我沒找到類似介面),經過研究得到一個可用的方式。 a

android 監聽虛擬按鍵的顯示與隱藏

在開發過程中 由於很多機型有有虛擬按鍵 需要我們做一些處理 有時候可能我們做了沉浸式處理 然後在應用在執行的時候 使用者突然隱藏掉虛擬按鍵 導致應用下面一條空白的或者是黑色的 導致使用者體驗不好 這裡就需要我們監聽虛擬按鍵的狀態 來改變佈局 首先 需要監

Android 解決介面底部彈出dialog被虛擬按鍵遮擋一部分的問題

mDialog.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); mDialog.getWindow().getDecorView().setOnSystemUiVisibilityCh

android 筆記:判斷手機是否顯示虛擬按鍵

華為親測有效 public boolean isNavigationBarShow(){ if (Build.VERSION.SDK_INT >= Build.VERSION_

android關閉手機實體按鍵開啟虛擬按鍵

注意實體按鍵和虛擬按鍵的區別 使用的是android4.2版本,硬體:mt6589 以下操作都需要root許可權!! 關閉實體按鍵的功能(選單,返回,home,最近): 使用root檔案管理器,如RE檔案管理器 在/system/usr/keylayout/Generic

android隱藏底部虛擬鍵Navigation Bar實現全屏

安卓4.1之後為全虛擬鍵操作,和actionbar對應,底部的虛擬鍵選單稱為Navigation Bar。 Sumsung Galaxy Nexus 螢幕解析度為 1280X 720,但通常的應用都會顯示Navigation Bar(Back 鍵,Home 鍵等),如下

安卓隱藏手機虛擬按鍵

我的實現思路是,通過監聽根佈局的檢視高度的變化,來判斷虛擬按鍵的隱藏和顯示 1. 在oncreate中View.getWidth和View.getHeight無法獲得一個view的高度和寬度,這是因為View元件佈局要在onResume回撥後完成。所以現在需要使用getVi

手機虛擬按鍵始終隱藏 | 觸控式螢幕幕時出現

第一種:始終隱藏,觸控式螢幕幕時也不出現—— WindowManager.LayoutParams params = getWindow().getAttributes(); params.systemUiVisibility = View.