デバイス互換性モード

Android では、画面の向きやサイズ変更の制限を宣言するアプリに対して、互換性モードが有効になります。互換性モードを使用すると、大画面デバイスや折りたたみ式折りたたみ式スマートフォンで許容されるアプリの動作が保証されますが、ユーザビリティは最適とはなりません。

アプリごとのオーバーライドを使用すると、デバイスのメーカーはアプリの動作を変更して、ユーザー エクスペリエンスを改善したり、特定のデバイスでアプリが動作しなくなったりしないようにできます。

参照デバイス

次のデバイスでは、異常な構成やアプリで十分にサポートされていない構成が原因で、アプリごとのオーバーライドが必要な場合があります。

  • タブレット: Google Pixel Tablet など、一部のタブレットの自然な向きは横向きです。Display#getRotation()Surface.ROTATION_0 を返す場合、デバイスは自然な向きです。アプリで ROTATION_0 が縦向きであると想定すると、アプリのレイアウトやカメラ プレビューがデバイスのディスプレイと一致しないことがあります。
  • 横向きの折りたたみ式デバイス: Google Pixel Fold などの一部の折りたたみ式デバイスは、折りたたんだときは縦向き、広げたときは横向きになります。アプリが開いた状態の向きを縦向きと想定している場合、ちらつきループやレイアウトの問題が発生する可能性があります。
  • 折りたたみ式折りたたみ式スマートフォン: 折りたたまれた折りたたみ式スマートフォンは通常、縦向きです。ただし、折りたたんだ状態では、通常は横向きの小さなディスプレイになります。アプリはディスプレイのさまざまな向きを識別し、対応する必要があります。

互換性に関する一般的な問題

互換性の問題は、主にアプリの向きの制限、サイズ変更やアスペクト比の制限、カメラ プレビューの向きの誤った処理、API の誤用により発生します。

レターボックス表示

レターボックス表示にすると、アプリは画面の中央に配置されます。大画面の場合は、アクセスしやすいように片方の側に寄せて表示されます。使用されていないディスプレイ領域(アプリの側面または上下)には、マット(単色のバーまたはぼかし壁紙)が表示されます。

大画面のデバイスでは、レターボックス表示になることが多くなります。デバイスのディスプレイの寸法やアスペクト比が通常は標準のスマートフォンとは異なりますが、ほとんどのアプリは標準のスマートフォン用に設計されているためです。

図 1. アプリが縦向きに制限されているため、横向きのタブレットや折りたたみ式デバイスではレターボックス表示されます。

問題

画面の向きやアスペクト比が固定されているか、サイズ変更ができないため、アプリが一部のディスプレイ構成をサポートしません。

アプリの向きとサイズ変更を制御する構成設定は次のとおりです。

  • screenOrientation: アプリの固定の向きを指定します。アプリは Activity#setRequestedOrientation() を使用して、実行時に向きを設定することもできます。

  • resizeableActivity: さまざまなディメンションのウィンドウに合わせてシステムがアプリのサイズを変更できるかどうかを示します。Android 11(API レベル 30)以前では、アプリがマルチウィンドウ モードをサポートするかどうかを指定します。Android 12(API レベル 31)以降では、アプリが小さい画面(コンパクトなウィンドウ サイズ クラス)でマルチウィンドウ モードをサポートするかどうかを指定します。Android 12 以降では、この設定にかかわらず、アプリは大画面(中程度または拡大されたウィンドウ サイズクラス)でのマルチウィンドウ モードをサポートします。

  • maxAspectRatio: アプリがサポートする最大アスペクト比を指定します。maxAspectRatio を設定できるのは、resizeableActivityfalse に設定されているアプリのみです。

  • minAspectRatio: アプリがサポートする最小アスペクト比を指定します。minAspectRatio を設定できるのは、resizeableActivityfalse に設定されているアプリのみです。

最適化

アプリは、すべてのデバイスとマルチウィンドウ モードのディスプレイの向きとサイズをサポートする必要があります。アプリのレイアウトとアプリ マニフェスト ファイルから、画面の向きと固定アスペクト比の制限をすべて削除します。

互換性の対応策

画面の向きやアスペクト比が固定されているアプリが、サイズや画面の向きがアプリで直接サポートされていないウィンドウで実行されている場合、Android では、継続性を維持するためにアプリがレターボックス表示されます。

Android 12(API レベル 31)以降、12L(API レベル 32)では、レターボックス表示のアプリに対してさまざまな機能強化が行われています。デバイス メーカーが UI の機能強化を実装します。これらの改善点を適用するためにアプリ側で追加の開発作業を行う必要はありません。

Android 12(API レベル 31)では、デバイス メーカーが設定できる以下の外観設定が強化されました。

  • 角丸: アプリ ウィンドウの角が洗練された印象になっています。
  • システムバーの透明度: アプリの上に重なるステータスバーとナビゲーション バーは半透明になり、バーのアイコンがレターボックスの背景の上に常に表示されます。
  • アスペクト比の設定が可能: アプリのアスペクト比を調整して、アプリの外観を改善できます。

図 2. UI の機能が強化されたレターボックス表示のアプリ

12L(API レベル 32)では、次のような機能が改善されています。

  • 構成可能な配置: デバイス メーカーは、大画面の場合にアプリをディスプレイの左右に配置し、操作を容易にできます。

  • 再起動ボタンのデザイン変更: デバイス メーカーは、サイズ互換モードの再起動ボタンのデザインを刷新して、ユーザーにわかりやすくすることができます。

Android 13(API レベル 33)では、レターボックス表示したアプリを画面上に配置したり、分割画面モードでレターボックス表示したりする方法について、ユーザー教育ダイアログが追加されています。

図 3. ユーザー向け情報ダイアログが表示された、レターボックス表示のアプリ。

サイズ互換モード

