代碼黨或者項目進度黨拿去:java
import android.content.Context;
import android.os.Build;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class NotchUtils {
public static int getNotchInHeight(Context context) {
try {
if (hasNotchInOppo(context)) {
return getStatusBarHeight(context);
} else if (hasNotchInVivo(context)) {
return ViewUtils.dipToPx(context, 27);
} else if (hasNotchInHuawei(context)) {
return getNotchSize(context)[1];
} else if (hasNotchInXiaomi(context)) {
return getStatusBarHeight(context);
} else {
return 0;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
public static boolean hasNotch(Context context) {
try {
if (hasNotchInOppo(context)) {
return true;
}
if (hasNotchInVivo(context)) {
return true;
}
if (hasNotchInHuawei(context)) {
return true;
}
if (hasNotchInXiaomi(context)) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
//判斷該 OPPO 手機是否爲劉海屏手機
public static boolean hasNotchInOppo(Context context) {
return context.getPackageManager().hasSystemFeature("com.oppo.feature.screen.heteromorphism");
}
//判斷該 Vivi 手機是否爲劉海屏手機
public static boolean hasNotchInVivo(Context context) {
boolean hasNotch = false;
try {
ClassLoader cl = context.getClassLoader();
Class ftFeature = cl.loadClass("android.util.FtFeature");
Method[] methods = ftFeature.getDeclaredMethods();
if (methods != null) {
for (int i = 0; i < methods.length; i++) {
Method method = methods[i];
if (method != null) {
if (method.getName().equalsIgnoreCase("isFeatureSupport")) {
hasNotch = (boolean) method.invoke(ftFeature, 0x00000020);
break;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
hasNotch = false;
}
return hasNotch;
}
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;
}
//判斷該 huawei 手機是否爲劉海屏手機
public static boolean hasNotchInHuawei(Context context) {
boolean hasNotch = false;
try {
ClassLoader cl = context.getClassLoader();
Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");
Method hasNotchInScreen = HwNotchSizeUtil.getMethod("hasNotchInScreen");
if (hasNotchInScreen != null) {
hasNotch = (boolean) hasNotchInScreen.invoke(HwNotchSizeUtil);
}
} catch (Exception e) {
e.printStackTrace();
}
return hasNotch;
}
/**
* 小米劉海屏判斷.
*
* @return true means notch
* @throws IllegalArgumentException if the key exceeds 32 characters
*/
public static boolean hasNotchInXiaomi(Context context) {
int result = 0;
if (isXiaomi()) {
try {
ClassLoader classLoader = context.getClassLoader();
@SuppressWarnings("rawtypes")
Class SystemProperties = classLoader.loadClass("android.os.SystemProperties");
//參數類型
@SuppressWarnings("rawtypes")
Class[] paramTypes = new Class[2];
paramTypes[0] = String.class;
paramTypes[1] = int.class;
Method getInt = SystemProperties.getMethod("getInt", paramTypes);
//參數
Object[] params = new Object[2];
params[0] = new String("ro.miui.notch");
params[1] = new Integer(0);
result = (Integer) getInt.invoke(SystemProperties, params);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//result = 0 if it is not notch ; return 1 means notch
return result == 1;
}
// 是不是小米手機
public static boolean isXiaomi() {
return "XIAOMI".equals(Build.MANUFACTURER.toUpperCase());
}
public static int[] getNotchSize(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) {
} catch (NoSuchMethodException e) {
} catch (Exception e) {
} finally {
return ret;
}
}
}
複製代碼