Android 8.0 の機能と API

Android 8.0 では、ユーザーおよびデベロッパー向けのさまざまな機能を新たに導入しています。このドキュメントでは、デベロッパー向けの新しい機能を紹介しています。

プラットフォームの変更によりアプリが影響を受ける箇所については、Android 8.0 での動作変更点をご覧ください。

ユーザー エクスペリエンス

通知

Android 8.0 では通知が再設計されており、一貫性のある簡単な方法で通知の動作や設定を管理できるようになっています。変更点は、以下のとおりです。

    Android 8.0 の通知の長押しメニュー。

    図 1. Android 8.0 では、アプリのランチャー アイコンを長押しすると、通知が表示されます。

  • 通知チャンネル: Android 8.0 では、通知チャンネルが導入されています。これにより、表示する通知の種類ごとに、ユーザーがカスタマイズ可能なチャンネルを作成できるようになります。ユーザー インターフェースでは、通知チャンネルを通知カテゴリと見なします。通知チャンネルの実装方法の詳細は、通知チャンネル ガイドをご覧ください。
  • 通知バッジ: Android 8.0 では、アプリのランチャー アイコンの上に通知バッジを表示する機能が導入されています。通知バッジは、アプリに関連付けられている通知(ユーザーがまだ消去していない、または操作していない通知)があることを示します。通知バッジは、通知ドットとも呼ばれます。通知バッジを調整する方法については、通知バッジをご覧ください。
  • スヌーズ: ユーザーは、一定時間後に通知が再表示されるようにスヌーズさせることができます。その場合、最初に表示されたときと同じ重要度で通知が再表示されます。スヌーズ中の通知はアプリから削除したりアップデートしたりできますが、スヌーズ中の通知をアップデートしても再表示されません。
  • 通知タイムアウト: setTimeoutAfter() で通知を作成する際に、タイムアウトを指定できるようになりました。このメソッドを使うと、通知がキャンセルされるタイムアウト時間を指定できます。必要に応じて、指定されたタイムアウト時間が経過する前に通知をキャンセルすることもできます。
  • 通知設定: setSettingsText() を呼び出して、表示されるテキストを設定できます。このテキストは、Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCES インテントを使って通知からアプリの通知設定へのリンクを作成すると表示されます。アプリがユーザーに表示する必要のある設定をフィルタリングするために、システムからインテントにエクストラ EXTRA_CHANNEL_IDNOTIFICATION_TAG、および NOTIFICATION_ID が提供される場合があります。
  • 通知の消去: 通知をユーザーが消去したのか、またはアプリが削除したのかをシステムが判定できるようになりました。通知がどのように消去されたかを確認するには、NotificationListenerService クラスに新しく追加された onNotificationRemoved() メソッドを実装する必要があります。
  • 背景色: 通知の背景色を設定して有効化することができるようになりました。この機能は、ユーザーが一目で重要性が認識できる継続中のタスクの通知にのみ利用するようにしてください。たとえば、運転ルートや現在の通話に関する通知に背景色を設定できます。Notification.Builder.setColor() を使って目的の背景色を設定することもできます。これにより、Notification.Builder.setColorized() を使って通知の背景色の使用を有効化できるようになりました。
  • メッセージング スタイル: MessagingStyle クラスを使う通知では、折りたたまれているときに表示される内容が増えています。メッセージング関連の通知には、MessagingStyle クラスを使うようにしてください。また、新しく追加された addHistoricMessage() メソッドを使うと、メッセージング関連の通知にメッセージの履歴を追加して会話の文脈を提供することもできます。

Autofill フレームワーク

アカウント作成、ログイン、クレジット カードのトランザクションは時間がかかり、エラーが起こりやすいものです。この種のタスクが繰り返し必要となるアプリに対して、ユーザーがストレスを感じる場合があります。

Autofill フレームワークが導入されている Android 8.0 ではログインやクレジット カードなどのフォームの入力が簡単になります。ユーザーが自動入力を選ぶと、既存のアプリや新しいアプリは Autofill フレームワークと連携します。

複数の手順を実行すると、アプリがフレームワークと連携する方法を最適化することができます。詳細については、Autofill フレームワークの概要をご覧ください。

ピクチャ イン ピクチャ モード

Android 8.0 では、ピクチャ イン ピクチャ(PIP)モードでアクティビティを起動できます。PIP はマルチウィンドウ モードの特殊な形態で、主に動画の再生に使います。PIP モードは、Android TV で既に利用できます。Android 8.0 では、この機能が他の Android 端末でも利用できるようになります。

PIP モードのアクティビティは一時停止状態になっていますが、コンテンツは表示し続けます。そのため、アプリが onPause() ハンドラで再生を一時停止しないようにする必要があります。その代わり、動画は onStop() で停止し、onStart() で再生を再開するようにします。詳細については、マルチウィンドウ ライフサイクルをご覧ください。

アクティビティが PIP モードを使えるようにするには、マニフェストで android:supportsPictureInPicture を true に設定します(Android 8.0 以降では、Android TV またはその他の Android 端末で PIP モードをサポートする場合、android:resizeableActivity を true に設定する必要はありません。アクティビティがその他のマルチウィンドウ モードをサポートしている場合は、android:resizeableActivity だけを設定します)。

API の変更

Android 8.0 では、新しいオブジェクト PictureInPictureParams が導入されています。これを PIP メソッドに渡すことによって、PIP モードになっているアクティビティの動作を指定できます。このオブジェクトには、アクティビティの最適なアスペクト比などのプロパティを指定します。

