Режим «картинка в картинке» -> дочерний вид расширяется после перехода в режим пипа - PullRequest
0 голосов
/ 14 марта 2019

Я реализовал Программируемый видеовызов Twilio в моем проекте. Мне нужно поддерживать режим «Картинка в картинке» (PIP) после подключения вызова.

Я добавил вид с фиксированной высотой и шириной, чтобы показать местное видео. Я нажимаю кнопку, чтобы ввести активность в режиме PIP. Фиксированный вид также изменяет размер в режиме PIP, но через несколько секунд фиксированный вид расширяется.

Manifest-

       <activity
        android:name=".call.TwilioVideoCallActivity"    
        android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
        android:launchMode="singleTask"
        android:screenOrientation="portrait"
        android:resizeableActivity="true"
        android:supportsPictureInPicture="true"
        android:excludeFromRecents="true"
        />

ENTER PIP MODE -

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode, Configuration newConfig) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig);
    if (!isInPictureInPictureMode) {

        showControllers();
    }
    this.inPictureInPictureMode = isInPictureInPictureMode;
}

private boolean isPIPSupport() {
    PackageManager packageManager = getApplicationContext().getPackageManager();

    return packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) && canEnterPiPMode(getApplicationContext());
}

public static boolean canEnterPiPMode(Context context) {
    AppOpsManager appOpsManager = null;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
        appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        return (AppOpsManager.MODE_ALLOWED == appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_PICTURE_IN_PICTURE, android.os.Process.myUid(), context.getPackageName()));

    }
    return false;
}

private void hideControllers() {
    footerLyt.setVisibility(View.GONE);
    callEndBtn.setVisibility(View.GONE);

    minimizeBtn.setVisibility(View.GONE);
    timeChronometer.setVisibility(View.GONE);


}

private void showControllers() {
    footerLyt.setVisibility(View.VISIBLE);
    callEndBtn.setVisibility(View.VISIBLE);

    minimizeBtn.setVisibility(View.VISIBLE);
    timeChronometer.setVisibility(View.VISIBLE);


}

private void minimize() {

    // Hide the controls in picture-in-picture mode.

    // Calculate the aspect ratio of the PIP screen.
    hideControllers();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Rational aspectRatio = new Rational(
                3, 4);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            PictureInPictureParams params = new PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .build();
            enterPictureInPictureMode(params);
        } else {
            enterPictureInPictureMode();
        }

    }
}


@Override
public void onUserLeaveHint() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && isCallConnected && isPIPSupport()) {
        if (!isInPictureInPictureMode()) {
            minimize();
        }
    }
}

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainRootLyt"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
android:orientation="vertical">

<com.twilio.video.VideoView
    android:id="@+id/thumbnail_video_view"
    android:layout_width="@dimen/thumb_video_width"
    android:layout_height="@dimen/thumb_video_height"
    android:layout_alignParentEnd="true"
    android:layout_alignParentRight="true"
    android:layout_margin="16dp"
    android:visibility="gone"
    app:mirror="true"
    app:overlaySurface="true" />

<com.twilio.video.VideoView
    android:id="@+id/primary_video_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center" />

 <--   other childs are in Linear, Relative and Frame -->

</RelativeLayout>
...