サイズ互換モードは、再起動コントロールを含むレターボックス表示です。ユーザーはこのコントロールによりアプリを再起動してディスプレイを再描画できます。Android は、サイズ変更不可と判断されたアプリに対して、サイズ互換モードを適用します。アクティビティのディメンションと互換性のないディスプレイ コンテナにアクティビティが移動すると、システムはアプリを再スケーリングして、少なくとも 1 つのディメンションがデバイスのディスプレイに収まるようにすることがあります。

たとえば、次のようなデバイス設定を変更すると、サイズ互換モードがトリガーされます。

  • デバイスの回転
  • 折りたたみ式デバイスの折りたたみと展開
  • 全画面モードと分割画面モードの切り替え

問題

一般的にサイズ互換モードが適用されるのは、画面の向きまたはアスペクト比が制限され、サイズ変更不可に設定(またはシステムによって決定)されているアクティビティです。

次のいずれかの条件を満たすアプリは、サイズ変更可能とみなされ、サイズ互換モードにはなりません。

アプリがいずれかの条件を満たしていない場合は、サイズ変更不可とみなされ、サイズ互換モードになる可能性があります。

最適化

アプリはすべてのディスプレイ サイズをサポートする必要があります。アプリ マニフェストで <activity> 要素または <application> 要素の android:resizeableActivity 属性を true に設定し、アプリをサイズ変更可能にします。アプリのレスポンシブ/アダプティブ レイアウトを設計します。詳しくは、各種の画面サイズのサポートマルチウィンドウ モードのサポートをご覧ください。

互換性の対応策

アプリを再スケーリングして少なくとも 1 つのディメンションがディスプレイ ウィンドウに収まるようにすることで、レターボックス アプリの表示を改善できるとシステムが判断した場合、Android はアプリをサイズ互換モードにします。システムは、アプリプロセスを再作成する再起動コントロールを表示し、アクティビティを再作成してディスプレイを再描画します。プロセスとスレッドの概要もご覧ください。

ちらつきループ

アプリがすべてのディスプレイの向きをサポートしていない場合、構成の変更の発生時に新しい画面の向きを繰り返しリクエストして、無限ループが発生し、ディスプレイがちらつく、アプリが無限に回転することがあります。

問題

Android 12(API レベル 31)以降では、デバイス メーカーは、アプリで指定された画面の向きの制限を無視し、代わりに互換モードを適用するようにデバイスを設定できます。たとえば、折りたたみ式デバイスは、デバイスの横向きのタブレット サイズの内部画面にアクティビティが表示される場合、アクティビティの android:screenOrientation="portrait" 設定を無視することがあります。

アプリの向きの制限が無視される場合、アプリは Activity#setRequestedOrientation() を呼び出して画面の向きをプログラムで設定できます。アプリが構成の変更を処理していない場合、この呼び出しによりアプリの再起動がトリガーされます(構成の変更を処理するをご覧ください)。再起動すると、アプリの向きの制限が再び無視され、アプリが setRequestedOrientation() の呼び出しを繰り返し、その呼び出しによってアプリの再起動がトリガーされるという自己永続ループが発生します。

また、デバイス画面の自然な向き(Android によって決定される通常の向き)が横向きである場合にも、この問題が発生することがあります。つまり、Display#getRotation() を呼び出すと、デバイスのアスペクト比が横向きであるのに、Surface.ROTATION_0 が返されます。これまで、アプリは Display.getRotation() = Surface.ROTATION_0 がデバイスが縦向きになっていることを想定していましたが、一部の折りたたみ式デバイスのインナー ディスプレイや一部のタブレットなどでは、そうでない場合もあります。

折りたたみ式デバイスのインナー ディスプレイで横向きになっているアプリの場合、画面の回転を確認し、ROTATION_0 の値を受け取り、デバイスの自然な向きが縦向きであると想定し、setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) を呼び出してアプリのレイアウトを再構成する可能性があります。アプリが(横向きで)再起動すると、画面の回転を再度確認し、ROTATION_0 の値を受け取り、setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) を呼び出して、無限ループを続行する場合があります。

最適化

