New file |
| | |
| | | package com.secondworld.univeralsdk; |
| | | |
| | | 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; |
| | | } |
| | | } |