大画面のクックブック

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

Android は 5 つ星の大画面アプリに必要な材料をすべて提供しています。このクックブックのレシピでは、開発における特定の問題を解決するために、最適な材料を選択して組み合わせています。各レシピには、おすすめの方法、質の高いコードサンプル、詳細な手順が含まれているので、大画面に対応する際にお役立てください。

星による評価

レシピは、大画面のアプリの品質に関するガイドラインにどの程度準拠しているかに基づいて評価されます。

5 つ星評価 レベル 1(大画面によって差別化)の条件を満たしている
4 つ星評価 レベル 2(大画面向けに最適化)の条件を満たしている
3 つ星評価 レベル 3(大画面に対応)の条件を満たしている
2 つ星評価 大画面向けの機能をいくつか提供しているが、大画面のアプリの品質に関するガイドラインの条件は満たしていない
1 つ星評価 特定のユースケースのニーズは満たしているが、大画面を適切にサポートしていない

Chromebook カメラのサポート

3 つ星評価

Google Play で Chromebook ユーザーにも興味を持ってもらいましょう。

御社のカメラアプリがカメラの基本機能のみで動作できるなら、Chromebook も対象になります。ハイエンド スマートフォンに搭載されるカメラの高度な機能をうっかり指定すると、アプリストアによって Chromebook ユーザーへのインストールが阻止されるので、指定しないようにしましょう。

Chromebook には、前面(ユーザーの方を向いた)カメラが搭載されており、ビデオ会議、スナップショットなどの用途に適しています。ただし、Chromebook には背面(外向き)カメラは搭載されていないものがあります。また、Chromebook の前面カメラは通常、オートフォーカスやフラッシュをサポートしていません。

おすすめの方法

多用途のカメラアプリの場合は、カメラの構成(前面カメラ、背面カメラ、USB で接続された外部カメラがあるかどうか)によらず、すべてのデバイスをサポートします。

できるだけ多くのデバイスに対してアプリがアプリストアで表示されるようにするには、アプリが使用するすべてのカメラ機能を必ず宣言し、それらの機能が必須かどうかを明示してください。

材料

  • CAMERA 権限 - アプリにデバイスのカメラへのアクセスを許可します。
  • <uses-feature> マニフェスト要素 - アプリで使用する機能をアプリストアに通知します。
  • required 属性 - アプリが特定の機能なしで動作できるかどうかをアプリストアに指定します。

手順

概要

CAMERA 権限を宣言します。カメラの基本サポートを提供するカメラ機能を宣言します。機能ごとに必須かどうかを指定します。

1. CAMERA 権限を宣言する

アプリ マニフェストに次の権限を追加します。

<uses-permission android:name="android.permission.CAMERA" />
2. カメラの基本機能を宣言する

アプリ マニフェストに以下の機能を追加します。

<uses-feature android:name="android.hardware.camera.any" android:required="false" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.camera.flash" android:required="false" />
3. 各機能が必須かどうかを指定する

android.hardware.camera.any 機能に android:required="false" を設定すると、あらゆる種類の内蔵カメラや外部カメラが搭載されたデバイスだけでなく、カメラが搭載されていないデバイスからもアプリにアクセスできるようになります。

その他の機能については、android:required="false" を設定することで、背面カメラ、オートフォーカス、またはフラッシュを備えていない Chromebook のようなデバイスがアプリストアでアプリにアクセスできるようにします。

結果

Chromebook ユーザーも、Google Play などのアプリストアからアプリをダウンロードしてインストールできます。また、フル機能のカメラをサポートしているデバイス(スマートフォンなど)で、カメラの機能の制限はなくなります。

アプリでサポートされているカメラ機能を明示的に設定し、アプリに必須の機能を指定することで、できるだけ多くのデバイスでアプリが使用できるようになりました。

参考情報

詳しくは、<uses-feature> ドキュメントのカメラのハードウェア機能をご覧ください。

スマートフォンではアプリの向きが制限されるが、大画面デバイスでは制限されない

2 つ星評価

御社のアプリは縦向きのスマートフォンで最適に動作するため、アプリを縦向きのみに制限しているとします。しかし、横向きの大画面ではより多くの操作を行える可能性があります。

両方に対応するには、つまり、小さい画面ではアプリを縦向きに制限し、大画面では横向きを可能にするには、どうすればよいでしょうか。

おすすめの方法

優れたアプリは、ユーザーの好み(デバイスの向きなど)を尊重してくれます。

大画面のアプリの品質に関するガイドラインでは、アプリですべてのデバイス設定(縦向きと横向き、マルチ ウィンドウ モード、折りたたみ式デバイスの折りたたみ / 展開状態など)をサポートすることを推奨しています。アプリはさまざまな設定に対してレイアウトとユーザー インターフェースを最適化する必要があります。また、設定の変更時に状態を保存して復元する必要があります。