アプリが以下のことを行わないようにする必要があります。

  • アクティビティの onCreate() メソッドで Activity#setRequestedOrientation() を使用してデフォルトの向きを設定する。構成の未処理の変更により画面の向きのリクエストが予期せずトリガーされる可能性があるため
  • デバイスの自然な向き(ROTATION_0)が縦向きであると想定する
  • 現在のウィンドウ サイズに関係のないシグナル(Display#getRotation()FoldingFeature の有無、非推奨 API など)に基づいて画面の向きを設定します。

互換性の対応策

Android は次の場合に Activity#setRequestedOrientation() の呼び出しを無視します。

  • 前回のメソッド呼び出しからアクティビティがすでに再起動されている、またはカメラ互換力の回転処理が有効になっている(下記のカメラ プレビューを参照)。

    デバイス メーカーは、OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION を使用してこの動作をアプリに適用できます。

  • アクティビティが 1 秒間に 3 回以上画面の向きのリクエストを行った。これは、ループが発生したことを示しています。Android はループ内の 2 つのリクエストのうち、アプリの表示領域を最大化するリクエストを使用します。

    デバイス メーカーは、OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED を使用してこの動作をアプリに適用できます。

カメラ プレビュー

タブレット、ノートパソコン、折りたたみ式ディスプレイでは、カメラアプリのカメラ プレビュー(またはビューファインダー)がずれたり、歪んだりすることがあります。

問題

Android 互換性定義ドキュメントには、カメラのイメージ センサーの向きは、「カメラの長辺と画面の長辺が一致するように向きを調整しなければならない」と記載されています。

多くの場合、アプリはデバイスの向きとカメラのセンサーの向きを縦向きと想定しますが、これは標準のスマートフォンでは妥当な想定です。ただし、タブレットやノートパソコン、およびそれらのカメラセンサーの自然な向きは横向きである場合があります。また、折りたたみ式などの新しいフォーム ファクタでは、自然な向きが複数存在したり、複数のカメラセンサーで向きが異なることがあります。

アプリが想定しないカメラの向きでアクティビティを開始したり、またはカメラやデバイス画面(折りたたみ式デバイス用)を切り替えると、カメラ プレビューの位置がずれたり、歪んだりすることがあります。

最適化

カメラアプリは、正しく調整、拡大縮小されたカメラ プレビューを表示するために、デバイスの向きとカメラのセンサーの向きを正しく識別して管理する必要があります。アプリは、デバイスの回転、センサーの回転、画面またはウィンドウのアスペクト比を計算し、その結果をカメラ プレビューに適用する必要があります。詳しくは、カメラ プレビューカメラのビューファインダーのご紹介をご覧ください。

互換性の対応策

Display#getRotation()Surface.ROTATION_0 を返す場合、デバイスは自然な向きです。システムはデバイスの自然な向きから CameraCharacteristics.SENSOR_ORIENTATION を計算します。Android は、縦向き限定のアプリの縦向きウィンドウを、デバイスの自然な向きに合わせます。ほとんどのアプリではこの処理が想定されています。また、センサーの向きが横向きで、カメラ プレビューが縦向きの場合は、カメラセンサーの画像を切り抜きます。具体的な対応策は次のとおりです。

  • 縦向き限定のアプリでカメラ プレビューを強制的に回転する: 縦向き限定のアプリでは、デバイスの自然な向きとカメラセンサーの向きが縦向きであることを前提としています。ただし、Android 12(API レベル 31)以降では、デバイス メーカーが画面の向きの指定を無視した場合、複数のデバイスの向きでアプリを実行できます。

    縦向き限定のアプリがカメラに接続されている場合、Android はアプリを強制的に回転させ、アプリの縦向きのウィンドウをデバイスの自然な向きに合わせます。

    一部のタブレット(参照デバイスを参照)では、デバイスの自然な向きに合わせて、縦向きのウィンドウが回転し、縦向きで全画面表示されます。アプリは強制回転後に全画面表示されます。

    折りたたみ式デバイスの横向きのインナー画面(リファレンス デバイスを参照)では、開いた状態の自然な向きに合わせて、縦向き専用のアクティビティが横向きに回転します。強制回転後、アプリはレターボックス表示されます。

  • 内部の前面カメラの切り抜き: 一部の折りたたみ式デバイスでは、内部の前面カメラセンサーが横向きになっています。Android では、折りたたみ式のインナー ディスプレイでカメラ プレビューを強制的に回転させるほか、内部の全面(横向き)カメラの画角を切り抜いて、センサーがデバイスの向きと反対の視界を捉えるようにします。

  • カメラ プレビューを強制的に更新する: 強制回転後、システムがアクティビティ メソッド onStop() および onStart()(デフォルト)、または onPause() および onResume()(アプリごとの OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE オーバーライドにより適用)を切り替え、カメラ プレビューが適切に表示されるようにします。

  • アスペクト比のスケーリング: 強制回転したカメラ プレビューのアスペクト比が、大きい方の最小アスペクト比となるように動的に変更されます。これにより、カメラ プレビューが適切に拡大縮小されます。

アプリがカメラ プレビューを正しく処理していれば、アプリ デベロッパーはこれらの回避策をオーバーライドできます。アプリごとのオーバーライドをご覧ください。

よく誤用される API

Android でマルチウィンドウ モードなどの機能や折りたたみ式デバイスなどのデバイスのサポートが追加されると、それまでの API は非推奨になり、すべてのディスプレイ サイズとデバイス フォーム ファクタで機能する最新の API に置き換えられます。ただし、下位互換性のため、非推奨の API も引き続き使用できます。

一部の View API は特別な目的のために設計されていますが、この目的をデベロッパーが十分に理解しているとは限りません。

問題

デベロッパーは非推奨の Display API を引き続き使用し、API がデバイスの表示領域の境界ではなくアプリの境界を返すものと誤って想定します。また、デベロッパーが一般的なディスプレイの指標を取得するために特別な用途のビュー API を誤って使用している場合もあります。その結果、アプリ ウィンドウのサイズ変更イベント後に UI 要素を再配置すると計算が不正確になり、レイアウトの問題が発生します。

非推奨でよく誤用される Display API:

詳しくは、マルチウィンドウ モードのサポートをご覧ください。

誤用されるビュー API:

最適化

UI 要素の配置に、物理的なディスプレイ サイズを使用しないでください。WindowMetrics に基づいて、次の WindowManager API などの API にアプリを移行します。

互換性の対応策

2 つのオーバーライドで、非推奨の Display API と誤用された View API を調整して、アプリの境界を返すようにしました(Display API 用の ALWAYS_SANDBOX_DISPLAY_APIS と、View API 用の OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS)。ALWAYS_SANDBOX_DISPLAY_APIS は、サイズ互換モードの対象となるアプリにもデフォルトで適用されます。

透明アクティビティ

透明アクティビティは、透明な背景スタイルの結果です。以下に例を示します。

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Theme.MaterialComponents.Dialog などのダイアログに関連するテーマには、アクティビティを透明にするスタイルを設定できます。

透明アクティビティは、使用可能なディスプレイ領域をすべてカバーしているわけではありません。そのため、デバイスの回転、デバイスの開閉、マルチウィンドウ モードなどの構成変更に基づいて、利用可能なディスプレイ領域が変化する可能性があるため、管理が困難になる場合があります。

問題

透明アクティビティは、タスク アクティビティ スタックで透明アクティビティの下にある最初の不透明アクティビティの境界に従う必要があります。ただし、権限ダイアログを起動する不透明アクティビティは、トランポリン(別のアクティビティを起動した後、消えるアクティビティ)となる可能性があるため、システムは透過的な権限ダイアログ アクティビティを起動したトランポリン アクティビティの境界を決定できません。

最適化

透明アクティビティは、タスクのアクティビティ スタック内で、その下にある不透明アクティビティのうち最上位のものから制約を継承します。不透明アクティビティは、透明アクティビティのライフサイクル(アクティビティの作成から破棄まで)の全体で使用できるようにする必要があります。このため、トランポリン アクティビティから権限リクエストを開始しないでください。

トランポリン アクティビティが権限リクエストを起動した場合、ユーザーに権限ダイアログが表示されないことがあります。これは、ユーザーがダイアログに応答する前にトランポリン アクティビティが破棄され、ダイアログ アクティビティのディメンションと位置が正しく計算されていない可能性があるためです。

アプリは常に、ユーザーが権限に関する決定を行うまで表示されたままの状態になっているアクティビティから権限リクエストを開始する必要があります。

角丸

スタイルが背景の透明度を指定する場合、またはアクティビティのコンテンツが使用可能なディスプレイ領域を埋めない場合、アクティビティを透明にできます。透明アクティビティが使用可能なディスプレイ領域を埋める場合、デバイス メーカーにより設定されていれば、システムにより角丸がアクティビティに自動的に適用されます。ただし、使用可能なスペースが透明なアクティビティ(権限ダイアログなど)で埋められない場合は、角を丸くするかどうかを決める必要があります。

使用可能なディスプレイ領域を権限ダイアログが埋めることはありません。ダイアログのレイアウトでは通常、LayoutParams.MATCH_PARENT ではなく LayoutParams.WRAP_CONTENT を使用するためです。

互換性の対応策

ユーザーがダイアログに応答するまで、ダイアログ アクティビティを起動するアクティビティを表示したままにする。

システムにより、透明アクティビティは、アクティビティ スタック内で透明アクティビティの下にある最初の不透明アクティビティから、以下に関連する制約を含むすべての制約を継承するようにします。

  • サイズ互換モード
  • 向き
  • アスペクト比

Unity ゲーム

Unity ゲームは Android 全画面モードまたはマルチウィンドウ モードで動作します。ただし、アプリがマルチウィンドウ モードになると、多くの Unity ゲームはフォーカスを喪失し、コンテンツの描画を停止します。

問題

Unity は Unity 2019.4 に Resizable Window オプションを追加し、Android でマルチウィンドウ モードをサポートしました。しかし、初期実装はマルチウィンドウ モードでのアクティビティのライフサイクルに正しく反応せず、アプリがフォーカスを喪失したときに UnityPlayer が再生を一時停止していました。プレーヤーにより、黒い画面、またはゲームの最後のフリーズしたフレームがレンダリングされました。ゲームプレイは、ユーザーが画面をタップした場合にのみ再開されます。Unity エンジンを使用する多くのアプリでこの問題に直面し、マルチウィンドウ モードでは黒いウィンドウとしてレンダリングされます。

最適化

Unity を 2019.4.40 以降にアップグレードして、ゲームを再エクスポートします。Android Player 設定Resizable Window オプションをオンにしたままにします。そうしないと、ゲームがマルチウィンドウ モードで完全に表示されている場合でも、フォーカスされていない間はゲームが一時停止します。

互換性の対応策

デバイス メーカーは、アプリごとの OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS オーバーライドを適用して、マルチウィンドウ モードでアプリに疑似フォーカス イベントを提供できます。オーバーライドすると、アクティビティはコンテンツを再描画できるようになり、ブラックアウトされなくなります。

互換性の問題がないかアプリをテストする

アプリをテストして、さまざまなフォーム ファクタでどのように動作するかを確認するには、次のリソースを活用します。

レターボックス表示になっているか

各アクティビティが、アプリで使用可能なディスプレイ領域をすべて使用できることを確認してください。まず、テストフォルダで次のコードを宣言します。

Kotlin

fun Activity.isLetterboxed() : Boolean {
    if (isInMultiWindowMode) return false

    val wmc = WindowMetricsCalculator.getOrCreate()
    val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds
    val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds

    val isScreenPortrait = maxBounds.height() > maxBounds.width()

    return if (isScreenPortrait) {
        currentBounds.height() < maxBounds.height()
    } else {
        currentBounds.width() < maxBounds.width()
    }
}

Java

public boolean isLetterboxed(Activity activity) {
    if (activity.isInMultiWindowMode()) {
        return false;
    }

    WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate();
    Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds()
    Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds();

    boolean isScreenPortrait = maxBounds.height() > maxBounds.width();

    return (isScreenPortrait)
        ? currentBounds.height() < maxBounds.height()
        : currentBounds.width() < maxBounds.width();
}

次に、テストを実行して動作をアサートし、ターゲット アクティビティがレターボックス表示されていないことを確認します。

Kotlin

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertThat(it.isLetterboxed()).isFalse()
    }
}