ピクチャ イン ピクチャの追加に記載されている既存の PIP メソッドは、Android TV だけでなく、すべての Android 端末で利用できるようになっています。さらに、Android 8.0 では、PIP モードをサポートする以下のメソッドが提供されています。

  • Activity.enterPictureInPictureMode(PictureInPictureParams args):アクティビティをピクチャ イン ピクチャ モードで配置します。アクティビティのアスペクト比などの構成設定は、args で指定します。args のいずれかの項目が空だった場合、システムは最後に Activity.setPictureInPictureParams() を呼び出した際の設定値を使います。

    指定されたアクティビティは画面の端に配置されます。画面の残りの部分には、その前に画面上にあったアクティビティが配置されます。PIP モードに入ったアクティビティは一時停止状態になりますが、開始された状態は維持されます。ユーザーが PIP アクティビティをタップすると、システムはメニューを表示し、ユーザーはそれを使って操作を行うことができます。アクティビティが PIP 状態にあるときは、タッチイベントはアクティビティに到達しません。

  • Activity.setPictureInPictureParams():アクティビティの PIP 構成設定をアップデートします。アクティビティが現在 PIP モードである場合、設定がアップデートされます。これは、アクティビティのアスペクト比が変わる場合に便利です。アクティビティが PIP モードでない場合は、呼び出す enterPictureInPictureMode() メソッドに関係なく、この構成設定が使用されます。

ダウンロード可能なフォント

Android 8.0 と Android Support Library 26 では、フォントを APK にバンドルする、または APK からフォントをダウンロードする代わりに、プロバイダのアプリからフォントを要求できます。この機能を利用すると、APK のサイズを削減し、アプリのインストール成功確率を高め、複数のアプリが同じフォントを共有できるようになります。

フォントのダウンロードの詳細については、ダウンロード可能なフォントをご覧ください。

XML フォント

Android 8.0 には、フォントをリソースとして利用できる XML フォント機能が新しく導入されています。この機能を使うと、フォントをアセットにバンドルする必要はなくなります。フォントは R ファイルでコンパイルされ、システムで自動的にリソースとして利用できるようになります。これらのフォントには、新しいリソースタイプ font を使ってアクセスします。

Support Library 26 は、API バージョン 14 以降が実行されている端末で、この機能に対するフルサポートを提供します。

フォントをリソースとして使用する方法やシステム フォントの取得方法の詳細については、XML フォントをご覧ください。

TextView の自動サイズ設定

Android 8.0 では、サイズに応じてテキストのサイズが自動的に拡大縮小される TextView を設定できます。これにより、異なる画面や動的コンテンツでテキストのサイズを最適化するのが以前よりもずっと簡単になります。Android 8.0 での TextView の自動サイズ設定の詳細については、TextView の自動サイズ設定をご覧ください。

アダプティブ アイコン

Android 8.0 では、アダプティブ ランチャー アイコンが導入されています。アダプティブ アイコンは視覚効果をサポートし、端末モデルごとに異なる図形を表示できます。アダプティブ アイコンの作成方法について詳しくは、アダプティブ アイコン プレビュー機能ガイドをご覧ください。

色の管理

Android のイメージング アプリのデベロッパーは、広色域ディスプレイを搭載した新しい端末の機能を活用できるようになります。広色域イメージを表示するアプリは、マニフェストに(アクティビティごとに)フラグを設定し、埋め込み広色域プロファイル(AdobeRGB、Pro Photo RGB、DCI-P3 など)を使ってビットマップを読み込む必要があります。

WebView API

Android 8.0 には、アプリにウェブ コンテンツを表示する WebView オブジェクトを管理するときに役立つ複数の API が用意されています。アプリの安定度とセキュリティを改善する API には次のものがあります。

  • Version API
  • Google SafeBrowsing API
  • Termination Handle API
  • Renderer Importance API

これらの API の詳細については、WebView の管理をご覧ください。

ピン留めされたショートカットとウィジェット

Android 8.0 では、アプリのショートカットやウィジェットのアプリ内ピン留めが導入されています。アプリ内で、サポートされているランチャー用のピン留めされたショートカットやウィジェットを作成できます。これには、ユーザーのパーミッションが必要です。

詳細については、プレビュー機能ガイドのピン留めされたショートカットとウィジェットをご覧ください。

最大画面アスペクト比

Android 7.1(API レベル 25)以下を対象としたアプリは、デフォルトでの最大画面アスペクト比が 1.86 です。Android 8.0 以降を対象としたアプリには、最大アスペクト比のデフォルト設定がありません。アプリに最大アスペクト比を設定する必要がある場合には、Activity を定義するマニフェスト ファイル内でmaxAspectRatio属性を使用してください。

マルチディスプレイのサポート

Android 8.0 以降では、プラットフォームでの複数ディスプレイのサポートが拡張されています。マルチウィンドウ モードをサポートするアクティビティが複数ディスプレイの端末で実行されている場合、ユーザーはアクティビティを別のディスプレイに移動できます。アプリでは、アクティビティを起動する際に使用するディスプレイを指定できます。

注:アクティビティがマルチウィンドウ モードをサポートしている場合、Android 8.0 は自動的にそのアクティビティの複数ディスプレイのサポートを有効化します。マルチディスプレイ環境でアプリが適切に動作することをテストする必要があります。

アプリに複数のディスプレイがある場合でも、再開状態になれるのは 1 度に 1 つのアクティビティのみです。再開状態になるのは、フォーカスのあるアクティビティです。表示されているその他のアクティビティは一時停止されますが、停止されません。複数のアクティビティが表示されている場合のアクティビティのライフサイクルの詳細については、マルチウィンドウ ライフサイクルをご覧ください。

ユーザーがアクティビティを別のディスプレイに移動すると、システムはそのアクティビティのサイズを変更し、必要に応じて実行時の変更の処理を行います。アクティビティは自身で構成の変更を処理できます。また、システムによってアクティビティを含むプロセスを破棄し、新しいディメンションでアクティビティを再作成することもできます。詳細については、構成の変更の処理をご覧ください。

複数ディスプレイをサポートするために、ActivityOptions に 2 つの新しいメソッドが追加されています。

setLaunchDisplayId()
アクティビティの起動時にどのディスプレイに表示されるかを指定します。
getLaunchDisplayId()
アクティビティの現在の起動ディスプレイを返します。

adb シェルが拡張されて複数のディスプレイをサポートするようになっています。shell start コマンドでは、ターゲット ディスプレイを指定してアクティビティを起動できるようになっています。

adb shell start <activity_name> --display <display_id>

統一されたレイアウト マージンとパディング

Android 8.0 では、View要素の反対側で同じマージンやパディングを使用しているケースの特定がより簡単になります。具体的には、レイアウト XML ファイルで次のような属性を使用できるようになります。

