Android判断手机时候有导航栏的方法

来源:互联网 发布:声乐分几种唱法 知乎 编辑:程序博客网 时间:2024/04/29 01:02

参考:https://zhidao.baidu.com/question/1241728811608853219.html

            https://segmentfault.com/q/1010000004387583

            http://www.cnblogs.com/huxdiy/p/3977232.html

            http://tieba.baidu.com/p/3690819624



第一种:判断手机是否有物理按键,有就没有导航栏,反之就有(这个有点问题,逻辑不严谨,4.0以上所有手机都可以显示NavigationBar,只是手机厂家屏蔽了)。

public static boolean checkDeviceHasNavigationBar(Context activity) {        //通过判断设备是否有返回键、菜单键(不是虚拟键,是手机屏幕外的按键)来确定是否有navigation bar        boolean hasMenuKey = ViewConfiguration.get(activity)                .hasPermanentMenuKey();        boolean hasBackKey = KeyCharacterMap                .deviceHasKey(KeyEvent.KEYCODE_BACK);        if (!hasMenuKey && !hasBackKey) {            // 做任何自己需要做的,这个设备有一个导航栏            return true;        }        return false;    }


第二种:获取手机是否允许使用(显示)NavigationBar

//获取是否存在NavigationBarpublic static boolean checkDeviceHasNavigationBar(Context context) {    boolean hasNavigationBar = false;    Resources rs = context.getResources();    int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");    if (id > 0) {        hasNavigationBar = rs.getBoolean(id);    }    try {        Class systemPropertiesClass = Class.forName("android.os.SystemProperties");        Method m = systemPropertiesClass.getMethod("get", String.class);        String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");        if ("1".equals(navBarOverride)) {            hasNavigationBar = false;        } else if ("0".equals(navBarOverride)) {            hasNavigationBar = true;        }    } catch (Exception e) {    }    return hasNavigationBar;}

第三种:通过获取不同状态的屏幕高度对比判断是否有NavigationBar


1.
//获取屏幕尺寸,不包括虚拟功能高度<br><br>
getWindowManager().getDefaultDisplay().getHeight();


2.

获取屏幕原始尺寸高度,包括虚拟功能键高度,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private int getDpi()
    {  intdpi = 0;
            Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics dm =newDisplayMetrics();
        @SuppressWarnings("rawtypes")
                Class c;
        try{
            c = Class.forName("android.view.Display");
            @SuppressWarnings("unchecked")
                        Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
            method.invoke(display, dm);
            dpi=dm.heightPixels;
        }catch(Exception e){
            e.printStackTrace();
        
        returndpi;
    }
用“2”中的高度减去“1”中的高度如果大于0就存在NavigationBar,反之不存在。


还看到一个方法跟以上类似:

/**
* 判断底部navigator是否已经显示
* @param windowManager
* @return
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private boolean hasSoftKeys(WindowManager windowManager){
Display d = windowManager.getDefaultDisplay();


DisplayMetrics realDisplayMetrics = new DisplayMetrics();
d.getRealMetrics(realDisplayMetrics);


int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;


DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);


int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;


return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
}

1 0
原创粉丝点击