Java

@Rule
public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

public void activity_launched_notLetterBoxed() {
    try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) {
        scenario.onActivity(activity -> {
            assertThat(isLetterboxed(activity)).isFalse();
        });
    }
}

理想的には、この種のテストは合格するまで実行し、アプリのアクティビティがアプリで使用可能なディスプレイ領域全体を使用しているとアサートします。すべてのデバイスタイプでアプリをテストして、動作が一貫していることを確認します。

アプリごとのオーバーライド

Android には、アプリに設定されている動作を変更できるオーバーライドが用意されています。たとえば、FORCE_RESIZE_APP オーバーライドは、アプリ マニフェストで resizeableActivity="false" が指定されている場合でも、サイズ互換モードをバイパスし、ディスプレイの寸法に合わせてアプリのサイズを変更するようシステムに指示します。

デバイス メーカーは、特定の大画面デバイス上の一部のアプリまたはすべてのアプリにオーバーライドを適用します。Android 14(API レベル 34)以降では、ユーザーはデバイスの設定からアプリにオーバーライドを適用できます。

ユーザーによるアプリごとのオーバーライド

Android 14 以降では、ユーザーが設定メニューでアプリのアスペクト比を変更できます。参照デバイスなどの大画面デバイスは、メニューを実装します。

このメニューには、デバイスにインストールされているすべてのアプリのリストが表示されます。ユーザーがアプリを選択して、アプリのアスペクト比を 3:4、1:1、全画面、またはデバイス メーカーが設定したその他の値に設定します。ユーザーは、アプリ マニフェストで指定されているアプリのデフォルトにアスペクト比をリセットすることもできます。