注:複数の言語や文化をサポート(テキストの方向など)するためにアプリのロジックをカスタマイズする場合、それらの属性は、 layout_marginStart layout_marginEnd paddingStart paddingEndの値には影響しません.今回新たに加わった縦と横のレイアウト属性に加え、これらの値を自身で設定することで、テキストの方向に依存するレイアウトの動作を作成できます。

ポインタ捕捉

ゲーム、リモート デスクトップ、仮想化クライアントなどのアプリは、マウス ポインタのコントロールから大きなメリットを得ています。ポインタ キャプチャは Android 8.0 の新機能であり、すべてのマウス イベントをアプリのフォーカス ビューに届けることで、マウス ポインタのコントロールを提供します。

Android 8.0 以降、アプリのViewは、ポインタ キャプチャをリクエストし、キャプチャされたポインタ イベントを処理するためのリスナを定義することができます。このモードでは、マウス ポインタは表示されません。マウス情報が必要でなくなった時点で、ビューはポインタ キャプチャをリリースできます。また、ユーザーが他のアプリを開くなどして、ビューがフォーカスを失った場合に、システムはポインタ キャプチャをリリースできます。

この機能をアプリで使用する方法については、ポインタ キャプチャをご覧ください。

アプリカテゴリ

Android 8.0 では、適切な場合、アプリごとに適合するカテゴリを宣言することができます。これらのカテゴリは、データ使用量、バッテリー消費量、ストレージ使用量などに関してユーザーにアプリを提示する際に、目的や機能が似ているアプリをまとめるために使用されます。android:appCategory マニフェスト タグで <application> 属性を設定することで、アプリのカテゴリを定義できます。

Android TV ランチャー

Android 8.0 は、新たなコンテンツセントリックである、Android TV ホーム画面エクスペリエンスを含んでいます。これは、Android 8.0 向けの Android TV のエミュレータと、Nexus Player 端末イメージで利用可能です。新しいホーム画面は、動画コンテンツをチャンネルに対応させた行ごとに表示し、各チャンネルは、システム上のアプリによりプログラムとともに生成されます。アプリは、複数のチャンネルを公開でき、ユーザーは、どのチャンネルをホーム画面に表示するかを選択できます。Android TV ホーム画面には、Watch Next という行も含まれます。これは、ユーザーの視聴パターンに基づき、アプリがプログラムとともに生成するものです。また、ユーザーがあるプログラムにフォーカスしたときに、自動的に動画のプレビューを流すこともできます。チャンネルおよびプログラムの生成に関わる API は、TvProvider API の一部であり、Android 8.0 向けの Android Support Library モジュールとして配信されます。

AnimatorSet

Android 8.0 以降の AnimatorSet API で、シーク操作と逆方向の再生がサポートされるようになりました。シーク操作は、アニメーション セットの位置を特定の時間にセットします。逆方向の再生は、元に戻す操作が可能なアクションのアニメーションがアプリに含まれている場合に便利です。別々のアニメーション セットを 2 つ定義しなくても、同じアニメーションを逆順で再生できます。

入力とナビゲーション

キーボード ナビゲーション クラスタ

アプリのアクティビティが、図 2 に示すような複雑なビュー階層を使用する場合、キーボードのナビゲーションを容易にするため、UI 要素のグループをクラスタに編成することをお勧めします。ユーザーは Chromebook 端末で Meta+Tab または Search+Tab を押してクラスタ間を移動できます。クラスタのわかりやすい例としては、サイドパネル、ナビゲーション バー、メイン コンテンツ エリア、多くの子要素が含まれる要素などがあります。

キーボード ナビゲーション クラスタへのショートカットを使用して、ユーザーが移動できる 5 個のナビゲーションナビゲーション クラスタを含むアクティビティの例。クラスタが次の配置(上部パネル、左側のパネル、メイン コンテンツ エリア、下部パネル、浮動アクション ボタン)に表示されます。
図 2. 5 個のナビゲーション クラスタを含むアクティビティ

View 要素または ViewGroup 要素をクラスタにする場合、要素のレイアウト XML ファイルで android:keyboardNavigationCluster 属性を true に設定するか、アプリの UI ロジックで setKeyboardNavigationCluster()true を渡します。

注: ネストされていないクラスタが階層の別のレベルに表示されることがあっても、クラスタはネストできません。クラスタをネストしようとすると、フレームワークは最上位の ViewGroup 要素のみをクラスタとして処理します。

タッチスクリーンが含まれる端末では、クラスタによって指定された ViewGroup オブジェクトの android:touchscreenBlocksFocus 要素を true に設定し、そのクラスタ内外へのクラスタ専用ナビゲーションを許可します。この設定をクラスタに適用した場合、ユーザーは、クラスタ内外へのナビゲーションには Tab キーまたは矢印キーを使用できません。代わりにクラスタ ナビゲーション キーを組み合わせて押す必要があります。

デフォルトのフォーカスを表示

Android 8.0 では、(再)作成されたアクティビティが再開され、ユーザーが Tab キーなどのキーボード ナビゲーション キーを押した後で、フォーカスが当たる View を割り当てることができます。「デフォルトでフォーカスが当たる」設定を適用する場合、UI 要素が含まれるレイアウト XML ファイルで View 要素の android:focusedByDefault 属性を true に設定するか、アプリの UI ロジックで setFocusedByDefault()true を渡します。

システム

新規 StrictMode Detector

Android 8.0 では、アプリの潜在的なバグを特定するために使用される 3 つの StrictMode Detector が追加されました。

  • detectUnbufferedIo() は、パフォーマンスに重大な影響を及ぼす可能性があるバッファリングなしで、アプリがデータの読み取りまたは書き込みを行うタイミングを検出します。
  • detectContentUriWithoutPermission() は、アプリの外部でアクティビティを開始するときに、アプリが誤ってパーミッションを別のアプリに付与しなかったタイミングを検出します。
  • detectUntaggedSockets() は、デバッグの目的でトラフィックにタグ付けする setThreadStatsTag(int) を使用せずに、アプリがネットワーク トラフィックを実行するタイミングを検出します。

キャッシュ データ

