============================================================
版权所有,如需转载请标明出处:http://blog.csdn.net/you4580
============================================================
之前各种判断是否隐藏导航栏还是很好用的,但是出了全面屏以后,再加上手势导航等,在不同的手机上就出现了各种问题,针对这个还必须得做兼容,遇到问题的小伙伴可以试试这个,90%的机型应该没有问题.
/**
* @param context
* @return 返回true表示显示虚拟导航键、false表示隐藏虚拟导航键
*/
public static boolean hasNavigationBar(Context context) {
//navigationGestureEnabled()从设置中取不到值的话,返回false,因此也不会影响在其他手机上的判断
return deviceHasNavigationBar() && !navigationGestureEnabled(context);
}
/**
* 获取主流手机设置中的"navigation_gesture_on"值,判断当前系统是使用导航键还是手势导航操作
* @param context app Context
* @return
* false 表示使用的是虚拟导航键(NavigationBar),
* true 表示使用的是手势, 默认是false
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private static boolean navigationGestureEnabled(Context context) {
int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);
return val != 0;
}
/**
* 获取设备信息(目前支持几大主流的全面屏手机,亲测华为、小米、oppo、魅族、vivo、三星都可以)
* @return
*/
private static String getDeviceInfo() {
String brand = Build.BRAND;
if(TextUtils.isEmpty(brand)) return "navigationbar_is_min";
if (brand.equalsIgnoreCase("HUAWEI")||"HONOR".equals(brand)) {
return "navigationbar_is_min";
} else if (brand.equalsIgnoreCase("XIAOMI")) {
return "force_fsg_nav_bar";
} else if (brand.equalsIgnoreCase("VIVO")) {
return "navigation_gesture_on";
} else if (brand.equalsIgnoreCase("OPPO")) {
return "navigation_gesture_on";
} else if(brand.equalsIgnoreCase("samsung")){
return "navigationbar_hide_bar_enabled";
}else {
return "navigationbar_is_min";
}
}
/**
* 判断设备是否存在NavigationBar
* @return true 存在, false 不存在
*/
public static boolean deviceHasNavigationBar() {
boolean haveNav = false;
try {
//1.通过WindowManagerGlobal获取windowManagerService
// 反射方法:IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();
Class<?> windowManagerGlobalClass = Class.forName("android.view.WindowManagerGlobal");
Method getWmServiceMethod = windowManagerGlobalClass.getDeclaredMethod("getWindowManagerService");
getWmServiceMethod.setAccessible(true);
//getWindowManagerService是静态方法,所以invoke null
Object iWindowManager = getWmServiceMethod.invoke(null);
//2.获取windowMangerService的hasNavigationBar方法返回值
// 反射方法:haveNav = windowManagerService.hasNavigationBar();
Class<?> iWindowManagerClass = iWindowManager.getClass();
Method hasNavBarMethod = iWindowManagerClass.getDeclaredMethod("hasNavigationBar");
hasNavBarMethod.setAccessible(true);
haveNav = (Boolean) hasNavBarMethod.invoke(iWindowManager);
} catch (Exception e) {
e.printStackTrace();
}
return haveNav;
}
以上方法随着机型的增多可能已经失效,可以结合以下方法判断:
/** * @param context * @return 返回true表示显示虚拟导航键、false表示隐藏虚拟导航键 */ public static boolean hasNavigationBar(Context context) { //navigationGestureEnabled()从设置中取不到值的话,返回false,因此也不会影响在其他手机上的判断 return (deviceHasNavigationBar(context))&& !navigationGestureEnabled(context);// && isShowNavBar(context) } /** * 获取主流手机设置中的"navigation_gesture_on"值,判断当前系统是使用导航键还是手势导航操作 * @param context app Context * @return * false 表示使用的是虚拟导航键(NavigationBar), * true 表示使用的是手势, 默认是false */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) private static boolean navigationGestureEnabled(Context context) { int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0); String brand = Build.BRAND; //0和1是虚拟按键模式,2和3是手势模式 if(!TextUtils.isEmpty(brand)&&(brand.equalsIgnoreCase("OPPO")||brand.equalsIgnoreCase("VIVO"))){ val = Settings.Secure.getInt(context.getContentResolver(), getDeviceInfo(), 0); } return val != 0; } /** * 获取设备信息(目前支持几大主流的全面屏手机,亲测华为、小米、oppo、魅族、vivo、三星都可以) * @return */ private static String getDeviceInfo() { String brand = Build.BRAND; if(TextUtils.isEmpty(brand)) return "navigationbar_is_min"; if (brand.equalsIgnoreCase("HUAWEI")||"HONOR".equals(brand)) { return "navigationbar_is_min"; } else if (brand.equalsIgnoreCase("XIAOMI")) { return "force_fsg_nav_bar"; } else if (brand.equalsIgnoreCase("VIVO")) { return "navigation_gesture_on"; } else if (brand.equalsIgnoreCase("OPPO")) { return "hide_navigationbar_enable"; } else if(brand.equalsIgnoreCase("samsung")){ return "navigationbar_hide_bar_enabled"; }else if (brand.equalsIgnoreCase("Nokia")) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { return "navigation_bar_can_hiden"; } else { return "swipe_up_to_switch_apps_enabled"; } } else { return "navigationbar_is_min"; } }