package com.secondworld.universalsdk; import android.app.Activity; import android.content.Context; import android.view.Surface; import android.view.ViewGroup; import android.widget.FrameLayout; import java.lang.reflect.Method; /** * Created by Administrator on 2018/9/11 0011. */ public class NotchPhoneUtil { private final static String TAG = "Notch"; /** * 华为手机判断是不是刘海手机 * * @param context * @return */ public static boolean hasNotchAtHuawei(Context context) { boolean ret = false; try { ClassLoader classLoader = context.getClassLoader(); Class HwNotchSizeUtil = classLoader.loadClass( "com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen"); ret = (boolean) get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { LogUtil.e(TAG, "hasNotchAtHuawei ClassNotFoundException"); } catch (NoSuchMethodException e) { LogUtil.e(TAG, "hasNotchAtHuawei NoSuchMethodException"); } catch (Exception e) { LogUtil.e(TAG, "hasNotchAtHuawei Exception"); } finally { return ret; } } /** * 华为手机获取刘海的宽高 * int[0]值为刘海宽度 int[1]值为刘海高度 */ public static int[] getNotchSizeAtHuawei(Context context) { int[] ret = new int[]{0, 0}; try { ClassLoader cl = context.getClassLoader(); Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil"); Method get = HwNotchSizeUtil.getMethod("getNotchSize"); ret = (int[]) get.invoke(HwNotchSizeUtil); } catch (ClassNotFoundException e) { LogUtil.e(TAG, "getNotchSizeAtHuawei ClassNotFoundException"); } catch (NoSuchMethodException e) { LogUtil.e(TAG, "getNotchSizeAtHuawei NoSuchMethodException"); } catch (Exception e) { LogUtil.e(TAG, "getNotchSizeAtHuawei Exception"); } finally { return ret; } } /** * OPPO判断是不是刘海手机, * OPPO不提供接口获取刘海尺寸,目前其有刘海屏的机型尺寸规格都是统一的。不排除以后机型会有变化。 * 刘海区域则都是宽度为324px, 高度为80px。 * * @param context * @return */ public static boolean HasNotchOPPO(Context context) { return context.getPackageManager().hasSystemFeature( "com.oppo.feature.screen.heteromorphism"); } public static final int VIVO_NOTCH = 0x00000020;//是否有刘海 /** * vivo判断是不是刘海手机 */ public static boolean HasNotchVivo(Context context) { boolean ret = false; try { ClassLoader classLoader = context.getClassLoader(); Class FtFeature = classLoader.loadClass("android.util.FtFeature"); Method method = FtFeature.getMethod("isFeatureSupport", int.class); ret = (boolean) method.invoke(FtFeature, VIVO_NOTCH); } catch (ClassNotFoundException e) { LogUtil.e(TAG, "hasNotchAtVivo ClassNotFoundException"); } catch (NoSuchMethodException e) { LogUtil.e(TAG, "hasNotchAtVivo NoSuchMethodException"); } catch (Exception e) { LogUtil.e(TAG, "hasNotchAtVivo Exception"); } finally { return ret; } } /** * 小米手机判断是不是刘海手机 * * @return */ public static boolean HasNotchXiaoMi() { Boolean _hasNotchXiaoMi = getPropertyInt("ro.miui.notch", 0) == 1 ? true : false; LogUtil.i(TAG,"是否是小米刘海手机: " + _hasNotchXiaoMi); return _hasNotchXiaoMi; } private static int getPropertyInt(String key,int defaultValue) { int value = defaultValue; try { Class c = Class.forName("android.os.SystemProperties"); Method get = c.getMethod("get", String.class, String.class); value = (int) (get.invoke(c, key, "unknown")); } catch (Exception e) { e.printStackTrace(); } finally { return value; } } /** * 小米手机获取刘海的高度 */ public static int getStatusBarHeight(Context context) { int statusBarHeight = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); } return statusBarHeight; } /** * 屏幕旋转汇总的方法 * * @param activity * @param isNotch * @param type * @param viewGroup */ public static void onConfigurationChanged(Activity activity, Boolean isNotch, int type, ViewGroup viewGroup) { if (getDisplayRotation(activity) == 0) { if (isNotch) { switch (type) { case 1: //vivo FrameLayout.LayoutParams lpvivo = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lpvivo.topMargin = dp2px(activity, 32); lpvivo.leftMargin = 0; lpvivo.rightMargin = 0; viewGroup.setLayoutParams(lpvivo); break; case 2: //HUAWEI int[] sizeAtHuawei = NotchPhoneUtil.getNotchSizeAtHuawei(activity); FrameLayout.LayoutParams lphuawei = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lphuawei.topMargin = sizeAtHuawei[1]; lphuawei.leftMargin = 0; lphuawei.rightMargin = 0; viewGroup.setLayoutParams(lphuawei); break; case 3: //OPPO 目前都为 80px FrameLayout.LayoutParams lpOppo = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lpOppo.topMargin = 80; lpOppo.leftMargin = 0; lpOppo.rightMargin = 0; viewGroup.setLayoutParams(lpOppo); break; case 4: //Xiaomi int sizeAtXiaomi = NotchPhoneUtil.getStatusBarHeight(activity); FrameLayout.LayoutParams lpXiaomi = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lpXiaomi.topMargin = sizeAtXiaomi; lpXiaomi.leftMargin = 0; lpXiaomi.rightMargin = 0; viewGroup.setLayoutParams(lpXiaomi); break; } } } else if (getDisplayRotation(activity) == 90) { leftAndRightChange(activity, isNotch, type, viewGroup); } else if (getDisplayRotation(activity) == 180) { } else if (getDisplayRotation(activity) == 270) { leftAndRightChange(activity, isNotch, type, viewGroup); } } /** * 左右横屏都是让 leftMargin 和rightMargin 空出一个刘海的距离 * * @param activity * @param isNotch * @param type * @param viewGroup */ private static void leftAndRightChange(Activity activity, Boolean isNotch, int type, ViewGroup viewGroup) { if (isNotch) { switch (type) { case 1: //vivo FrameLayout.LayoutParams lpvivo = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lpvivo.leftMargin = dp2px(activity, 32); lpvivo.rightMargin = dp2px(activity, 32); lpvivo.topMargin = 0; lpvivo.bottomMargin = 0; viewGroup.setLayoutParams(lpvivo); break; case 2: //HUAWEI int[] sizeAtHuawei = NotchPhoneUtil.getNotchSizeAtHuawei(activity); FrameLayout.LayoutParams lphuawei = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lphuawei.leftMargin = sizeAtHuawei[1]; lphuawei.rightMargin = sizeAtHuawei[1]; lphuawei.topMargin = 0; lphuawei.bottomMargin = 0; viewGroup.setLayoutParams(lphuawei); break; case 3: //OPPO 目前都为 80px FrameLayout.LayoutParams lpOppo = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lpOppo.leftMargin = 80; lpOppo.rightMargin = 80; lpOppo.topMargin = 0; lpOppo.bottomMargin = 0; viewGroup.setLayoutParams(lpOppo); break; case 4: //Xiaomi int sizeAtXiaomi = NotchPhoneUtil.getStatusBarHeight(activity); FrameLayout.LayoutParams lpXiaomi = (FrameLayout.LayoutParams) viewGroup.getLayoutParams(); lpXiaomi.leftMargin = sizeAtXiaomi; lpXiaomi.rightMargin = sizeAtXiaomi; lpXiaomi.topMargin = 0; lpXiaomi.bottomMargin = 0; viewGroup.setLayoutParams(lpXiaomi); break; } } } /** * 获取当前屏幕旋转角度 * * @param activity * @return 0表示是竖屏; 90表示是左横屏; 180表示是反向竖屏; 270表示是右横屏 */ public static int getDisplayRotation(Activity activity) { if (activity == null) { return 0; } int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); switch (rotation) { case Surface.ROTATION_0: return 0; case Surface.ROTATION_90: return 90; case Surface.ROTATION_180: return 180; case Surface.ROTATION_270: return 270; } return 0; } /** * px转dp * * @param context * @param dipValue */ public static int dp2px(Context context, float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale + 0.5f); } /** * 获取手机厂商 * * @return 手机厂商 Xiaomi HUAWEI vivo */ public static String getDeviceBrand() { return android.os.Build.BRAND; } }