Android 8.0 では、キャッシュ データ関連のガイダンスと動作が改善されます。アプリごとにキャッシュ データにディスク スペースが割り当てられるようになりました。このスペースは、getCacheQuotaBytes(UUID) によって返されます。

システムがディスク スペースを解放する必要がある場合、割り当てられているスペースのほとんどを占めるキャッシュ ファイルを最初にアプリから削除します。割り当てられているスペースにキャッシュ データを保持していると、キャッシュ ファイルは、必要に応じて消去されるが、システム上に最後まで残るものの一部となります。システムがアプリ内で削除するキャッシュ ファイルを決定するときは、(変更時刻で判別される)最も古いファイルの削除を最初に検討します。

システムがキャッシュ データを解放する方法を制御するために、ディレクトリ単位で有効にできる 2 つの新しい動作も用意されています。

  • StorageManager.setCacheBehaviorAtomic() を使用すると、単一のアトミック単位として削除する必要があるディレクトリとそこに格納されているすべてのコンテンツを明示できます。
  • setCacheBehaviorTombstone(File, boolean) を使用すると、1 つのディレクトリ内のファイルを削除する代わりに、空のファイルはそのまま残し、ファイルの長さを 0 バイトに切り詰める必要があることを明示できます。

最後に、大きなファイルにディスク スペースを割り当てる必要がある場合は、新規の allocateBytes(FileDescriptor, long) API を使用することをお勧めします。この API は、リクエストに応えるため、(必要に応じて)他のアプリに属するキャッシュ ファイルを自動的に消去します。端末に新しいデータを保持できるだけのディスク スペースが十分にあるかどうか判断するときは、getAllocatableBytes(UUID) を呼び出します。getUsableSpace() は、消去対象のキャッシュ データをデベロッパーに代わってシステムが検討するからです。

コンテンツ プロバイダのページング

コンテンツ プロバイダがアップデートされ、大きなデータセットを一度に 1 ページずつ読み込む操作がサポートされるようになりました。たとえば、数千枚の画像が登録された写真アプリでは、データのサブセットを取得するクエリを発行してページを表示できます。コンテンツ プロバイダは、各結果ページを単一カーソル オブジェクトとして返します。この機能を使うには、クライアントとプロバイダの両方でページングを実装します。

コンテンツ プロバイダの変更の詳細については、ContentProviderContentProviderClient をご覧ください。

コンテンツ更新リクエスト

ContentProvider クラスと ContentResolver クラスに refresh() メソッドが含まれるようになりました。このメソッドにより、クライアントが要求した情報が最新であるかどうか、簡単に把握できるようになりました。

ContentProvider を拡張することで、カスタム コンテンツの更新ロジックを追加できます。refresh() メソッドをオーバーライドして、true を戻すようにします。これはプロバイダのクライアントに対し、データの更新を自分自身で試みたことを示します。

クライアントのアプリは、別のメソッド(refresh() とも呼ばれます)を呼び出すことで、更新されたコンテンツを明示的に要求できます。このメソッドを呼び出すときには、更新するデータの URI で引き渡します。

注: ネットワークを経由してデータを要求することがあるため、コンテンツが古い可能性が高い場合に限り、クライアント側から refresh() を呼び出す必要があります。このタイプのコンテンツ更新を実行する最も一般的な理由は、最新のコンテンツを表示するように、現在の UI を明示的に要求するスワイプして更新する操作に対応するためです。

JobScheduler の改善

Android 8.0 は、JobSchedulerに対し多くの改善を実施しています。これらの改善により、新たに制限が付与されたバックグラウンド サービスや暗黙的なブロードキャスト レシーバーの代わりに、スケジュールされたジョブを使うことができるので、アプリは新しいバックグラウンド実行制限を遵守しやすくなります。

JobSchedulerへのアップデートは以下を含みます:

  • ワーク キューをスケジュールされたジョブに関連付けられます。ワークをジョブのキューに追加するには、JobScheduler.enqueue()を呼び出します。ジョブの実行中に、保留中のワークをキューから外し、処理を行います。この機能は、従来バックグラウンド サービス(特に、IntentServiceを実行するサービス)の開始を必要としていた多くのユースケースを処理できます。
  • 今後は、JobInfo.Builder.setClipData()を呼び出し、ClipDataをジョブと関連付けることができます。このオプションにより、URI パーミッションの供与をジョブと関連付けることができるようになります。これは、パーミッションをContext.startService()に伝播する仕組みと似ています。また、ワーク キューに対してインテントを伴う URI パーミッション供与を使うこともできます。
  • スケジュールされたジョブは、新しい制限をサポートします:
    JobInfo.isRequireStorageNotLow()
    利用できるストレージが少ない場合、ジョブが実行されません。
    JobInfo.isRequireBatteryNotLow()
    バッテリー残量が閾値以下の場合、ジョブが実行されません。この閾値に達すると、端末がバッテリー残量低下のシステム ダイアログを表示します。
    NETWORK_TYPE_METERED
    ジョブを実行するには、一般的なセルラーデータプランのような、メーター制ネットワーク接続が必要です。

カスタムデータ ストア

Android 8.0 では、ユーザー設定にカスタムデータ ストアを提供します。これは、アプリが設定をクラウドまたはローカル データベースに保存している場合、または設定がデバイス固有の場合に有効です。データストアの実装の詳細については、カスタムデータ ストアをご覧ください。

findViewById() 署名の変更

findViewById() メソッドのすべてのインスタンスは View ではなく <T extends View> T を戻すようになりました。この変更により、次の影響があります。

  • 既存のコードにあいまいな戻り値が生じる可能性があります。たとえば someMethod(View)someMethod(TextView) の両方とも、findViewById() への呼び出しの結果となるなどです。
  • Java 8 ソース言語を使用するときに、戻り値に制限がない(assertNotNull(findViewById(...)).someViewMethod()) など)場合、View への明示的なキャストが必要となります。
  • 非 final findViewById() メソッドをオーバーライドする(Activity.findViewById() など)には、戻り値をアップデートする必要があります。

メディアの拡張

VolumeShaper

これは、新しいVolumeShaperのクラスであり、フェイドイン、フェイドアウト、クロス フェイドといった、小規模な自動ボリューム移行を実行するために利用できます。

