Android 8.0 の機能と API

Android 8.0(API レベル 26)では、ユーザーやデベロッパー向けのさまざまな新機能が導入されています。このドキュメントでは、デベロッパー向けの最新情報を紹介します。

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

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

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

Android 8.0 のピクチャー イン ピクチャー。

Android 8.0(API レベル 26)では、アクティビティをピクチャー イン ピクチャー(PIP)モードで起動できます。PIP は特別なタイプのマルチウィンドウ モードで、主に動画の再生に使用されます。もともと PIP モードは Android TV のみAndroid 8.0 では、この機能が 他の Android デバイスでも使えます。

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

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

Android 8.0(API レベル 26)では、新しいオブジェクト PictureInPictureParams が導入されています。 これを PIP メソッドに渡して、アクティビティの動作方法を指定します。 クリックします。このオブジェクトでは、変数、 アクティビティのアスペクト比

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

  • Activity.enterPictureInPictureMode(PictureInPictureParams args): アクティビティをピクチャー イン ピクチャー モードで配置します。アクティビティのアスペクト比などの構成設定は、args で指定します。フィールド args が空の場合は、前回 Activity.setPictureInPictureParams() と呼ばれます。

    指定されたアクティビティが画面の隅に配置される。残りの部分 画面上にあった以前のアクティビティで画面いっぱいになります。 PIP モードに入ったアクティビティは一時停止状態になりますが、開始された状態は維持されます。ユーザーが PIP アクティビティをタップすると、次のメニューが表示されます。 操作するユーザーを指定します。アクティビティに到達している間は、アクティビティに到達しない 割り当てます

  • Activity.setPictureInPictureParams(): アクティビティの PIP 構成設定を更新します。アクティビティが 現在のモードが PIP モードの場合は、設定が更新されます。これは アスペクト比を変更できます。アクティビティが PIP モードでない場合、 構成設定は、構成環境に関係なく enterPictureInPictureMode() メソッドを呼び出します。

通知

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

    Android 8.0(API レベル 26)の通知の長押しメニュー。

    ユーザーはアプリ ランチャー アイコンを長押しして表示できます。 Android 8.0 では通知が無効になっています。

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

自動入力フレームワーク

アカウントの作成、ログイン、クレジット カードの取引には時間がかかり、エラーが発生する可能性があります。このようなタイプを必要とするアプリでは、ユーザーは不満を抱く可能性があります 可能になります。

Android 8.0(API レベル 26)では、ログインなどのフォームへの入力ができるようになっています。 自動入力フレームワークの導入により、簡単に行えるようにしました。 ユーザーがオプトインすると、既存および新規のアプリが自動入力フレームワークで機能する 自動的に入力されます。

いくつかの手順を踏んで、アプリとフレームワークの連携を最適化できます。 詳しくは 自動入力フレームワークの概要をご覧ください。

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

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

フォントのダウンロードについて詳しくは、このモジュールの ダウンロード可能フォント

XML フォント

Android 8.0(API レベル 26)では、XML フォントという新機能が導入されています。 フォントをリソースとして使用できますつまり フォントをバンドルする必要は アセットとして識別されます。フォントは R ファイルにコンパイルされ、自動的に リソースとして使用できるようになります。これらのフォントには 新しいリソースタイプ font のヘルプを確認できます。

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

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

TextView の自動サイズ設定

Android 8.0(API レベル 26)では、テキスト エキスパンドまたは TextView のサイズに基づいて自動的に縮小されます。これにより、異なる画面や動的コンテンツでテキストのサイズを最適化するのが以前よりもずっと簡単になります。Android 8.0 での TextView の自動サイズ調整について詳しくは、 TextView の自動サイズ調整をご覧ください。

アダプティブ アイコン

Android 8.0(API レベル 26)では、アダプティブ ランチャー アイコンが導入されました。アダプティブ アイコンを使用すると、 さまざまなデバイスモデルでさまざまな形状を表示できます。Google Chat で アダプティブ アイコンを作成する方法については、アダプティブ アイコンをご覧ください。 ご覧ください

カラー マネージメント

画像処理アプリの 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 の管理

セキュリティを強化するため、WebView クラスに Safe Browsing API を追加しました ウェブ閲覧の方法です。詳細については、Google Safe Browsing API をご覧ください。

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

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

詳しくは、ピン留めされたショートカットとウィジェット機能ガイドをご覧ください。

最大画面アスペクト比

Android 8.0(API レベル 26)では、アプリの最大アスペクト比の設定方法が変更されています。

