web-dev-qa-db-ja.com

Picture-in-Pictureモードを終了する方法

アクティビティを現​​在のフォームからピクチャーインピクチャー表現に移動するenterPictureInPictureMode()があります。

それを元に戻して、アクティビティを破壊する以外に、アクティビティを通常の状態に戻す手段は何ですか? ActivityにはexitPictureInPictureMode()leavePictureInPictureMode()janeGetMeOffThisCrazyPictureInPictureModeThing()の各メソッドはありません。また、ドキュメントには代替方法が記載されていないようです。

Android O、モバイルデバイスでのピクチャインピクチャモードのソリューションに興味がありますが、それがAndroidテレビでも素晴らしい!

PDATE 2017-04-08:ユーザーがXボタンをクリックしてピクチャーインピクチャーモードを終了したときに通常モードに戻る場合は、次のようにします。

  @Override
  public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    super.onPictureInPictureModeChanged(isInPictureInPictureMode);

    if (!isInPictureInPictureMode) {
      getApplication().startActivity(new Intent(this, getClass())
        .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
    }
  }

重要なのは、FLAG_ACTIVITY_REORDER_TO_FRONTで現在のアクティビティを再開するためにstartActivity()を呼び出すことです。 singleTaskアクティビティでは、Activityシングルトンなど、Application以外のコンテキストでそれを呼び出す必要があります。これはonStop()またはonStart()をトリガーするようには見えませんが、onNewIntent()をトリガーします(startActivity()に渡すIntentは何でも)。

33
CommonsWare
  1. アクティビティを後ろに移動します

    activity.moveTaskToBack(false /* nonRoot */);
    
  2. アクティビティを前面に戻す

    Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
    startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    activity.startActivity(startIntent);
    
7
rds

アクティビティがPicture-in-Pictureモードを終了することを決定できるとは思わない。

Android O APIプレビュードキュメント から:

PIPモードに入るアクティビティは一時停止状態になりますが、開始されたままです。ユーザーがPIPアクティビティをタップすると、システムはユーザーが操作するためのメニューを表示します。 PIP状態にある間、タッチイベントはアクティビティに到達しません。

アクティビティは onPictureInPictureModeChanged() で通知されます。

2
rds

公式ドキュメント は、PIPウィンドウにメニューが表示され、フルスクリーンに切り替えることができると言います。

PIPウィンドウは240x135 dpであり、システムによって選択された画面の4つのコーナーのいずれかの最上層に表示されます。ユーザーはPIPメニューを表示して、PIPウィンドウを全画面に切り替えたり、ホームボタンを押しながらPIPウィンドウを閉じたりできます。リモートで。メイン画面で別のビデオの再生が開始されると、PIPウィンドウは自動的に閉じられます。

また、ユーザーがPIPモードを切り替えるたびに、PIP変更イベントをオーバーライドしてUI要素を処理できます。

onPictureInPictureModeChangedへのリンク

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
    if (isInPictureInPictureMode) {
        // Hide the controls in picture-in-picture mode.
        ...
    } else {
        // Restore the playback UI based on the playback status.
        ...
    }
}
1
ugur

これを行うための100%信頼できる方法を見つけました。

  1. マニフェスト内のPIPアクティビティのtaskAffinity属性を「com.package.pip」のようなものに設定します。何でも構いません。デフォルトのタスクアフィニティであるパッケージ名と異なっていればよいだけです。これにより、まったく別のアプリであるかのように、完全に独立したスタックで起動します。
  2. PIPを終了する場合は、別のアクティビティ内からstartActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))を使用して起動してください。

アプリのメインアクティビティが現在PIPモードになっているときに何が起こるかを見て、ランチャーから起動すると、これを複製できると思いました。

0
Grishka

私は同じ問題を抱えていました:

  • MainActivityは、PIPモードが有効になっているVideoPlayerActivityを開きます。
  • 戻るボタンを押して、PIPモードに移動します。
  • MainActivityを終了するまで、戻るボタンをもう一度押します。
  • PIPウィンドウの閉じる(X)ボタンを押します。
  • アプリケーションを開くと、VideoPlayerActivityが開きます。

上記の解決策はどれもうまくいきませんが、Xボタンをリッスンする唯一の方法はonStopをオーバーライドすることです。

アクティビティがPIPから復元されると、onResumeonPictureInPictureModeChangedが呼び出され、Xボタンがクリックされると、onStoponPictureInPictureModeChangedと呼ばれます。

そこで、onPictureInPictureModeChangedが呼び出されたときにonStop内でfinish()を呼び出そうとしました。

override fun onStop() {
    super.onStop()
    onStopCalled = true
}

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
        if (isInPictureInPictureMode) {
            // ...
        } else {
            if (onStopCalled) {
                finish()
            }
        }
    }
0
Saeed Masoumi