アプリで互換性のオーバーライドをオプトアウトするには、次の PackageManager.Property タグを設定します。

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    ユーザーのアスペクト比の互換性オーバーライドをオプトアウトするには、アプリ マニフェストにプロパティを追加し、値を false に設定します。

    <application>
        <property
            android:name="android.window.
            PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    アプリは、デバイスの設定でアプリのリストから除外されます。ユーザーはアプリのアスペクト比をオーバーライドできません。

    このプロパティを true に設定しても効果はありません。

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    ユーザーのアスペクト比の互換性のオーバーライドの全画面オプションをオプトアウトするには、アプリ マニフェストにプロパティを追加し、値を false に設定します。

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

    全画面オプションが、デバイス設定のアスペクト比オプションのリストから削除されます。ユーザーはアプリに全画面オーバーライドを適用できません。

    このプロパティを true に設定しても影響はありません。

すべての画面でアプリを最適化する: アプリにアスペクト比の制限を設定しないでください。ウィンドウ サイズ クラスを使用して、利用可能なディスプレイ領域に基づいてさまざまなレイアウトをサポートします。

デバイス メーカーによるアプリごとのオーバーライド

デバイス メーカーは、一部のデバイスでアプリごとにオーバーライドを適用します。参照デバイスは、デフォルトでいくつかのオーバーライドをさまざまなアプリに適用できます。

アプリはほとんどのオーバーライドをオプトアウトできます(下記のアプリごとのオーバーライドの表をご覧ください)。

互換性フレームワークを使用すると、オーバーライドを有効または無効にしてアプリをテストできます(互換性フレームワーク ツールをご覧ください)。有効にすると、オーバーライドがアプリ全体に適用されます。

Android Debug Bridge(adb)を使用して、オーバーライドを有効または無効にし、アプリに適用するオーバーライドを確認することもできます。

オーバーライドを有効または無効にする方法は次のとおりです。

adb shell am compat enable/disable <override name/id> <package>

参照デバイスで、アプリに適用されるオーバーライドを確認します。

adb shell dumpsys platform_compat | grep <package name>

次の表に、使用可能なオーバーライドと、アプリがオーバーライドに依存する必要がないようにアプリを最適化する方法のガイダンスを示します。一部のオーバーライドをオプトアウトするには、アプリ マニフェストにプロパティ フラグを追加します。

アプリごとのオーバーライド
タイプ 名前 ID 説明
サイズ変更 FORCE_RESIZE_APP 174042936 構成変更時にアプリのサイズ互換モードをバイパスします。
FORCE_NON_RESIZE_APP 181136395 構成を変更するとアプリを強制的にサイズ互換モードにします。
アスペクト比 OVERRIDE_MIN_ASPECT_RATIO 174042980 他のアスペクト比のオーバーライドを適用するには、ゲートキーパーのオーバーライドを有効にする必要があります。
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 有効(デフォルト)に設定した場合、スコープが縦向き限定のアクティビティにオーバーライドされます。
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 最小アスペクト比を 3:2 に変更します。
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 最小アスペクト比を 16:9 に変更します。
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 最小アスペクト比をディスプレイ サイズの 50%(分割画面のアスペクト比)に変更します。
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 最小アスペクト比のオーバーライドを無効にし、デバイスが縦向きのときにアプリが全画面表示されるようにします。
向き OVERRIDE_ANY_ORIENTATION 265464455 任意の向きのオーバーライドを有効にします。
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 画面の向き、サイズ変更、アスペクト比の制限をオーバーライドします。
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 アクティビティの向きが未定義の場合、向きが縦向きになるようにオーバーライドします。
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 アクティビティの向きが未定義の場合、向きを nosensor(デバイスの自然な向きを使用)にオーバーライドします。
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 横向き限定のアプリを 180 度回転します。
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 向きのオーバーライドのスコープを、アプリがカメラに接続している場合に限定します。
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 タスクが全画面表示の場合(レターボックス表示の場合も含む)に、ディスプレイを自然な横向きで固定します。
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 回転の無限ループを回避するため、アプリからの向きのリクエストは無視されます。
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 アクティビティが再起動されている間、向きのリクエストの繰り返しを無視します。アプリが 1 秒以内に 2 つ以上の新しい画面の向きをリクエストしていることを Android が検出した場合、システムはこれを回転無限ループとみなし、オーバーライドを適用します。
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 デバイス メーカーの画面の向きのリクエストを無視する設定を無効にすることで、レターボックス表示されないようにします。
サンドボックス API NEVER_SANDBOX_DISPLAY_APIS 184838306 Display API の動作が変更されないようにします。
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 アプリ内の Display API が強制的にアプリの境界を返すようにします。Display API は論理ディスプレイ領域の境界を返しますが、場合によっては、Display API がアプリの境界を返すものとアプリが想定するため、UI の問題が発生することがあります。
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 アプリで使用される View API が強制的にアプリの境界を返すようにします。View API は論理的なディスプレイ領域の境界を返しますが、場合によっては、View API がアプリの境界を返すものとアプリが想定するため、UI の問題が発生することがあります。
カメラ互換性 OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 強制回転をオフにします。デフォルトでは、カメラ プレビューが開いているときに、向きが固定されているすべてのカメラアプリが強制的に回転します。
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 カメラ プレビューが強制回転されたときに適用されるデフォルトのハード更新を削除します。
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 カメラ プレビューが強制的に回転されると、ハード更新がソフト更新に切り替わります。これにより、強制回転中の状態を保持できます。デフォルトでは、カメラ プレビューが強制的に回転されると、Android はハード更新を適用します。ハード更新を行うと、以前の状態をキャッシュに保存する方法によっては、アプリが状態を失ったり、停止したりする問題が発生することがあります。
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 内部の前面カメラの画像バッファを切り抜きます。オーバーライドを無効にすると、内部の前面カメラの切り抜きが解除され、カメラ プレビューの画角が広がります。一部の折りたたみ式デバイス(参照デバイスを参照)では、インナーの前面カメラを使用している場合、デフォルトですべてのカメラアプリのカメラ プレビューが切り抜かれます。
その他 OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 分割画面モードでアプリがフォーカスを喪失したときにアプリが黒く表示されないようにします。アプリは、フォーカスされてから、アプリのコンテンツを描画します。そのため、アプリはフリーズしたり、黒く表示されることがあります。このオーバーライドにより、Android はアプリに偽のフォーカス イベントを送信して、アプリにコンテンツの描画を再開するようシグナルを送ることができます。