まず、Android 8.0 では maxAspectRatio 属性が導入されました。この属性を使用すると、アプリの最大アスペクト比を設定できます。また、Android 8.0 以降では、アプリのデフォルトの最大アスペクト比は、アプリが実行されているデバイスのネイティブ アスペクト比になります。

最大アスペクト比の宣言について詳しくは、以下をご覧ください。 複数画面のサポート

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

Android 8.0(API レベル 26)以降では、プラットフォームでの複数ディスプレイのサポートが拡張されています。アクティビティがマルチウィンドウ モードと 複数のディスプレイを備えたデバイスで実行している場合、ユーザーはアクティビティを移動できます。 ディスプレイ間で通信できます。アプリでは、アクティビティを起動する際に使用するディスプレイを指定できます。

注: アクティビティが Android 8.0 では、マルチウィンドウ モードが自動的に マルチディスプレイのサポートが 可能になりますマルチディスプレイ環境でアプリが適切に動作することをテストする必要があります。

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

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

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

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

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

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

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

Android 8.0(API レベル 26)では、反対側の側面が View 要素で、同じマージンまたはパディングが使用されている。 具体的には、レイアウト XML で次の属性を使用できるようになりました。 ファイル:

注: アプリのロジックを、 さまざまな 言語や文化(テキストの方向を含む)は、 属性が値に影響を与えることはなく、 <ph type="x-smartling-placeholder"></ph> layout_marginStart layout_marginEnd paddingStart paddingEnd今回新たに加わった縦と横のレイアウト属性に加え、これらの値を自身で設定することで、テキストの方向に依存するレイアウト ビヘイビアを作成できます。

ポインタ キャプチャ

ゲーム、リモート デスクトップ、仮想化クライアントなど一部のアプリでは、マウスポインタの制御から大きなメリットを得ています。ポインタ キャプチャは Android 8.0(API レベル 26)の新機能であり、すべてのマウスイベントをアプリ内のフォーカスされているビューに配信することで、このような制御を実現します。

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

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

アプリのカテゴリ

