最新最全判断是否隐藏虚拟导航键方法

============================================================

版权所有,如需转载请标明出处: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";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值