FORCE_RESIZE_APP

オーバーライドが適用されるパッケージを強制的にサイズ変更可能にします。アプリをマルチウィンドウ モードにできるかどうかは変更されませんが、画面のサイズ変更時にサイズ互換モードにならずにアプリのサイズを変更できるようになります。

アプリでオーバーライドと同じ結果を得る方法

アプリ マニフェストで、android:resizeableActivity 属性を true に設定するか、android:resizeableActivity=false でマルチウィンドウ モードを無効にする間のサイズ変更をサポートするには、android.supports_size_changes メタデータ フラグを true に設定します。

アプリを最適化する方法

レスポンシブ / アダプティブ レイアウトを使用して、アプリがすべての表示サイズとアスペクト比に対応できるようにします。各種の画面サイズのサポートをご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDESfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用してアプリのサイズを変更可能にするには:

adb shell am compat enable FORCE_RESIZE_APP <package>

オーバーライドを削除するには:

adb shell am compat disable FORCE_RESIZE_APP <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

FORCE_NON_RESIZE_APP

オーバーライドが適用されるパッケージを強制的にサイズ変更不可に設定し、構成変更時にサイズ互換モードにします。

アプリでオーバーライドと同じ結果を得る方法

アプリ マニフェストで android:resizeableActivity 属性と android.supports_size_changes メタデータ フラグの両方を false に設定し、向きまたはアスペクト比の制限を宣言します。

アプリを最適化する方法

サイズ変更時に正常に動作するすべてのアプリでは、android:resizeableActivity または android.supports_size_changestrue に設定されています。それ以外のアプリは、サイズ変更時に適切に動作するように改善する必要があります。android:resizeableActivity をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDESfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用してアプリのサイズを変更できないようにするには:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

オーバーライドを削除するには:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_MIN_ASPECT_RATIO

所定の最小アスペクト比を強制的に適用するすべてのオーバーライドに対するゲートキーパー。

アプリでオーバーライドと同じ結果を得る方法

アクティビティ レベルまたはアプリレベルで android:minAspectRatio を設定します。

アプリを最適化する方法

アプリにアスペクト比の制限を設定しないでください。アプリがさまざまな画面サイズをサポートしていることを確認します。ウィンドウ サイズクラスを使用すると、アプリの画面上のスペースの大きさに基づいてさまざまなレイアウトをサポートできます。Compose WindowSizeClass APIWindowSizeClass API の表示をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

アスペクト比の制限を指定するか、プロパティ フラグ PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDEfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

縦向き限定のアクティビティに対して、所定の最小アスペクト比を強制的に適用するアプリの設定を制限します。デフォルトで有効です。OVERRIDE_MIN_ASPECT_RATIO も有効になっている場合にのみ効果があります。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

アプリを最適化する方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

アクティビティの最小アスペクト比を中程度の値(3:2)に設定します。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

アプリを最適化する方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_MIN_ASPECT_RATIO_LARGE

アクティビティの最小アスペクト比を大きな値(16:9)に設定します

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

アプリを最適化する方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

分割画面のアスペクト比の使用を有効にします。利用可能なすべてのスペースをアプリが分割画面モードで使用できるようにし、レターボックス表示を回避します。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

アプリを最適化する方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

利用可能なすべての画面スペースを使用するには、縦向きの全画面表示の最小アスペクト比のオーバーライドを無効にします。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

アプリを最適化する方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_MIN_ASPECT_RATIO をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_ANY_ORIENTATION

次のオーバーライドを有効にして、すべての向きをオーバーライドします。

アプリでオーバーライドと同じ結果を得る方法

activity:screenOrientation マニフェスト属性を設定するか、Activity#setRequestedOrientation() API を使用します。

アプリを最適化する方法

アプリはすべての画面の向きをサポートする必要があります。画面の向きの変更は構成変更であり、システムにアプリの破棄と再作成を行うか、自分で構成変更を管理するかの 2 つの方法があります。構成の変更を自分で管理する場合は、ViewModel を使用してアプリの状態を保持できます。ごくまれに、小さいディスプレイでのみ画面の向きをロックすることもできますが、その場合、ユーザーが必要に応じてアプリを回転させる場合と比べてスケーリングが妨げられる可能性があります。Android 12L 以降では、固定の画面の向きをデバイス設定でオーバーライドできます。構成変更の処理とすべての画面の向きのサポートについて詳しくは、構成の変更を処理するViewModel の概要スマートフォンではアプリの向きが制限されるが、大画面デバイスでは制限されないをご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDEfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_ANY_ORIENTATION_TO_USER