オーディオ フォーカスの拡張

オーディオ アプリは、オーディオ フォーカスのリクエストや放棄をすることにより、端末上でオーディオ アウトプットを共有しています。アプリは、再生の開始や停止を行ったり、ボリュームを絞ることにより、フォーカスの変更を処理します。AudioFocusRequestに新たなクラスができました。このクラスにより、アプリで、自動ダッキングフォーカス ゲインの遅延という、オーディオ フォーカスへの変更を処理するための新機能を実装することができます。

メディア メトリクス

新しく追加された getMetrics() メソッドは、設定とパフォーマンスの情報を含む PersistableBundle オブジェクトを返します。このオブジェクトは、属性と値のマップです。getMetrics() メソッドは、以下のメディアクラスで定義されています。

メトリクスは各インスタンスで別々に収集され、インスタンスの有効期間中は存続します。利用できるメトリクスがない場合、メソッドは null を返します。実際に返されるメトリクスは、クラスによって異なります。

MediaPlayer

Android 8.0 では、MediaPlayer クラスにいくつかの新しいメソッドが追加されています。これらのメソッドは、次の複数の方法でアプリのメディア再生処理を改善します。

MediaPlayer ではサンプルレベルの暗号化がサポートされるようになりました。

MediaRecorder

  • MediaRecorder では、ストリーミングに役立つ MPEG2_TS フォーマットがサポートされるようになりました。
    mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    MediaRecorder.OutputFormat をご覧ください。

  • MediaMuxer が、任意の数のオーディオ ストリームと動画ストリームを処理できるようになりました。1 つのオーディオ トラックまたは 1 つの動画トラックに制限されなくなりました。addTrack() を使用して、必要な数のトラックをミキシングすることができます。
  • MediaMuxer を使用すると、ユーザーが定義したフレームごとの情報を含む 1 つ以上のメタデータ トラックを追加することもできます。メタデータのフォーマットはアプリによって定義されます。メタデータ トラックは MP4 コンテナのみでサポートされます。

メタデータはオフライン処理に有効です。たとえば、センサーからのジャイロ信号を使用して、動画を安定化させるための処理を実行できます。

メタデータ トラックを追加するときは、トラックの mime フォーマットの先頭がプレフィックス「application/」である必要があります。メタデータの記述は、データが MediaCodec から発生しないこと以外は、動画 / オーディオ データの記述と同じです。その代わり、アプリは関連するタイムスタンプとともに ByteBufferwriteSampleData() メソッドを渡します。タイムスタンプは動画トラックおよびオーディオ トラックと同じタイムベースに属している必要があります。

生成された MP4 ファイルは、ISOBMFF のセクション 12.3.3.2 で定められた TextMetaDataSampleEntry を使用し、メタデータの mine フォーマットを示します。MediaExtractor を使用してファイルをメタデータ トラック付きで抽出すると、メタデータの mine フォーマットは MediaFormat に抽出されます。

オーディオ再生コントロール

Android 8.0 では、端末が音を生成する方法について、クエリおよびリクエストができます。オーディオ再生に対する以下のようなコントロールにより、望ましい端末条件下でのみ、音声を再生することが簡単になります。

Google アシスタント向けの新しいオーディオ使用タイプ

AudioAttributesクラスは、新しい音声タイプである、USAGE_ASSISTANTを含みます。これは、Google アシスタントが端末上で音声によって与える回答に対応しています。

デバイス オーディオ再生への変更

特定のデバイス オーディオ設定がアクティブの場合にのみ、音声を再生したい場合には、AudioManagerクラスを使って、AudioManager.AudioPlaybackCallbackのインスタンスを登録します。このonPlaybackConfigChanged()メソッドにより、現在アクティブなオーディオ属性を特定することができます。

オーディオ フォーカスへの明示的リクエスト

requestAudioFocus()メソッドを使うことで、デバイス全体に関わるオーディオ フォーカスのより詳細なリクエストを送信することができます。AudioFocusRequest.Builderを使って作成したAudioFocusRequestオブジェクトをパスインします。このビルダー クラスでは、次のオプションを指定できます。

  • AUDIOFOCUS_GAIN_TRANSIENTAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKなど、取得したいフォーカスのタイプ。
  • 他のオーディオ サービスがデバイスのフォーカスを得た場合、サービスの音量を絞るか、オーディオを完全に停止するか。
  • デバイスの準備ができるまで、フォーカスの取得を遅らせるかどうか。

注:AudioFocusRequestのインスタンスをビルドする際に、setAcceptsDelayedFocusGain()を呼び出して、サービスが音声の再生を遅らせることができるようにした場合、サービスがいつ音声の再生をすればいいかがわかるように、setOnAudioFocusChangeListener()も呼び出す必要があります。

改善されたメディア ファイルへのアクセス

ストレージ アクセス フレームワーク(SAF)を使用すると、アプリがカスタム DocumentsProvider を公開できるようになります。これで、データソース内のファイルへのアクセス権を他のアプリに提供できます。実際には、ドキュメント プロバイダはネットワーク ストレージに常駐する、または Media Transfer Protocol(MTP)のようなプロトコルを使用するファイルへのアクセス権も提供できます。

ただし、リモート データソースから大きなメディア ファイルにアクセスする場合、いくつかの課題があります。

  • メディア プレーヤーは、ドキュメント プロバイダからファイルへのシーク可能なアクセス権を必要とします。大きなメディア ファイルがリモート データソースに常駐する場合、ドキュメント プロバイダがあらかじめすべてのデータを取得しておき、スナップショット ファイル ディスクリプタを作成する必要があります。メディア プレーヤーはファイル ディスクリプタのないファイルを再生できません。そのため、ドキュメント プロバイダがファイルのダウンロードを終えるまで再生を始めることができません。
  • 写真アプリなどのメディア コレクション マネージャは、範囲指定されたフォルダを経由して外部の SD カードに保存されたメディアにアクセスするため、一連のアクセス URI をトラバースする必要があります。このアクセス パターンにより、—移動、コピー、削除—といったメディアに対する一括操作の速度が大幅に遅くなります。
  • メディア コレクション マネージャは、URI でドキュメントの場所を特定することができません。これにより、これらのアプリでは、ユーザーがメディア ファイルの保存場所を選択できなくなるという問題が生まれます。