Android 8.0(API レベル 26)では、各アプリで適合するカテゴリを宣言できます。 できます。これらのカテゴリは、類似のアプリをクラスタ化するために使用されます。 表示する際の目的や機能(データ使用量、バッテリー使用量、 ストレージ使用量。アプリのカテゴリを定義するには、<application> マニフェスト タグで android:appCategory 属性を設定します。

Android TV ランチャー

Android 8.0(API レベル 26)には、コンテンツ中心の新たな Android TV のホーム画面エクスペリエンス: Android 8.0 の Android TV エミュレータと Nexus Player のデバイス イメージ。新しいホーム画面では 動画コンテンツを、チャンネルに対応する行に配置し、各チャンネルには、 制御します。アプリは、複数のチャンネルを公開でき、ユーザーは、どのチャンネルをホーム画面に表示するか選択できます。Android TV のホーム画面には Watch Next 行もあり、 ユーザーの視聴習慣に基づいて、アプリから番組を自動的に生成します。アプリは 動画プレビュー: ユーザーが番組にフォーカスを合わせたときに自動再生されます。Google Cloud 向けの チャンネルと番組の入力は、Android として配布される TvProvider API に含まれています。 Android 8.0 のサポート ライブラリ モジュール。

AnimatorSet

Android 8.0(API レベル 26)以降、AnimatorSet API でシークと再生がサポートされるようになりました。 使用できます。シークを使用すると、アニメーション セットの位置を特定の位置に 決定できますアプリにアニメーションが含まれている場合、逆方向の再生は便利です。 確認することもできます。別々のアニメーション セットを 2 つ定義しなくても、同じアニメーションを逆順で再生できます。

入力とナビゲーション

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

アプリ内のアクティビティが、 図 2。UI 要素のグループをクラスタに編成することで、 キーボード ナビゲーションを使用できます。ユーザーは Chromebook 端末で Meta+Tab または Search+Tab を押してクラスタ間を移動できます。良い例 クラスタには、サイドパネル、ナビゲーション バー、メイン コンテンツ エリア、要素が含まれます。 多数の子要素を含めることが可能です。

ユーザーが操作する 5 つのナビゲーション クラスタを含むアクティビティの例
  キーボード ナビゲーションのクラスタ ショートカットを使用して移動できます。クラスタ
  上部パネル、左側サイドパネル、メイン コンテンツの順に配置されます。
  フローティング アクション ボタンの 2 つがあります。
図 2. 5 つのナビゲーションを含むアクティビティ クラスタ

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

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

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

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

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

音声出力

アクティビティとサービスは、 TextToSpeech: コンテンツの音声入力と発音を行います。時点 Android 8.0(API レベル 26)以降では、アプリでより正確なタイミング情報を取得できるようになりました。 テキスト読み上げエンジンが個々の合成単語の読み上げを開始すると、 エンジンがこの情報を提供しますこの機能を使用して テキスト読み上げエンジンが話すときに、特定の単語に注意を向けさせる できます。

こうしたテキスト読み上げエンジンの改善をアプリで使用するには、 UtteranceProgressListener のインスタンス。登録プロセスの一部として、onRangeStart() メソッドのハンドラを含めます。

テキスト読み上げエンジンは rangeStart() を呼び出して、特定のテキスト範囲の音声再生が開始されると想定される時点を記録します。そのテキスト範囲のオーディオの再生が開始されると、アプリの onRangeStart() メソッドが実行されます。アプリは、このコールバックに応答できます。たとえば、 発話に関連するテキスト範囲がハイライト表示されます。

テキスト読み上げエンジンの再生の進行状況のトラッキングについて詳しくは、UtteranceProgressListener クラスのリファレンスをご覧ください。

システム

新しい StrictMode 検出機能

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

  • detectUnbufferedIo() は、パフォーマンスに重大な影響を及ぼす可能性があるバッファリングなしで、アプリがデータの読み取りまたは書き込みを行うタイミングを検出します。
  • detectContentUriWithoutPermission() のアクション 別のアプリの権限の付与を忘れた場合に、アプリが アプリ外でアクティビティを開始する場合。
  • 次の場合に detectUntaggedSockets() が検出します アプリがネットワーク トラフィックを実行します。その際、 setThreadStatsTag(int): デバッグ用のトラフィックにタグを付ける あります。

キャッシュ データ

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

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

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

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

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

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

コンテンツ プロバイダがアップデートされ、大きなデータセットを一度に 1 ページずつ読み込む操作がサポートされるようになりました。たとえば、何千もの画像を含む写真アプリは 画像を使用して、ページに表示するデータのサブセットをクエリできます。各ページ コンテンツ プロバイダが返す結果のうち、1 つのカーソルで表される割合 渡されます。使用するためには、クライアントとプロバイダの両方がページングを実装する必要があります。 おすすめします。

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

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

ContentProviderContentResolver 個のクラスにそれぞれ refresh()メソッドを追加し、 確認する必要があります。

ContentProvider を拡張することで、カスタム コンテンツの更新ロジックを追加できます。必ず 返される refresh() メソッド true: プロバイダのクライアントに、試行したことを示します。 データを手動で更新することもできます。

クライアント アプリは、 別のメソッドを使用して、 refresh()。この呼び出しの メソッドには、更新するデータの URI を渡します。

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

JobScheduler の改善

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

JobScheduler の更新内容は次のとおりです。

  • ワーク キューをスケジュールされたジョブに関連付けることができます。ワークアイテムをジョブのキューに追加するには、JobScheduler.enqueue() を呼び出します。ジョブの実行中に、保留中のワークをキューから外し、処理を行います。この機能は、従来バックグラウンド サービス(特に、IntentService を実行するサービス)の開始を必要としていた多くのユースケースを処理できます。
  • Android サポート ライブラリ 26.0.0 では、新しい JobIntentService クラスが導入されています。このクラスは、 IntentService として機能していますが、代わりにジョブを使用します。 Android 8.0(API レベル 26)以降で実行する場合。
  • 今すぐ JobInfo.Builder.setClipData() ClipData をジョブに関連付けます。このオプションにより URI 権限付与をジョブに関連付ける方法は、 権限は Context.startService() に伝播できます。また、ワーク キューに対してインテントを伴う URI パーミッション供与を使うこともできます。
  • スケジュールされたジョブで、いくつかの新しい制約がサポートされるようになりました。 <ph type="x-smartling-placeholder">
    </ph>
    JobInfo.isRequireStorageNotLow()
    デバイスの空き容量が少ない場合、ジョブは実行されません。
    JobInfo.isRequireBatteryNotLow()
    バッテリー残量が限界以下である場合、ジョブは実行されません しきい値このレベルで、デバイスに [バッテリー残量低下] と 警告システム ダイアログが表示されます。
    NETWORK_TYPE_METERED
    ジョブには従量制のネットワーク接続(ほとんどのモバイルデータなど)が必要 説明します

カスタムデータ ストア

Android 8.0(API レベル 26)では、好みに合わせたカスタム データストアを提供でき、 アプリでプリファレンスをクラウドやローカルのデータベースに保存する場合に便利です。 設定がデバイス固有の場合ですデータストアの実装の詳細については、カスタム データストアをご覧ください。

メディアの拡張

VolumeShaper

新しい VolumeShaper クラスがあります。フェイドイン、フェイドアウト、クロス フェイドといった、小規模な自動ボリューム移行を実行するために利用できます。VolumeShaper で振幅を制御するをご覧ください。 をご覧ください。

音声フォーカスの機能強化

オーディオ アプリは、音声フォーカスをリクエストして破棄することで、デバイスのオーディオ出力を共有します。 アプリは、再生の開始や停止を行ったり、ボリュームを絞ることにより、フォーカスの変更を処理します。新しい AudioFocusRequest クラスがあります。このクラスを requestAudioFocus(), アプリは、音声フォーカスの変更を処理する際の新しい機能を備えています。 自動ダッキング遅延フォーカス ゲイン

メディア指標

新しい getMetrics() メソッドは PersistableBundle を返す 構成を含むオブジェクト パフォーマンス情報を属性と値のマップとして表します。 getMetrics() メソッドは、次のメディアクラス用に定義されています。

指標はインスタンスごとに個別に収集され、インスタンスの存続期間中保持されます。利用可能な指標がない場合、メソッドからは null が返されます。実際に返される指標は、クラスによって異なります。

MediaPlayer

Android 8.0(API レベル 26)以降の MediaPlayer は、DRM で保護された素材と HLS サンプルレベル暗号化メディアを再生できます。

Android 8.0 では、フレームをシークする際のきめ細かい制御を提供する、オーバーロードされた新しい seekTo() コマンドが導入されています。シークモードを指定する 2 つ目のパラメータが含まれます。

  • SEEK_PREVIOUS_SYNC は、メディア位置を同期(またはキー)フレームに移動します。 特定の時点の直前または時点のデータソースに 関連付けられているエンティティです
  • SEEK_NEXT_SYNC は、指定された時間の直後またはその時間にあるデータソースに関連付けられた同期(またはキー)フレームにメディアの位置を移動します。
  • SEEK_CLOSEST_SYNC は、メディア位置を同期(またはキー)フレームに移動します。 特定の時点に最も近い場所、またはその時点で
  • SEEK_CLOSEST は、指定された時刻に最も近い、または指定された時刻のデータソースに関連付けられているフレーム(同期フレームまたはキーフレームとは限りません)にメディアの位置を移動します。

連続シークする場合は、SEEK_CLOSEST ではなく SEEK_ モードのいずれかを使用する必要があります。SEEK_CLOSEST は比較的遅いですが、より正確に動作します。

MediaRecorder

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

    Kotlin

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS)

    Java

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_2_TS);

    MediaRecorder.OutputFormat を参照

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

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