利用可能なディスプレイ領域をアプリが埋めることができるようにします。アプリ マニフェストで指定されている向き、サイズ変更、アスペクト比の制限をオーバーライドします。また、Activity#setRequestedOrientation() の呼び出しも無視されます。

アプリでオーバーライドと同じ結果を得る方法

  • android:screenOrientation マニフェスト属性は設定しないでください。また、この属性を "user" に設定しないでください。

  • android:resizeableActivity マニフェスト属性を true に設定します。

  • 小画面で、android:resizeableActivity=false でマルチウィンドウ モードを無効にしながらアプリのサイズ変更をサポートするには、android.supports_size_changes メタデータ フラグを true に設定します。minAspectRatiomaxAspectRatio は設定しないでください

アプリを最適化する方法

アプリがすべての画面の向きをサポートするようにします。アプリのマニフェストでは screenOrientation 仕様を設定しないでください。アプリのマニフェストで android:resizeableActivity 属性を true に設定して、アプリのサイズ変更、マルチウィンドウ モード、すべてのディスプレイのアスペクト比をサポートします。各種の画面サイズのサポートをご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

パッケージ内のすべてのアクティビティに対して縦向きを有効にします。OVERRIDE_ANY_ORIENTATION が有効になっていない限り、オーバーライドはアクティビティで他の固定の向きが指定されていない場合のみ使用されます。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

パッケージ内のすべてのアクティビティに対して nosensor の向きを有効にします。OVERRIDE_ANY_ORIENTATION が有効になっていない限り、オーバーライドはアクティビティで他の固定の向きが指定されていない場合のみ使用されます。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

パッケージ内のすべてのアクティビティに対して reverseLandscape の向きを有効にします。OVERRIDE_ANY_ORIENTATION が有効になっていない限り、オーバーライドはアクティビティで他の固定の向きが指定されていない場合のみ使用されます。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAITOVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOROVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE の各オーバーライドが、カメラ接続がアクティブな場合にのみ有効になるよう制限します。

アプリでオーバーライドと同じ結果を得る方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを調整するプロパティ フラグ

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

次の条件を満たす場合、ディスプレイの向きを自然な横向きに制限します。

  • アクティビティが全画面表示である
  • オプトアウト コンポーネント プロパティ PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE が有効になっていない
  • ディスプレイでデバイス メーカーの画面の向きのリクエストを無視する設定が有効になっている
  • ディスプレイの自然な向きが横向きである

アプリでオーバーライドと同じ結果を得る方法

該当なし。この問題はアプリケーション ロジックで解決する必要があります。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDEfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

アプリの再起動時またはアクティブなカメラ互換処理がある場合に、Activity#setRequestedOrientation() の呼び出しに応じてアプリの向きの更新をスキップする互換性ポリシーを有効にします。

アプリでオーバーライドと同じ結果を得る方法

プロパティ フラグ PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATIONtrue に設定します。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATIONfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

アクティビティが固定の向きに対してレターボックス表示されていないときにアプリが 1 秒間に 3 回以上 Activity#setRequestedOrientation() を呼び出した場合に、リクエストされたアプリの向きを無視する互換性ポリシーを有効にします。

アプリでオーバーライドと同じ結果を得る方法

該当なし。この問題はアプリケーション ロジックで解決する必要があります。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTEDfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

デバイス メーカーがディスプレイ領域またはディスプレイ全体で有効にできる画面の向きのリクエスト動作を無視する操作からパッケージを除外します。

アプリでオーバーライドと同じ結果を得る方法

該当なし。この問題はアプリケーション ロジックで解決する必要があります。

アプリを最適化する方法

OVERRIDE_ANY_ORIENTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

オプトアウトはできません。画面の向きのリクエストを無視するデバイス メーカーの設定が有効になっているデバイスにアプリが対応していない場合、オーバーライドを無効にすると危険が生じる可能性があります。オーバーライドを無効にするには、Android デベロッパー リレーションズにお問い合わせください。

オーバーライドを調整するプロパティ フラグ

このオーバーライドにプロパティ フラグはありません。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

NEVER_SANDBOX_DISPLAY_APIS

レターボックス表示またはサイズ互換モードのアクティビティについて、パッケージに Display API サンドボックスが適用されなくなります。Display API は引き続きディスプレイ領域の境界を設定します。

アプリでオーバーライドと同じ結果を得る方法

サイズ変更可能なアクティビティを宣言するには、android:resizeableActivity マニフェスト属性を true に設定するか、android.supports_size_changes メタデータ フラグを true に設定します。

アプリを最適化する方法

アプリが完全にサイズ変更可能であると宣言する場合、表示サイズを使用して UI 要素を配置しないでください。WindowMetrics を提供する最新の API にアプリを移行します。Jetpack Compose を使用している場合は、WindowSizeClass API を利用して、現在のディスプレイ上のアプリの画面領域に基づいて UI を描画します。ウィンドウ サイズクラスを使用するをご覧ください。

オーバーライドを無効化またはオプトアウトする方法

オプトアウトはできません。非推奨の API から移行してください。

オーバーライドを調整するプロパティ フラグ

このオーバーライドにプロパティ フラグはありません。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

オーバーライドを削除するには:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

ALWAYS_SANDBOX_DISPLAY_APIS

ウィンドウ モードに関係なく、適用されるパッケージを常に Display API サンドボックス化します。Display API では常にアプリの境界が設定されます。

アプリでオーバーライドと同じ結果を得る方法

android:resizeableActivity 属性を false に設定するか、android.supports_size_changes メタデータ フラグを false に設定することで、サイズ変更できないアクティビティを宣言します。

アプリを最適化する方法

完全にサイズ変更可能であると宣言しているアプリでは、UI 要素の配置にディスプレイ サイズを使用しないでください。非推奨の API から、WindowMetrics を提供する最新の API にアプリを移行します。WindowMetricsCalculator をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

オプトアウトはできません。非推奨の API から移行してください。