Android 8.0 では、ストレージ アクセス フレームワークを改善することにより、これらの問題に対応しています。

カスタム ドキュメント プロバイダ

Android 8.0 以降のストレージ アクセス フレームワークでは、カスタム ドキュメント プロバイダが、リモート データソースに常駐するファイル向けにシーク可能なファイル ディスクリプタを作成できます。SAF は、ネイティブのシーク可能なファイル ディスクリプタを取得するためにファイルを開くことができます。次に、SAF は不連続のバイト リクエストをドキュメント プロバイダに提供します。この機能によって、メディア プレーヤー アプリがあらかじめファイル全体をキャッシュする代わりにリクエストする、正確なバイト範囲がドキュメント プロバイダから戻ります。

この機能を使用する場合、新しい StorageManager.openProxyFileDescriptor() メソッドを呼び出す必要があります。openProxyFileDescriptor() メソッドは ProxyFileDescriptorCallback オブジェクトをコールバックとして受け入れます。SAF は、ドキュメント プロバイダから返されるファイル ディスクリプタでクライアント アプリケーションがファイル操作を実行するたびにコールバックを呼び出します。

ダイレクト ドキュメントアクセス

Android 8.0 では、 getDocumentUri()メソッドを使い、与えられたmediaUriと同じドキュメントを参照する URI を入手できます。しかし、帰ってきた URI がDocumentsProviderでバックアップされているため、メディア コレクション マネージャは、ディレクトリ ツリーをトラバースすることなく、直接ドキュメントにアクセスすることができます。その結果、メディア コレクション マネージャのファイル操作にかかる時間を大幅に短縮することができます。

警告: getDocumentUri()メソッドは、メディア ファイルの位置を特定するものであり、アプリにファイルへのアクセス許可を与えるものではありません。メディア ファイルへのアクセス許可を得る方法については、参考文書をご覧ください。

ドキュメントへのパス

Android 8.0 でストレージ アクセス フレームワークを使用する場合、findDocumentPath()メソッドを使って、与えられたドキュメントID を基に、ファイル システムからのパスを決定できます。このメソッドは、DocumentsContractクラスおよびDocumentsProviderクラスの両方で利用可能です。メソッドは、このパスをDocumentsContract.Pathオブジェクト内で返します。同じドキュメントへのパスが複数定義されている場合には、与えられた ID に対して最も頻繁に使われているパスを返します。

この機能は、以下のような場合に特に有用です。

  • アプリが、特定のドキュメントの位置を示す「名前を付けて保存」ダイアログを使う場合。
  • アプリが、検索結果ビューでフォルダを表示し、ユーザーがそのあるフォルダを選択した時に、そのフォルダ内にある子ドキュメントをロードしなければならない場合。

注: アプリが、パスにあるドキュメントの内の一部に対するアクセス許可しか持たない場合、findDocumentPath()で返される値には、アプリがアクセスできるフォルダとドキュメントしか含まれません。

接続

Wi-Fi Aware

Android 8.0 では、Neighbor Awareness Networking(NAN)仕様に基づいた Wi-Fi Aware のサポートが追加されています。この機能によって、インターネット アクセス ポイントがなくても、適切な Wi-Fi Aware ハードウェアを搭載した端末のアプリであれば、Wi-Fi 経由で近くの端末を検出して通信できるようになります。Google は Wi-Fi Aware テクノロジーを可能な限り多くの端末に導入するために、ハードウェア パートナーと連携して作業を進めています。アプリに Wi-Fi Aware を組み込む方法の詳細は、Wi-Fi Aware をご覧ください。

Bluetooth

Android 8.0 は、次の機能を追加することでプラットフォームの Bluetooth サポートを強化します。

  • 楽曲ライブラリのブラウジングを有効にする AVRCP 1.4 規格のサポート。
  • Bluetooth 省エネルギー(BLE)5.0 規格のサポート。
  • Sony LDAC コーデックの Bluetooth スタックへの統合。

コンパニオン端末のペア設定

Android 8.0 では、Bluetooth、BLE、Wi-Fi でコンパニオン端末とペア設定を行う際に、ペア設定リクエスト ダイアログがカスタマイズできる API が提供されています。詳細については、コンパニオン端末のペア設定をご覧ください。

Android での Bluetooth の使用について詳しくは、Bluetooth ガイドをご覧ください。Android 8.0 独自の Bluetooth に対する変更点については、Android 8.0 での動作変更点ページの Bluetooth をご覧ください。

共有

スマート共有

Android 8.0 は、ユーザーがカスタマイズした共有についての設定を学習し、コンテンツの種別ごとに、どのアプリで共有するのが適切かをより効果的に把握しています。例えば、ユーザーが領収書の写真を撮った場合、Android 8.0 は経費追跡アプリを提案し、自撮りした場合には、ソーシャル メディア アプリがより適切なアプリとなります。Android 8.0 は、ユーザーがカスタマイズした設定に従って、こういったパターンをすべて自動的に学習します。

スマート シェアリングは、audiovideotextURLなど、image以外のコンテンツに対して動作します。

スマート シェアリングを有効にするには、最大 3 つのストリング アノテーションのArrayListを、コンテンツを共有するインテントに追加します。アノテーションは、トピックやコンテンツの主な構成要素を説明している必要があります。以下は、インテントにアノテーションを追加する方法を示したコード例です。

ArrayList<String> annotations = new ArrayList<>();

annotations.add("topic1");
annotations.add("topic2");
annotations.add("topic3");

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

スマート シェアリング アノテーションについての詳細は、EXTRA_CONTENT_ANNOTATIONSをご覧ください。

スマート テキスト選択

Android 8.0 では、互換性のある端末で、ユーザーがより有意義にテキストを利用できるようになります。ユーザーが、エンティティの中の単語、つまり、住所やレストラン名など、認識されているフォーマットの単語を長押しすると、システムによってエンティティ全体が選択されます。ユーザーには、フローティング ツールバーが表示され、このツールバーは、選択されているテキスト エンティティを扱うアプリを含むことができます。例えば、システムが住所を認識した場合、マップ アプリへとユーザーを誘導します。

