水滴屏适配解决方案:
Android: smarxpan/NotchScreenTool:
https://github.com/smarxpan/NotchScreenTool
底部虚拟键盘NavigationBar适配方案:
这里是代码方式:
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
import java.lang.reflect.Method;
public class NavigationBarInfo {
/**
* 导航栏竖屏高度标识位
*/
static final String IMMERSION_NAVIGATION_BAR_HEIGHT = "navigation_bar_height";
/**
* 导航栏宽度标识位位
*/
static final String IMMERSION_NAVIGATION_BAR_WIDTH = "navigation_bar_width";
/**
* MIUI导航栏显示隐藏标识位
*/
static final String IMMERSION_MIUI_NAVIGATION_BAR_HIDE_SHOW = "force_fsg_nav_bar";
/**
* EMUI导航栏显示隐藏标识位
*/
static final String IMMERSION_EMUI_NAVIGATION_BAR_HIDE_SHOW = "navigationbar_is_min";
private static final String KEY_EMUI_VERSION_NAME = "ro.build.version.emui";
public static int getNavigationBarHeight(Context context) {
int result = 0;
if (hasNavBar((Activity) context)) {
return getInternalDimensionSize(context, IMMERSION_NAVIGATION_BAR_HEIGHT);
}
return result;
}
private int getNavigationBarWidth(Context context) {
int result = 0;
if (hasNavBar((Activity) context)) {
return getInternalDimensionSize(context, IMMERSION_NAVIGATION_BAR_WIDTH);
}
return result;
}
/**
* 判断是否为emui
* Is emui boolean.
*
* @return the boolean
*/
public static boolean isEMUI() {
String property = getSystemProperty(KEY_EMUI_VERSION_NAME, "");
return !TextUtils.isEmpty(property);
}
/**
* 判断是否为emui3.1版本
* Is emui 3 1 boolean.
*
* @return the boolean
*/
public static boolean isEMUI3_1() {
String property = getEMUIVersion();
return "EmotionUI 3".equals(property) || property.contains("EmotionUI_3.1");
}
/**
* 判断是否为emui3.0版本
* Is emui 3 1 boolean.
*
* @return the boolean
*/
public static boolean isEMUI3_0() {
String property = getEMUIVersion();
if (property.contains("EmotionUI_3.0")) {
return true;
}
return false;
}
/**
* 得到emui的版本
* Gets emui version.
*
* @return the emui version
*/
public static String getEMUIVersion() {
return isEMUI() ? getSystemProperty(KEY_EMUI_VERSION_NAME, "") : "";
}
private static String getSystemProperty(String key, String defaultValue) {
try {
@SuppressLint("PrivateApi") Class<?> clz = Class.forName("android.os.SystemProperties");
Method method = clz.getMethod("get", String.class, String.class);
return (String) method.invoke(clz, key, defaultValue);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
/**
* 判断是否为emui3.x版本
* Is emui 3 x boolean.
*
* @return the boolean
*/
public static boolean isEMUI3_x() {
return isEMUI3_0() || isEMUI3_1();
}
private static boolean hasNavBar(Activity activity) {
//判断小米手机是否开启了全面屏,开启了,直接返回false
if (Settings.Global.getInt(activity.getContentResolver(), IMMERSION_MIUI_NAVIGATION_BAR_HIDE_SHOW, 0) != 0) {
return false;
}
//判断华为手机是否隐藏了导航栏,隐藏了,直接返回false
if (isEMUI()) {
if (isEMUI3_x()) {
if (Settings.System.getInt(activity.getContentResolver(), IMMERSION_EMUI_NAVIGATION_BAR_HIDE_SHOW, 0) != 0) {
return false;
}
} else {
if (Settings.Global.getInt(activity.getContentResolver(), IMMERSION_EMUI_NAVIGATION_BAR_HIDE_SHOW, 0) != 0) {
return false;
}
}
}
//其他手机根据屏幕真实高度与显示高度是否相同来判断
WindowManager windowManager = activity.getWindowManager();
Display d = windowManager.getDefaultDisplay();
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
d.getRealMetrics(realDisplayMetrics);
int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);
int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;
return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
}
private static int getInternalDimensionSize(Context context, String key) {
int result = 0;
try {
int resourceId = Resources.getSystem().getIdentifier(key, "dimen", "android");
if (resourceId > 0) {
int sizeOne = context.getResources().getDimensionPixelSize(resourceId);
int sizeTwo = Resources.getSystem().getDimensionPixelSize(resourceId);
if (sizeTwo >= sizeOne) {
return sizeTwo;
} else {
float densityOne = context.getResources().getDisplayMetrics().density;
float densityTwo = Resources.getSystem().getDisplayMetrics().density;
float f = sizeOne * densityTwo / densityOne;
return (int) ((f >= 0) ? (f + 0.5f) : (f - 0.5f));
}
}
} catch (Resources.NotFoundException ignored) {
return 0;
}
return result;
}
}