Как установить размер для медиа-рекордера с надписью - PullRequest
7 голосов
/ 05 июля 2019

Я использую MediaRecorder для записи поверхности, поэтому я определяю размер видео для MediaRecorder перед подготовкой

Size size = getWindowManager().getDefaultDisplay().getSize(size);
... preparing the media recorder
mediaRecorder.setVideoSize(size.x, size.y);

Так что он работает нормально без надреза, когда дело доходит до устройств с надрезомвидео записывается в черном цвете.

Пожалуйста, помогите мне

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 07 июля 2019

Определить и вычесть высоту надреза

    DisplayMetrics displayMetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    int height = displayMetrics.heightPixels;
    int width = displayMetrics.widthPixels;

    Log.d("height",""+height);

    //Detect notch
    int statusBarHeight = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        statusBarHeight = getResources().getDimensionPixelSize(resourceId);
    }

    if (statusBarHeight > Math.round( 24 * (displayMetrics.densityDpi / 160f))) {
        height -= statusBarHeight;
    }

    Log.d("height",""+height);
0 голосов
/ 13 июля 2019

Я бы разделил ответ на 2 части:

  1. Использование 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

...