システムが認識するエンティティには、住所、URL、電話番号、メールアドレスなどが含まれます。詳細については、TextClassifier をご覧ください。

ユーザー補助機能

Android 8.0 では、独自のユーザー補助機能サービスを作成するデベロッパー向けに次のユーザー補助機能がサポートされています。アプリを利用しやすくする方法の詳細については、ユーザー補助機能の説明をご覧ください。

ユーザー補助機能ボタン

ユーザー補助機能サービスで、システムのナビゲーション領域内にユーザー補助機能ボタンが表示されるようにリクエストできるようになりました。これで、ユーザーは、端末上の任意の画面からサービスの機能を簡単にアクティブ化することができます。このためには、AccessibilityServiceInfo オブジェクトの android:accessibilityFlags 内に FLAG_REQUEST_ACCESSIBILITY_BUTTON フラグを追加します。これで registerAccessibilityButtonCallback() を使用してコールバックを登録できます。

注: この機能は、ソフトウェアによってレンダリングされたナビゲーション領域を提供する端末上でのみ利用できます。常に isAccessibilityButtonAvailable() を使用し、onAvailabilityChanged() を実装することで、ユーザー補助機能ボタンの使用可能状況に基づいた変更に対応してください。こうすることで、ユーザー補助機能ボタンがサポートされていない場合、あるいは利用できなくなっている場合でも、ユーザーがこのサービスの機能に常にアクセスできます。

独立した音量調節

Android 8.0 では STREAM_ACCESSIBILITY 音量カテゴリが導入されました。これにより、ユーザー補助機能サービスの音声出力の音量を端末上の他の音とは別にコントロールできます。

この新しいストリーム タイプを使用してユーザー補助機能の音量をコントロールする場合は、ユーザー補助機能サービス内に FLAG_ENABLE_ACCESSIBILITY_VOLUME オプションを設定してください。これで、adjustStreamVolume() を使用して端末のユーザー補助機能の音量を変更できるようになります。

指紋認証操作

ユーザー補助機能サービスは、端末の指紋認証センサーに沿った、代替の入力方法である方向性スワイプ(上、下、左、右)にも対応できます。これらの操作に関するコールバックを受け取るには、次の一連の手順を実行する必要があります。

  1. USE_FINGERPRINT パーミッションと CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES 機能を宣言します。
  2. android:accessibilityFlags 属性内にFLAG_REQUEST_FINGERPRINT_GESTURES フラグを設定します。
  3. registerFingerprintGestureCallback() を使用して、コールバックを登録します。

指紋認証センサーが搭載されていない端末もあることに注意してください。isHardwareDetected() メソッドを使用して、端末がセンサーに対応しているかどうか確認することができます。指紋認証センサーを搭載している端末であっても、サービスがこのセンサーを利用できるのは、認証を得る目的以外の場合に限られます。センサーがいつ利用可能になるを識別するには、isGestureDetectionAvailable() メソッドを呼び出し、onGestureDetectionAvailabilityChanged() コールバックを実装します。

単語レベルでの強調表示

TextView オブジェクトに表示される文字の場所を指定するには、EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY を最初の引数として refreshWithExtraData() に渡します。Bundle オブジェクトが refreshWithExtraData() への 2 番目の引数として提供され、Rect オブジェクトの Parcelable を実装した配列が含まれるようにアップデートされます。Rect オブジェクトはそれぞれ、特定の文字の境界ボックスを示します。

画面上に表示されるコンテンツを定めるため、サービスが TextToSpeech オブジェクトを使用している場合は、テキスト読み上げエンジンがいつ合成語を話し始めるかについてより正確な情報を取得できます(この情報がテキスト読み上げエンジンから提供される限り)。エンジンが特定のテキスト範囲に対応するオーディオの再生を開始すると想定される場合、テキスト読み上げ API からサービスに対し、テキスト範囲の読み上げが onRangeStart() メソッドを使用して開始されるという通知が出されます。

TextToSpeechService の独自の実装を作成する場合は、rangeStart() メソッドを使用すると、この新しい機能を利用できます。

標準化された片側範囲値

AccessibilityNodeInfo の複数のインスタンスは AccessibilityNodeInfo.RangeInfo のインスタンスを使用して、UI 要素が値の範囲で使用できるかどうかを示します。RangeInfo.obtain() を使用して範囲を新規に作成する、または getMin()getMax() を使用して範囲の極値を取り出す場合は、Android 8.0 には標準化された片側範囲値の定義があることに注意してください。

ヒントテキスト

Android 8.0 には、編集可能なテキスト形式のオブジェクトのヒントテキストを操作する、複数のメソッドが含まれています。

  • ノードの現在のテキスト内容がノードのヒントテキストになっているかどうかを、isShowingHintText() メソッドで示し、setShowingHintText() メソッドで設定します。ノードに編集可能なテキストが含まれていない場合には、ヒントテキストは含まれません。
  • ヒントテキスト自体にアクセスする場合は、getHintText() を使用してください。オブジェクトに現時点でヒントテキストが表示されていなくても、getHintText() に対する呼び出しは成功します。

継続的な操作ディスパッチ

サービスでは、GestureDescription.StrokeDescription コンストラクタで最後の引数 willContinue を使用することで、同じプログラムによる操作に属するストロークのシーケンスを指定できるようになりました。

セキュリティとプライバシー

パーミッション

Android 8.0 では、電話関連の新たなパーミッションを複数導入しました。

  • ANSWER_PHONE_CALLSパーミッションを使うと、着信をアプリが自動的に受け、プログラムで対応することができるようになります。アプリで電話の着信を処理するには、acceptRingingCall() メソッドを使用します。
  • READ_PHONE_NUMBERSパーミッションは、アプリに対して、デバイスに保存されている電話番号へのアクセス権を与えます。

これらのパーミッションはともに、危険なパーミッションに分類され、PHONEパーミッション グループに属します。

新しいアカウント アクセスと Discovery API