このレシピは、大画面をサポートするための一時的な手段です。アプリを改善してあらゆるデバイス設定を完全にサポートできるようになるまで、このレシピをご利用ください。

材料

  • screenOrientation: デバイスの向きの変化にアプリがどう反応するかを指定できるアプリ マニフェストの設定
  • Jetpack WindowManager: アプリ ウィンドウのサイズとアスペクト比を判別できるライブラリ。API レベル 14 との下位互換性がある
  • Activity#setRequestedOrientation(): 実行時にアプリの向きを変更できるメソッド

手順

概要

デフォルトでは、アプリがアプリ マニフェストで向きの変更を扱えるようにします。実行時にアプリのウィンドウ サイズを判別します。アプリ ウィンドウが小さい場合は、マニフェストの向きの設定をオーバーライドして、アプリの向きを制限します。

1. アプリ マニフェストで向きの設定を指定する

アプリ マニフェストの screenOrientation 要素を fullUser に設定します。ユーザーがセンサーベースの回転をロックしていない場合、アプリはすべてのデバイスの向きをサポートします。

<activity
    android:name=".MyActivity"
    android:screenOrientation="fullUser">

2. 画面サイズを判別する

ユーザーが許可したすべての向きサポートするようにマニフェストが設定されている場合、画面サイズに基づいてアプリの向きをプログラムで指定することができます。

Jetpack WindowManager ライブラリの WindowMetricsCalculator#computeMaximumWindowMetrics() メソッドを使用して、デバイスの画面サイズを WindowMetrics オブジェクトとして取得します。このウィンドウ指標をウィンドウ サイズクラスと比較すると、向きを制限するタイミングを判断できます。

ウィンドウ サイズクラスは、小さい画面と大画面の間のブレークポイントを提供します。一般的なスマートフォンの小さい方のサイズ(幅または高さ)は 600 dp 未満です。タブレットや大画面の折りたたみ式デバイスの小さい方のサイズは 600 dp 以上です。

ブレークポイントの dp 値を使用して画面サイズを判別します。

Kotlin

/** Determines whether the device has a compact screen. **/
fun compactScreen(): Boolean {
    val screenMetrics = WindowMetricsCalculator
                        .getOrCreate()
                        .computeMaximumWindowMetrics(this)
    val shortSide = min(screenMetrics.bounds.width(),
                        screenMetrics.bounds.height())
    return shortSide / resources.displayMetrics.density < 600
}

Java

/** Determines whether the device has a compact screen. **/
public boolean compactScreen() {
    WindowMetrics screenMetrics = WindowMetricsCalculator
                                  .getOrCreate()
                                  .computeMaximumWindowMetrics(this);
    int shortSide = Math.min(screenMetrics.getBounds().width(),
                             screenMetrics.getBounds().height());
    return shortSide / getResources().getDisplayMetrics().density < 600;
}
    注:
  • 上記の例は、アクティビティのメソッドとして実装されています。そのため、アクティビティは computeMaximumWindowMetrics() の引数で this として逆参照されています。
  • アプリがマルチ ウィンドウ モードで起動される可能性があるため、computeCurrentWindowMetrics() の代わりに computeMaximumWindowMetrics() メソッドが使用されています。マルチ ウィンドウ モードの場合、画面の向きの設定は無視されます。アプリ ウィンドウがデバイスの画面全体になっていない限り、アプリ ウィンドウのサイズを判別して向きの設定をオーバーライドしても意味がありません。

アプリ内で computeMaximumWindowMetrics() メソッドを使用できるように依存関係を宣言する手順については、WindowManager をご覧ください。

3. アプリ マニフェストの設定をオーバーライドする

デバイスの画面サイズが小さいと判断した場合は、Activity#setRequestedOrientation() を呼び出してマニフェストの screenOrientation 設定をオーバーライドできます。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    requestedOrientation = if (compactScreen())
        ActivityInfo.SCREEN_ORIENTATION_PORTRAIT else
        ActivityInfo.SCREEN_ORIENTATION_FULL_USER
    ...
}

Java

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstanceState);
    if (compactScreen()) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    } else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_USER);
    }
    ...
}

onCreate() メソッドにロジックを追加することで、アクティビティが作成されるたびに(デバイスの回転後、折りたたみ式デバイスが折りたたまれたとき / 広げられたとき、など)画面サイズを取得して向きの設定をオーバーライドできるようになります。

結果

アプリは、デバイスの回転に関係なく、小さい画面では縦向きのままになります。大画面では横向きと縦向きをサポートします。

参考情報

常にすべてのデバイス設定をサポートするようアプリをアップグレードする方法については、以下をご覧ください。