Я бы разделил ответ на 2 части:
Использование API в Android 9 (уровень API 28).
/**
* Returns true if this WindowInsets has any nonzero insets.
*
* @return true if any inset values are nonzero
*/
public boolean hasInsets() {
return hasSystemWindowInsets() || hasWindowDecorInsets() || hasStableInsets()
|| mDisplayCutout != null;
}
/**
* Returns the display cutout if there is one.
*
* @return the display cutout or null if there is none
* @see DisplayCutout
*/
@Nullable
public DisplayCutout getDisplayCutout() {
return mDisplayCutout;
}
Мы используем API и получаем displayCutout, применяя setOnApplyWindowInsetsListener В нашем корневом представлении и сохраняем размеры.Вы также можете добавить необходимую логику, чтобы внести другие корректировки, если они понадобятся.Как только у нас есть вставки, мы можем проверить, есть ли вырез, и мы можем рассчитать размеры при необходимости.Кроме того, вы можете настроить рендеринг своей активности так, как если бы не было надреза / выреза. Более подробную информацию можно прочитать здесь .
Использование API, предоставляемого некоторыми OEM-производителями (в этом случае я показываю Huawei, я думаю, что еще несколько OEM-производителей имеют свой собственный API, но я не уверен) Код ниже представляет собой 2 расширения контекста, сделанные в Kotlin, позволяющиенам, чтобы проверить, существует ли выемка и получает ли ее размер для дальнейшей работы.
fun Context.hasNotchInScreenHuawei(): Boolean {
var ret = false
try {
val cl = this.classLoader
val hwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil")
val get = hwNotchSizeUtil.getMethod("hasNotchInScreen")
ret = get.invoke(hwNotchSizeUtil) as Boolean
} catch (ignored: Exception) {
} finally {
return ret
}
}
fun Context.getNotchSizeHuawei(): IntArray {
var ret = intArrayOf(0, 0)
try {
val cl = this.classLoader
val hwNotchSizeUtil = cl.loadClass("com.huawei.android.util.HwNotchSizeUtil")
val get = hwNotchSizeUtil.getMethod("getNotchSize")
ret = get.invoke(hwNotchSizeUtil) as IntArray
} catch (ignored: Exception) {
} finally {
return ret
}
}
Вам также необходимо добавить короткие метаданные в Манифест под приложением.
<meta-data android:name="android.notch_support" android:value="true" />
Это позволит телефону Huawei понять, что ваше приложение использует добавленный API от Huawei