Android 8.0 では、アプリがユーザー アカウントへのアクセス権を取得する方法について、いくつかの改善事項が導入されています。認証システムは管理するアカウントで、独自のポリシーを使ってアプリに対してアカウントを隠蔽するか公開するかを決定します。Android システムは、特定のアカウントにアクセスできるアプリを追跡します。

以前のバージョンの Android では、ユーザー アカウントの一覧をトラッキングするアプリは、関係のないタイプのアカウントを含むすべてのアカウントのアップデートを取得する必要がありました。Android 8.0 では、addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) メソッドが追加されています。このメソッドを使うと、アプリで変更を受信するアカウント タイプのリストを指定できます。

API の変更

AccountManager には、どのアプリがアカウントを参照できるかを認証システムで管理するための 6 つの新しいメソッドが追加されています。

Android 8.0 では、アプリの可視性レベルを指定するために 2 つの特殊なパッケージ名の値が導入されています。この値は、setAccountVisibility(android.accounts.Account, java.lang.String, int) メソッドでは設定されません。可視性値 PACKAGE_NAME_KEY_LEGACY_VISIBLE が適用されるのは、GET_ACCOUNTS パーミッションを持ち、Android 8.0 以前の Android バージョンを対象としているか、署名が任意の Android バージョンを対象としている認証システムと一致するアプリです。可視性値 PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE は、可視性値があらかじめ設定されておらず、PACKAGE_NAME_KEY_LEGACY_VISIBLE が適用されないアプリのデフォルトです。

新しいアカウント アクセスと Discovery API の詳細については、AccountManagerOnAccountsUpdateListener のリファレンスをご覧ください。

Google Safe Browsing API

ウェブ ブラウジングの安全性を強化するため、WebView クラスに、セーフ ブラウジング API が含まれることになりました。詳細については、Google Safe Browsing API をご覧ください。

テスト

インスツルメンテーション テスト

Android 8.0 には、アプリの計測テストに対し、次のような追加の対応が用意されています。

デフォルト以外のアプリプロセスに対する実行

アプリのデフォルト プロセスの外部にあるプロセスに対して、特定の計測テストを実行する必要があることを指定できるようになりました。この設定は、別のプロセスで実行される複数のアクティビティがアプリに含まれる場合に有効です。

デフォルト以外のプロセス計測を定義する場合は、マニフェスト ファイルに移動し、次に対象の <instrumentation> 要素に移動します。android:targetProcess 属性を追加し、その値を次のいずれかに設定します。

  • 特定のプロセスの名前。
  • コンマで区切られたプロセス名の一覧。
  • ワイルドカード("*")。これにより、android:targetPackage 属性で指定されたパッケージでコードを実行する、リリース済みプロセスすべてに対し、計測を実行できます。

getProcessName() を呼び出すことで、計測テストを実行しながら、テスト中のプロセスをチェックすることができます。

テスト中の結果のレポート

addResults() を呼び出すことで、計測テストの実行後ではなく、実行と並行して結果をレポートできるようになりました。

テスト用のモック インテント

アプリのアクティビティに対する、独立した個別の UI テストを簡単に作成できるよう、 Android 8.0 では、onStartActivity()メソッドを導入しました。Instrumentation.ActivityMonitorクラスのカスタム サブクラス内でこのメソッドをオーバーライドすることで、テスト クラスが呼び出す特定のインテントを扱えるようになります。

テスト クラスがインテントを呼び出す際に、メソッドは、インテントそのものを実行するのではなく、Instrumentation.ActivityResultオブジェクトを返します。この疑似インテント ロジックを使ってテストを行うことで、他のアクティビティや全く異なるアプリに利用する予定のインテントに対し、あるアクティビティがどのように対応・処理するかという点に焦点を絞ることができます。

ランタイムとツール

プラットフォームの最適化

Android 8.0 では、ランタイムやその他の最適化がプラットフォームに対し実行されています。その結果、大きなパフォーマンス改善が実現されました。これらの最適化には、コンカレントコンパクション ガベージ コレクション、メモリ使用の効率化、コード ローカリティが含まれます。

上記のような最適化により、起動時間が短縮され、OS とアプリの両方でパフォーマンスが改善されました。

アップデートされた Java サポート

Android 8.0 が OpenJDK Java API のサポートを拡大:

新しく追加されたパッケージのクラスとメソッドについての詳細は、API 参考文書をご覧ください。

Android Studio でJava 8 の言語機能を使う 場合には、最新のプレビュー バージョンを ダウンロードしてください

アップデートされた ICU4J Android フレームワーク API

Android 8.0 は、アプリのデベロッパーが android.icu パッケージの下で使用できるように、ICU4J Android フレームワーク API— ICU4J API のサブセット—を拡張します。これらの API は、端末上のローカライズ データを使用します。これで、ICU4J ライブラリを APK にコンパイルせず、APK の使用量を削減することができます。

表 1. Android で使用される ICU バージョン、CLDR バージョン、Unicode バージョン

Android API レベル ICU バージョン CLDR バージョン Unicode バージョン
Android 7.0(API レベル 24)、Android 7.1(API レベル 25) 56 28 8.0
Android 8.0 58.2 30.0.3 9.0
サポートされる ICU4J API のアップデートの詳細については、リリースノートをご覧ください。

エンタープライズ向け Android

Android 8.0 が実行されている端末に新しいエンタープライズ機能と API が導入されました。主な点は次のとおりです。

  • 完全管理対象端末の仕事用プロファイルによって、エンタープライズが仕事用データと個人用データの両方を管理しながら、これらを分離することができます。
  • API の委任により、端末のオーナーとプロファイルのオーナーがアプリの管理を他のアプリに割り当てることができます。
  • プロビジョニング フローでのユーザー エクスペリエンスの向上(新しいカスタマイズ オプションを含む)により、セットアップ時間が短縮されます。
  • Bluetooth、Wi-Fi、バックアップ、セキュリティを介する新しいコントロールによって、エンタープライズが端末をさらに管理できるようになります。ネットワーク アクティビティ ロギングは、エンタープライズが問題を追跡するときに役立ちます。

上記に加え、その他の新しいエンタープライズ向け Android API と機能の詳細については、ビジネスで使用される Android をご覧ください。