メタデータ トラックを追加する場合、トラックの MIME 形式を接頭辞で始める必要があります。 「application/」とします。メタデータの書き込みは、動画データや音声データの書き込みと同じですが、MediaCodec からデータを取得するわけではありません。代わりに、アプリは タイムスタンプに関連付けられた ByteBuffer writeSampleData() メソッドを使用します。 タイムスタンプは動画トラックおよびオーディオ トラックと同じタイムベースに属している必要があります。

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

メディア ファイル アクセスの改善

「 <ph type="x-smartling-placeholder"></ph> ストレージ アクセス フレームワーク(SAF)を使用すると、アプリはカスタム DocumentsProvider は、ファイルへのアクセスを許可できます。 他のアプリへの変換を行えます実際、 ドキュメント プロバイダは、ドキュメント、スプレッドシート、 プロトコルを使用するアプリケーションや、 メディア転送プロトコル(MTP)

ただし、リモート データソースからサイズの大きなメディア ファイルにアクセスすると、 課題:

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

Android 8.0 では、ストレージ アクセスを改善することで、これらの各課題に対処しています。 説明します。

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

Android 8.0 以降では、ストレージ アクセス フレームワークで カスタム ドキュメント プロバイダを使用して、フォルダ内に存在するファイルのシーク可能なファイル記述子を作成します。 リモートデータソースですSAF はファイルを開いてネイティブ シーク可能なファイルを取得できます 使用します。次に SAF が、個別のバイト リクエストをドキュメントに配信します。 接続します。この機能によって、メディア プレーヤー アプリがあらかじめファイル全体をキャッシュする代わりにリクエストする、正確なバイト範囲がドキュメント プロバイダから戻ります。