オーバーライドを調整するプロパティ フラグ

このオーバーライドにプロパティ フラグはありません。

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

オーバーライドを削除するには:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

パッケージが次の View API をアクティビティの境界でサンドボックス化するよう設定します。

アプリでオーバーライドと同じ結果を得る方法

デバイス ディスプレイの境界とデバイス ディスプレイに対する相対オフセットではなく、アプリ ウィンドウの境界とアプリ ウィンドウに対する相対オフセットを提供する API を使用して、アプリコードの問題を解決します。

アプリを最適化する方法

アプリでは、レターボックス表示とマルチウィンドウ モードがアプリに適用される可能性を考慮し、View API を使用する必要があります。WindowMetricsCalculator をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APISfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

強制回転を無効にします。一部のアプリでユーザー エクスペリエンスが向上します。

アプリでオーバーライドと同じ結果を得る方法

プロパティ フラグ PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATIONfalse に設定します。

アプリを最適化する方法

キャッシュされたカメラセンサーの向きやデバイス情報を使用しないでください。カメラの互換性に関するガイダンスについては、カメラのビューファインダーの概要カメラアプリでサイズ変更可能なサーフェスをサポートするをご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATIONtrue に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用して、強制回転を解除するには:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

オーバーライドを解除して、強制回転を発生させるには:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

強制回転後にアクティビティの更新を無効にします。更新が原因でアプリの状態が喪失した場合のユーザー エクスペリエンスが改善されます。

アプリでオーバーライドと同じ結果を得る方法

プロパティ フラグ PROPERTY_CAMERA_COMPAT_ALLOW_REFRESHfalse に設定します。

アプリを最適化する方法

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_CAMERA_COMPAT_ALLOW_REFRESHtrue に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用して、アクティビティの更新を解除するには:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

オーバーライドを解除して、アクティビティの更新を許可するには:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

適用先のパッケージが、カメラ互換性強制回転の後、onResume()onPause()onResume() ではなく onResume()onStop()onResume() のサイクルでアクティビティの更新を実行するように設定します。

アプリでオーバーライドと同じ結果を得る方法

プロパティ フラグ PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSEtrue に設定します。

アプリを最適化する方法

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSEfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

カメラの縦向きがデバイスの自然な向きと一致しない場合、カメラの出力が反対方向に切り抜かれます。多くのアプリはこの状況を処理せず、引き伸ばされた画像を表示します。

アプリでオーバーライドと同じ結果を得る方法

プロパティ フラグ PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAITtrue に設定します。

アプリを最適化する方法

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION をご覧ください。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAITfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用して、内部の前面カメラの切り抜きを適用するには:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

オーバーライドを解除して、内部の前面カメラの切り抜きを解除するには:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

アプリがアプリの画面共有をオプトアウトできないようにします(メディア プロジェクションをご覧ください)。アプリが createConfigForDefaultDisplay() API を悪用して全画面キャプチャを強制し、全画面でキャプチャされますがアプリの画面共有ではキャプチャされない通知の内容、およびウィンドウ モードに関係なくすべてのアプリを公開することでユーザーのプライバシーを危険にさらす場合に実装されます。

アプリでオーバーライドと同じ結果を得る方法

デフォルトのメディア プロジェクション動作(Android 14、API レベル 34、createScreenCaptureIntent() で実装)を許可します。これにより、ユーザーはウィンドウ モードに関係なく、全画面と 1 つのアプリ ウィンドウのどちらを共有するかを決定できます。または、createConfigForUserChoice() の呼び出しから返された MediaProjectionConfig 引数を使用して createScreenCaptureIntent(MediaProjectionConfig) を呼び出します。

アプリを最適化する方法

メディア プロジェクション中にデバイスのディスプレイ全体を共有するか、アプリ ウィンドウを共有するかをユーザーが選択できるようにします。これは Android 14 のデフォルトの動作です。

マルチウィンドウ モードをサポートするように、アプリをサイズ変更可能にします(resizeableActivity="true")。

オーバーライドを無効化またはオプトアウトする方法

ユーザーのプライバシーの重要性から、アプリでこのオーバーライドを無効にしたりオプトアウトしたりすることはできません。

オーバーライドを調整するプロパティ フラグ

なし。

オーバーライドをテストする adb コマンド

オーバーライドを適用して、アプリの部分画面共有のオプトアウトをキャンセルし(つまり、部分画面共有を有効にします)、次のようにします。

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

オーバーライドを解除して、アプリで部分画面共有をオプトアウトできるようにするには:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

分割画面モードで、フォーカスされていないアプリに対して偽のフォーカスを送信できるようになります。一部のゲームエンジンは、アプリのコンテンツを描画する前にフォーカスの取得を待機します。偽のフォーカスは、アプリが再開してまだフォーカスされていない場合に、アプリが黒く塗りつぶされた状態にならないようにするのに役立ちます。

アプリでオーバーライドと同じ結果を得る方法

プロパティ フラグ PROPERTY_COMPAT_ENABLE_FAKE_FOCUStrue に設定します。

アプリを最適化する方法

アプリで複数の画面の向きと構成の変更を適切に処理できる場合は、この問題を回避できます。大画面アプリの品質に関するガイドラインに沿って、アプリを大画面に対応させます。

Unity ゲームエンジンを実行している場合は、バージョン 2019.4.40 以降にアップグレードして、ゲームを再エクスポートします。Android Player 設定で Resizable Window オプションをオンのままにします。

オーバーライドを無効化またはオプトアウトする方法

プロパティ フラグ PROPERTY_COMPAT_ENABLE_FAKE_FOCUSfalse に設定します。

オーバーライドを調整するプロパティ フラグ

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

オーバーライドをテストする adb コマンド

オーバーライドを適用するには:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

オーバーライドを削除するには:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

注: これらのコマンドによるオーバーライドの適用や削除はあくまで一時的なものです。

参考情報