Android在碎片化的体现已不再是API层面上的,近两年受异形屏市场冲击,最终就是开发者的一场灾难,并没有一个万全之策能做到通用的适配。
真的有必要每位开发者都花大量时间聚焦在适配问题上吗?适配不是一个多高深的技术,无非是
某个点
我们是否知道。正是为避面这种某个点
不知道而折腾很久而建立本仓。这里不提供所谓的适配库,只是把简短的差异化代码公开,防止脏引用。
讲个笑话,当用户运行普通app在手机上没能正常运行时用户会喷垃圾App,微信没能在手机上正常运行时,用户会喷垃圾手机....所以结果就是手机厂商在发新机之前会找大厂提前安排适配,并提供文档。而小公司就无能为力了,甚至硬件资源的条件也没用。你说气人不?
- Vivo:
0: 手势 1: 虚拟按键
Settings.Secure.getInt(context.contentResolver, "navigation_gesture_on", 0)
- 小米:
0: 手势 1: 虚拟按键
Settings.Global.getInt(context.contentResolver, "force_fsg_nav_bar", 0)
- 其它:
是否存在导航条
private fun hasNavigationBar(context: Context): Boolean {
var hasNavigationBar = false
try {
val systemPropertiesClass = Class.forName("android.os.SystemProperties")
val m = systemPropertiesClass.getMethod("get", String::class.java)
val navBarOverride = m.invoke(systemPropertiesClass, "qemu.hw.mainkeys") as String
if ("1" == navBarOverride) {
hasNavigationBar = false
} else if ("0" == navBarOverride) {
hasNavigationBar = true
} else {
val rs = context.resources
val id = rs.getIdentifier("config_showNavigationBar", "bool", "android")
if (id > 0) {
hasNavigationBar = rs.getBoolean(id)
}
}
} catch (e: Exception) {
e.printStackTrace()
}
return hasNavigationBar
}
- AndroidP:
是否异型屏
WindowInsets windowInsets = window.getDecorView().getRootWindowInsets();
if(null == windowInsets){
return false;
}
DisplayCutout displayCutout = windowInsets.getDisplayCutout();
return null != displayCutout;
- 小米:
0:非异型,1:异型
SystemProperties.get("ro.miui.notch", null)
- 魅族:
0:非异型,1:异型
Settings.Global.getInt(window.getContext().getContentResolver(),
"mz_fringe_hide", 0)
- 华为:
是否异型屏
ClassLoader cl = context.getClassLoader();
Class HwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil");
Method get = HwNotchSizeUtil.getMethod("hasNotchInScreen");
(boolean) get.invoke(HwNotchSizeUtil);
- Oppo:
是否异型屏
getContext().hasSystemFeature("com.oppo.feature.screen.heteromorphism");
- Vivo:
是否异型屏 圆角:0x00000008 ,凹凸:0x00000020
ClassLoader cl = window.getContext().getClassLoader();
vivoFtFeature = cl.loadClass("android.util.FtFeature");
Method get = vivoFtFeature.getMethod("isFeatureSupport", int.class);
(boolean) get.invoke(vivoFtFeature, 0x00000020);
- 锤子(Smartisan):
是否异型屏
Class<?> DisplayUtilsSmt = Class.forName("smartisanos.api.DisplayUtilsSmt");
Method isFeatureSupport = DisplayUtilsSmt.getMethod("isFeatureSupport", int.class);
(boolean) isFeatureSupport.invoke(DisplayUtilsSmt, 0x00000001);
- 锤子(Smartisan):
获取锤子手机导航栏模式 0导航栏 1手势操作
Settings.Global.getInt(context.getContentResolver(), "navigationbar_trigger_mode", 0);
-
三星(挖孔屏)
- 华为:
0:展示刘海,1:隐藏刘海
Settings.Secure.getInt(context.contentResolver, "display_notch_status", 0)
- 小米:
0:展示刘海,1:隐藏刘海
Settings.Global.getInt(context.contentResolver, "force_black", 0)