この機能を使用するには、新しい StorageManager.openProxyFileDescriptor() メソッドを使用します。「 openProxyFileDescriptor() メソッドは、コールバックとして ProxyFileDescriptorCallback オブジェクトを受け取ります。SAF は、 クライアント アプリケーションがファイル オペレーションを実行するたびに ドキュメント プロバイダから返されたファイル記述子。

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

Android 8.0(API レベル 26)以降では、 getDocumentUri() メソッドを次のように変更します。 指定された mediaUri と同じドキュメントを参照する URI を取得します。 ただし、返される URI は DocumentsProvider、メディア コレクション管理者がアクセスできます スコープ付きディレクトリのツリーを走査することなく、ドキュメントを直接実行できます。 これにより、メディア管理者はドキュメントに対してファイル操作を実行できるようになります。 大幅に短縮されました

注意: getDocumentUri() メソッドはメディア ファイルの位置を特定するものであり、アプリにファイルへのアクセス許可を与えるものではありません。アクセス権を取得する方法について詳しくは、 権限の詳細については、リファレンス ドキュメントをご覧ください。

ドキュメントへのパス

Android 8.0(API レベル 26)でストレージ アクセス フレームワークを使用する場合は、 findDocumentPath() メソッド(両方で使用可) DocumentsContractDocumentsProvider クラスを使用して、ドキュメントの特定の場所からファイル システムのルートからのパスを決定 あります。このメソッドは、このパスを DocumentsContract.Path オブジェクトで返します。ファイルが 同じドキュメントへのパスが複数定義されている場合、メソッドは 指定された ID のドキュメントに到達するために最も頻繁に使用されるパス。

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

  • アプリが [名前を付けて保存] 機能を使用しているアプリケーションの場所を表示するダイアログ 特定します
  • 検索結果ビューにフォルダを表示するため、子を読み込む必要がある そのフォルダに含まれるドキュメントも検索できます( フォルダに配置されます。

注: アプリに一部のドキュメントのみにアクセスする権限がある場合 findDocumentPath() の戻り値に アプリがアクセスできるフォルダとドキュメントです。

音声再生のモニタリング

AudioManager システム サービスは、アクティブな AudioPlaybackConfiguration オブジェクトのリストを保持します。各オブジェクトには、特定のオーディオ再生セッションに関する情報が含まれます。アプリは、getActivePlaybackConfigurations() を呼び出して、現在アクティブな構成のセットを取得できます。

Android 8.0(API レベル 26)以降では、通知を送信するコールバックを登録して、 1 つまたは複数のコンテナが AudioPlaybackConfiguration 個のオブジェクトが変更されました。そのためには、 registerAudioPlaybackCallback() を呼び出し、 AudioManager.AudioPlaybackCallback。「 AudioManager.AudioPlaybackCallback クラスには、 onPlaybackConfigChanged() メソッド: 音声信号が再生されたときにシステムが 必要があります。

接続

Wi-Fi Aware

Android 8.0(API レベル 26)では、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(API レベル 26)では、 機能:

  • 楽曲ライブラリのブラウジングを有効にする AVRCP 1.4 規格のサポート。
  • Bluetooth Low-Energy(BLE)5.0 規格のサポート。
  • Sony LDAC コーデックを Bluetooth スタックに統合しました。

コンパニオン デバイスのペア設定

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

Android での Bluetooth の使用について詳しくは、 Bluetooth ガイドをご覧ください。対象 Android 8.0(API レベル 26)に固有の Bluetooth に関する変更については、 Bluetooth セクション( Android 8.0 の動作の変更点のページ

共有

スマート共有

Android 8.0(API レベル 26)では、カスタマイズされた共有 コンテンツのタイプごとに好みや好みに合った最適な できます。たとえば、ユーザーが領収書の写真を撮ると、Android は 8.0 は経費追跡アプリを提案できます。ユーザーが自撮り写真を撮った場合 より適切に画像を処理できます。Android 8.0 は、ユーザーがカスタマイズした設定に従って、こういったパターンをすべて自動的に学習します。

スマート共有は、次のような image 以外のコンテンツで機能します。 audio さん、video さん、text さん、URL さん、 その他

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

Kotlin

val annotations: ArrayList<String> = arrayListOf(
        "topic1",
        "topic2",
        "topic3"
)

intent.putStringArrayListExtra(
        Intent.EXTRA_CONTENT_ANNOTATIONS,
        annotations
)

Java

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

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

intent.putStringArrayListExtra(
    Intent.EXTRA_CONTENT_ANNOTATIONS,
    annotations
);

スマート共有のアノテーションについて詳しくは、 EXTRA_CONTENT_ANNOTATIONS

テキスト分類器

対応デバイスでは、アプリで新しいテキスト分類を使用して、 文字列が既知の分類器エンティティ タイプに一致し、選択候補が取得されます できます。システムが認識するエンティティには、住所、URL、 電話番号、メールアドレスなどです詳細については、TextClassifier をご覧ください。

ユーザー補助

Android 8.0(API レベル 26)では、独自のユーザー補助機能サービスを作成するデベロッパー向けに、次の新しいユーザー補助機能がサポートされています。

アプリのユーザー補助機能を強化する方法について詳しくは、ユーザー補助機能をご覧ください。

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

権限

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

  • ANSWER_PHONE_CALLS 権限を使用すると、アプリは着信にプログラムで応答できます。着信を処理するには 使用したい場合は、 acceptRingingCall() メソッドを呼び出します。
  • <ph type="x-smartling-placeholder"></ph> READ_PHONE_NUMBERS 権限は、アプリに以下の読み取りアクセス権を付与します。 デバイスに保存されている電話番号。

これらの権限は両方とも 危険 両方とも PHONE 権限グループを作成します。

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

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

以前のバージョンの Android では、 ユーザーがすべてのアカウントについて 無関係なタイプです。Android 8.0 では、addOnAccountsUpdatedListener(android.accounts.OnAccountsUpdateListener, android.os.Handler, boolean, java.lang.String[]) メソッドが追加されています。このメソッドを使うと、アプリで変更を受信するアカウント タイプのリストを指定できます。

API の変更

AccountManager は、認証システムがどのメソッドを アプリは次のアカウントで参照できます。

Android 8.0(API レベル 26)では、アプリの可視性レベルを指定するために 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 のリファレンスをご覧ください。

テスト

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

Android 8.0(API レベル 26)では、アプリの インストルメンテーション テストです。

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

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

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

  • 特定のプロセスの名前。
  • コンマで区切られたプロセス名の一覧。
  • インストルメンテーションの実行を許可するワイルドカード("*") で指定されるパッケージ内のコードを実行する起動プロセスに対して android:targetPackage 属性。

インストルメンテーション テストの実行中に、 getProcessName() を呼び出してテストしています。

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

インストルメンテーション テストの実行中に結果を報告できるようになりました。 代わりに addResults() を呼び出します。

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

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

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

ランタイムとツール

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

Android 8.0(API レベル 26)では、ランタイムやその他の最適化がプラットフォームに対し実行されています。その結果、大きなパフォーマンス改善が実現されました。これらの最適化には、同時圧縮ガベージ コレクション、 メモリの使用効率の向上、コードの局所性の向上です

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

Java 言語サポートの更新

Android 8.0(API レベル 26)では、いくつかの OpenJDK Java API のサポートが追加されています。

新しく追加されたこれらの API リファレンス ドキュメントをご覧ください。

Android Studio で Java 8 の言語機能を使用する場合は、最新のプレビュー バージョンをダウンロードする必要があります。

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

Android 8.0(API レベル 26)は、アプリ デベロッパーが 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(API レベル 26) 58.2 30.0.3 9.0

Android での国際化について詳しくは、以下をご覧ください。 ICU4J のサポートについては、をご覧ください。 Android での国際化

Android Enterprise

Android 8.0(API レベル 26)を搭載したデバイス向けに、新しいエンタープライズ機能と API が導入されました。次のような特徴があります。

  • 完全管理対象デバイスの仕事用プロファイルによって、エンタープライズが仕事用データと個人用データの両方を管理しながら、これらを分離することができます。
  • API 委任により、デバイス オーナーとプロファイル オーナーがアプリを割り当てることができる 管理を他のサービスと共有します。
  • プロビジョニング フローにおけるユーザー エクスペリエンスの向上(新しい カスタマイズ オプションなど)を使用することによって、設定時間を短縮できます。
  • Bluetooth、Wi-Fi、バックアップ、セキュリティの新しい管理機能により、 デバイスを管理できます。企業はネットワーク アクティビティ ログを使用して、 サポートします。

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