Android 9 の機能と API

Android 9(API レベル 28)では、ユーザーとデベロッパー向けに優れた新しい機能が導入されました。このドキュメントでは、主にデベロッパー向けの新機能について紹介します。

新しい API について詳しくは、API 差分レポートをご覧になるか、Android API リファレンスをご覧ください。また、Android 9 の動作変更も必ずご確認ください。プラットフォームの変更がアプリに影響する可能性がある領域について説明しています。

Wi-Fi RTT を使用した屋内位置測定

新しい RTT API は、アプリでの屋内位置情報をサポートします。

Android 9 では、IEEE 802.11-2016 Wi-Fi プロトコル(Wi-Fi ラウンドトリップ時間(RTT)とも呼ばれます)のプラットフォーム サポートが追加され、アプリで屋内測位を利用できるようになりました。

ハードウェア サポートを備えた Android 9 を搭載するデバイスでは、アプリは RTT API を使用して、近くにある RTT 対応の Wi-Fi アクセス ポイント(AP)までの距離を測定できます。デバイスで位置情報サービスが有効になっており、Wi-Fi スキャンがオンになっている([設定] > [位置情報])必要があります。また、アプリに ACCESS_FINE_LOCATION 権限が必要です。RTT を使用するためにデバイスをアクセス ポイントに接続する必要はありません。プライバシーを保護するため、アクセス ポイントまでの距離を特定できるのはスマートフォンのみです。アクセス ポイントにはこの情報がありません。

デバイスが 3 つ以上のアクセス ポイントまでの距離を測定する場合、マルチラテレーション アルゴリズムを使用して、それらの測定値に最も適合するデバイスの位置を推定できます。通常、結果の精度は 1 ~ 2 メートル以内です。

この精度により、建物内のナビゲーションや、音声操作の曖昧さの解消(「この照明を点けて」など)や位置情報に基づく情報(「この商品の特別セールはありますか?」など)といった、きめ細かい位置情報に基づくサービスなどの新しいエクスペリエンスを構築できます。

Android WifiRttScan デモアプリで WiFi RTT API の使用例をご覧ください。

詳しくは、Wi-Fi 位置情報: RTT を使用した距離測定をご覧ください。

ディスプレイ カットアウトのサポート

さまざまなカットアウト サイズが表示されている [開発者向けオプション] 画面

エミュレータを使用してディスプレイ カットアウトをテストする

Android 9 では、カメラやスピーカー用のディスプレイ カットアウトを含む最新のエッジ ツー エッジ スクリーンがサポートされています。DisplayCutout クラスを使用すると、コンテンツを表示すべきでない非機能領域の位置と形状を特定できます。これらの切り抜き領域の存在と配置を判断するには、getDisplayCutout() メソッドを使用します。

新しいウィンドウ レイアウト属性 layoutInDisplayCutoutMode を使用すると、アプリのコンテンツをデバイスの切り抜きに合わせてレイアウトできます。この属性は、次のいずれかの値に設定できます。

Android 9 を実行しているデバイスまたはエミュレータで、次のようにして画面の切り抜きをシミュレートできます。

  1. 開発者向けオプションを有効にします。
  2. [開発者向けオプション] 画面で、[描画] セクションまで下にスクロールし、[切り抜きのあるディスプレイをシミュレート] を選択します。
  3. 切り抜きのサイズを選択します。

通知

Android 9 では、通知にいくつかの機能強化が導入されています。これらはすべて、API レベル 28 以上をターゲットとするデベロッパーが利用できます。

メッセージングの通知

写真が添付された MessagingStyle。

メッセージ通知

返信と会話を含む MessagingStyle。

Android 9 の機能を含む、通知を使用するサンプルコードについては、People サンプルをご覧ください。

メッセージ エクスペリエンスの向上

Android 7.0(API レベル 24)以降では、通知から直接メッセージに返信したり、他のテキストを入力したりするアクションを追加できるようになりました。Android 9 では、この機能に対して以下の強化が行われています。

  • 会話の参加者のサポートを簡素化: Person クラスは、会話に関与するユーザー(アバターや URI など)を識別するために使用されます。addMessage() など、他の多くの API も、CharSequence ではなく Person クラスを活用するようになりました。Person クラスは、Builder デザイン パターンもサポートしています。

  • 画像のサポート: Android 9 では、スマートフォンのメッセージ通知に画像が表示されるようになりました。メッセージで setData() を使用して、画像を表示できます。次のコード スニペットは、Person と画像を含むメッセージを作成する方法を示しています。

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • 返信を下書きとして保存する: ユーザーが誤ってメッセージング通知を閉じたときにシステムから送信される EXTRA_REMOTE_INPUT_DRAFT をアプリで取得できます。このエキストラを使用すると、アプリのテキスト フィールドに事前に入力して、ユーザーが返信を完了できるようにすることができます。

  • 会話がグループの会話かどうかを識別する: setGroupConversation() を使用して、会話をグループの会話またはグループ以外の会話として意図的に識別できます。

  • インテントのセマンティック アクションを設定する: setSemanticAction() メソッドを使用すると、「既読にする」、「削除」、「返信」などのアクションにセマンティックな意味を与えることができます。

  • スマート リプライ: Android 9 では、メッセージ アプリで利用できるものと同じ候補の返信がサポートされています。RemoteInput.setChoices() を使用して、ユーザーに標準の返信の配列を提供します。

チャンネル設定、ブロードキャスト、サイレント モード

Android 8.0 では、通知チャンネルが導入されました。これにより、表示する通知の種類ごとにユーザーがカスタマイズ可能なチャンネルを作成できます。Android 9 では、以下の変更により通知チャンネルの設定が簡素化されています。

  • チャンネル グループのブロック: アプリの通知設定でチャンネル グループ全体をブロックできるようになりました。isBlocked() メソッドを使用して、グループがブロックされたタイミングを特定し、そのグループのチャンネルの通知を送信しないようにできます。

    また、アプリは新しい getNotificationChannelGroup() メソッドを使用して、現在のチャネル グループ設定をクエリできます。

  • 新しいブロードキャスト インテント タイプ: 通知チャンネルとチャンネル グループのブロック状態が変化したときに、Android システムがブロードキャスト インテントを送信するようになりました。ブロックされたチャンネルまたはグループを所有するアプリは、これらのインテントをリッスンして、それに応じて反応できます。これらのインテント アクションとエキストラについて詳しくは、NotificationManager リファレンスの更新された定数リストを参照してください。ブロードキャスト インテントへの対応については、ブロードキャストを参照してください。

  • NotificationManager.Policy には、次の 3 つの新しいサイレント モードの優先カテゴリがあります。

  • NotificationManager.Policy には、視覚的な中断を抑制するために使用できる 7 つの新しいサイレント モード定数も含まれています。

マルチカメラ サポートとカメラのアップデート

Android 9 を搭載したデバイスでは、2 つ以上の物理カメラから同時にストリームにアクセスできます。前面カメラまたは背面カメラを 2 つ搭載したデバイスでは、シームレスなズーム、ボケ、ステレオ ビジョンなど、1 つのカメラでは実現できない革新的な機能を作成できます。また、この API を使用すると、複数のカメラを自動的に切り替える論理カメラ ストリームまたはフュージョン カメラ ストリームを呼び出すこともできます。

カメラのその他の改善点としては、最初のキャプチャ時の遅延を軽減するのに役立つ追加のセッション パラメータや、カメラ クライアントがカメラ ストリーミングを停止して開始する必要なくさまざまなユースケースを処理できるサーフェス共有などがあります。また、アプリレベルの画像安定化と特殊効果のために、ディスプレイ ベースのフラッシュ サポートと OIS タイムスタンプへのアクセス用の API も追加しました。

Android 9 では、マルチカメラ API が FULL または LIMITED 機能を備えたデバイスのモノクロカメラをサポートしています。モノクロ出力は、Y をグレースケール、U(Cb)を 128、V(Cr)を 128 とする YUV_420_888 形式で実現されます。

Android 9 では、サポート対象デバイスの外部 USB/UVC カメラのサポートも有効になります。

ドローアブルとビットマップ用の ImageDecoder

Android 9 では、画像をデコードするための最新のアプローチを提供する ImageDecoder クラスが導入されました。このクラスは、BitmapFactory API と BitmapFactory.Options API の代わりに使用します。

ImageDecoder を使用すると、バイトバッファ、ファイル、URI から Drawable または Bitmap を作成できます。画像をデコードするには、まずエンコードされた画像のソースを指定して createSource() を呼び出します。次に、ImageDecoder.Source オブジェクトを渡して decodeDrawable() または decodeBitmap() を呼び出し、Drawable または Bitmap を作成します。デフォルト設定を変更するには、decodeDrawable() または decodeBitmap() に OnHeaderDecodedListener を渡します。ImageDecoder は、画像のデフォルトの幅と高さがわかると、それらを使用して onHeaderDecoded() を呼び出します。エンコードされた画像が GIF アニメーションまたは WebP の場合、decodeDrawable() は AnimatedImageDrawable クラスのインスタンスである Drawable を返します。

画像プロパティを設定するには、次のさまざまな方法があります。

  • デコードされた画像を正確なサイズにスケーリングするには、ターゲットの寸法を setTargetSize() に渡します。サンプルサイズを使用して画像をスケーリングすることもできます。サンプルサイズを setTargetSampleSize() に直接渡します。
  • スケーリングされた画像の範囲内で画像を切り抜くには、setCrop() を呼び出します。
  • 可変ビットマップを作成するには、true を setMutableRequired() に渡します。

ImageDecoder では、角丸や円形マスクなど、カスタマイズされた複雑な効果を画像に追加することもできます。PostProcessor クラスのインスタンスで setPostProcessor() を使用して、必要な描画コマンドを実行します。

アニメーション

Android 9 では、GIF と WebP のアニメーション画像を描画して表示するための AnimatedImageDrawable クラスが導入されています。AnimatedImageDrawable は AnimatedVectorDrawable と同様に動作します。つまり、レンダリング スレッドが AnimatedImageDrawable のアニメーションを駆動します。レンダリング スレッドは、ワーカー スレッドを使用してデコードも行うため、デコードがレンダリング スレッドの他のオペレーションを妨げることはありません。この実装により、アプリはアニメーション画像を、更新を管理したり、アプリの UI スレッドで他のイベントを妨害したりすることなく表示できます。

AnimatedImageDrawable は、ImageDecoder のインスタンスを使用してデコードできます。次のコード スニペットは、ImageDecoder を使用して AnimatedImageDrawable をデコードする方法を示しています。

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder には、画像をさらに変更できるメソッドがいくつかあります。たとえば、setPostProcessor() メソッドを使用して、円形マスクや角丸の適用など、画像の外観を変更できます。

HDR VP9 動画、HEIF 画像圧縮、メディア API

Android 9 は High Dynamic Range(HDR)VP9 プロファイル 2 をネイティブでサポートしているため、HDR 対応デバイスで YouTube や Google Play ムービーなどのソースから HDR 対応の映画をユーザーに配信できます。

Android 9 では、High Efficiency Image File 形式(HEIF または HEIC)を使用した画像のエンコードのサポートも追加されています。これにより、圧縮率が向上し、ストレージ容量とネットワーク データ使用量が削減されます。HEIF 静止画像サンプルは、MediaMuxer クラスと MediaExtractor クラスでサポートされています。Android 9 デバイスでプラットフォーム サポートが提供されているため、バックエンド サーバーから HEIF 画像を簡単に送信して利用できます。アプリが共有と表示のためにこのデータ形式と互換性があることを確認したら、アプリで画像保存形式として HEIF を試してみてください。ImageDecoder または BitmapFactory(JPEG ファイルからビットマップを取得)を使用して、JPEG から HEIC への変換を行うことができます。その後、HeifWriter を使用して、YUV バイトバッファ、Surface、または Bitmap のインスタンスから HEIF 静止画像を書き込むことができます。

メディア指標は、AudioTrack、AudioRecord、MediaDrm クラスからも取得できます。

Android 9 では、MediaDRM クラスに、指標、HDCP レベル、セキュリティ レベル、セッション数を取得し、セキュリティ レベルとセキュア ストップをより細かく制御するためのメソッドが導入されています。詳しくは、API 差分レポートをご覧ください。

Android 9 では、AAudio API で、使用状況、コンテンツ タイプ、入力プリセットなど、いくつかの AAudioStream 属性のサポートが追加されています。これらの属性を使用して、VoIP アプリケーションまたはビデオカメラ アプリケーション用に調整されたストリームを作成できます。セッション ID を設定して、エフェクトを含めることができるサブミックスに AAudio ストリームを関連付けることもできます。AudioEffect API を使用してエフェクトを制御します。

Android 9 では、ダイナミクス処理用の AudioEffect API が導入されています。このクラスを使用すると、複数のステージにわたって、イコライゼーション、マルチバンド コンプレッション、リミッターなどのチャンネル ベースのオーディオ エフェクトを構築できます。帯域数とアクティブ ステージの数は構成可能で、ほとんどのパラメータはリアルタイムで制御できます。

JobScheduler でデータのコストを管理

Android 9 以降では、JobScheduler は携帯通信会社が提供するネットワーク ステータス シグナルを使用して、ネットワーク関連のジョブの処理を改善できます。

ジョブは、推定データサイズを宣言し、プリフェッチをシグナルで通知し、詳細なネットワーク要件を指定できます。JobScheduler は、ネットワークのステータスに応じて作業を管理します。たとえば、ネットワークが輻輳していることを通知すると、JobScheduler は大規模なネットワーク リクエストを遅延させる可能性があります。定額制ネットワークに接続している場合、JobScheduler はプリフェッチ ジョブを実行して、見出しのプリフェッチなどによりユーザー エクスペリエンスを向上させることができます。

ジョブを追加する際は、setEstimatedNetworkBytes()、setPrefetch()、setRequiredNetwork() を適宜使用して、JobScheduler が作業を適切に処理できるようにしてください。ジョブを実行するときは、JobParameters.getNetwork() から返された Network オブジェクトを必ず使用してください。そうしないと、デバイスのデフォルト ネットワークが暗黙的に使用され、要件を満たさない可能性があり、意図しないデータ使用が発生する可能性があります。

Neural Networks API 1.1

Neural Networks API は、Android でのオンデバイスの ML を高速化するために Android 8.1(API レベル 27)で導入されました。Android 9 では、API が拡張および改善され、次の 9 つの新しいオペレーションのサポートが追加されています。

既知の問題: ANEURALNETWORKS_TENSOR_QUANT8_ASYMM テンソルを ANEURALNETWORKS_PAD 演算(Android 9 以上で利用可能)に渡す場合、NNAPI を使用した場合の出力と、それより上位の機械学習フレームワーク(TensorFlow Lite など)を使用した場合の出力が一致しない場合があります。代わりに、問題が解決するまで ANEURALNETWORKS_TENSOR_FLOAT32 のみを渡す必要があります。

また、この API には、IEEE 754 16 ビット浮動小数点形式と同程度の範囲と精度で ANEURALNETWORKS_TENSOR_FLOAT32 を計算するかどうかを指定できる新しい関数 ANeuralNetworksModel_relaxComputationFloat32toFloat16() も導入されています。

自動入力フレームワーク

Android 9 では、フォームの入力時にユーザー エクスペリエンスをさらに向上させるために、自動入力サービスが実装できる複数の改善が導入されています。アプリで自動入力機能を使用する方法について詳しくは、自動入力フレームワーク ガイドをご覧ください。

セキュリティの機能強化

Android 9 では、次のセクションで概要を説明するセキュリティ機能が多数導入されています。

Android Protected の確認

Android 9 以降を搭載したサポート対象デバイスでは、Android Protected の確認を使用できます。このワークフローを使用すると、アプリでユーザーに短いステートメントの承認を求めるプロンプトが表示されます。このメッセージによって、支払いなどの機密性の高い取引を完了する際に、ユーザーの意思をアプリで再確認できます。

ユーザーがこのステートメントを承認すると、Android キーストアは、鍵付きハッシュ メッセージ認証コード(HMAC)で保護された暗号署名を受信して保存します。Android キーストアがメッセージの有効性を確認すると、アプリは信頼できる実行環境(TEE)の trustedConfirmationRequired から生成された鍵を使用して、ユーザーが承認したメッセージに署名できます。署名により、ユーザーが確実にステートメントを見て、それに同意したことになります。

注意: Android Protected の確認は、ユーザーに対して安全な情報チャンネルを提供しません。アプリでは、Android プラットフォームが提供する機密保持の保証以外は保証されません。特に、このワークフローを使用して、ユーザーのデバイスに通常は表示しない機密情報を表示しないようにしてください。

Android Protected Confirmation のサポートを追加するガイダンスについては、Android Protected Confirmation ガイドをご覧ください。

統合された生体認証ダイアログ

Android 9 では、システムがアプリに代わって生体認証ダイアログを提供します。この機能により、ダイアログのルック アンド フィールと配置が標準化され、ユーザーは信頼できる生体認証クレデンシャル チェッカーに対して認証を行っていることを確信できます。

アプリで FingerprintManager を使用してユーザーに指紋認証ダイアログを表示している場合は、代わりに BiometricPrompt を使用するように切り替えます。BiometricPrompt は、システムに依存して認証ダイアログを表示します。また、ユーザーが選択した生体認証のタイプに合わせて動作を変更します。

ハードウェア セキュリティ モジュール

Android 9 以降を搭載するサポート対象デバイスには、StrongBox KeyMint(以前の Keymaster)があります。これは KeyMint(以前の Keymaster)HAL の実装で、ハードウェア セキュリティ モジュールに格納されています。このモジュールには次のものが含まれています。

  • 独自の CPU。
  • 安全なストレージ。
  • 真性乱数ジェネレータ。
  • パッケージの改ざんやアプリの不正なサイドローディングを防ぐ追加のメカニズム。

StrongBox KeyMint に保存されているキーをチェックする際、システムはキーの完全性を高信頼実行環境(TEE)と照合します。

StrongBox KeyMint の使用について詳しくは、ハードウェア セキュリティ モジュールをご覧ください。

キーストアへの鍵の安全なインポート

Android 9 では、ASN.1 でエンコードされた鍵形式を使用して、暗号化された鍵をキーストアに安全にインポートする機能を追加することで、鍵を復号する際のセキュリティを強化しています。KeyMint によりキーストアで鍵が復号されるため、デバイスのホスト メモリに鍵のコンテンツが平文として表示されることはありません。

暗号化された鍵をより安全にインポートする方法について学習する。

鍵のローテーションを含む APK 署名スキーム

Android 9 では、APK 署名スキーム v3 のサポートが追加されました。このスキームでは、署名証明書ごとに、署名ブロックに proof-of-rotation レコードを含めることができます。この機能により、APK ファイルの過去の署名証明書を現在の署名証明書にリンクすることで、アプリを新しい署名証明書で署名できるようになります。

apksigner を使用して鍵をローテーションする方法の詳細を確認する。

ロック解除されたデバイスでのみ鍵の復号を許可するオプション

Android 9 では、unlockedDeviceRequired フラグが導入されています。このオプションは、指定された鍵を使用して転送中または保存されたデータの復号を許可する前に、キーストアで画面のロック解除が必要かどうかを決定します。これらのタイプの鍵は、医療データや企業データなど、ディスクに保存する機密データを暗号化するのに適しています。このフラグにより、スマートフォンが紛失または盗難された場合でも、デバイスがロックされている間はデータを復号できないことが保証されます。

デバイスがロックされている間、鍵が復号されないようにするには、setUnlockedDeviceRequired() メソッドに true を渡してフラグを有効にします。この手順を完了すると、ユーザーの画面がロックされているときに、この鍵を使用してデータを復号または署名しようとすると失敗します。ロックされたデバイスにアクセスするには、PIN、パスワード、指紋、またはその他の信頼できる要素が必要です。

以前の暗号化のサポート

Keymaster 4 を搭載して出荷される Android 9 デバイスは、トリプル データ暗号化アルゴリズム(トリプル DES)をサポートします。Triple DES を必要とするレガシー システムとアプリが相互運用する場合は、機密性の高い認証情報を暗号化するときにこのタイプの暗号を使用します。

アプリのセキュリティを高める方法について詳しくは、Android デベロッパー向けのセキュリティをご覧ください。

WPS のサポート終了

セキュリティ上の理由により、Wi-Fi Protected Setup(WPS)は非推奨になりました。

Android バックアップ

Android 9 では、バックアップと復元に関連する新しい機能とデベロッパー オプションが追加されています。これらの変更の詳細については、以降のセクションをご覧ください。

クライアントサイド暗号化のバックアップ

Android 9 では、クライアントサイド シークレットによる Android バックアップの暗号化がサポートされています。このサポートは、次の条件を満たすと自動的に有効になります。

このプライバシー対策を有効にすると、ユーザーのデバイスで作成されたバックアップからデータを復元する際に、デバイスの PIN、パターン、パスワードが必要になります。この機能の背後にあるテクノロジーの詳細については、Google Cloud Key Vault Service のホワイトペーパーをご覧ください。

バックアップに必要なデバイスの条件を定義する

アプリデータに機密情報や設定が含まれている場合、Android 9 では、クライアントサイドの暗号化が有効になっている場合や、ローカルのデバイス間転送が行われている場合など、アプリのデータがユーザーのバックアップに含まれるデバイスの条件を定義できます。

Android デバイスのデータのバックアップについて詳しくは、データのバックアップの概要をご覧ください。

ユーザー補助

Android 9 では、アプリのユーザーにさらに優れたエクスペリエンスを提供しやすくするアクセシビリティ フレームワークの機能強化が導入されています。

ナビゲーションのセマンティクス

Android 9 で追加された属性により、ユーザー補助サービス(特にスクリーン リーダー)が画面のある部分から別の部分に移動する方法を簡単に定義できるようになりました。これらの属性は、視覚障がいのあるユーザーがアプリの UI 内のテキストをすばやく移動して選択できるようにするのに役立ちます。

たとえば、ショッピング アプリでは、スクリーン リーダーは、あるカテゴリのセールから次のカテゴリのセールに直接移動するのをユーザーが手助けできます。スクリーン リーダーは、次のカテゴリに移動する前に、カテゴリ内のすべてのアイテムを読み上げる必要はありません。

ユーザー補助ペインのタイトル

Android 8.1(API レベル 27)以前では、アクティビティが 1 つのフラグメントを別のフラグメントに置き換える場合など、画面の特定のペインが更新されたタイミングをユーザー補助機能サービスが常に判断できるとは限りません。ペインは、通常はフラグメントを構成する、論理的にグループ化され、視覚的に関連する UI 要素で構成されます。

Android 9 では、これらのペインにユーザー補助ペインのタイトル、または個別に識別可能なタイトルを指定できます。ペインにユーザー補助ペインのタイトルがある場合、ペインが変更されると、ユーザー補助サービスはより詳細な情報を受け取ります。この機能により、サービスは UI の変更内容について、より詳細な情報をユーザーに提供できます。

ペインのタイトルを指定するには、android:accessibilityPaneTitle 属性を使用します。setAccessibilityPaneTitle() を使用して、実行時に置き換えられる UI ペインのタイトルを更新することもできます。たとえば、Fragment オブジェクトのコンテンツ領域のタイトルを指定できます。

見出しベースのナビゲーション

アプリに論理見出しを含むテキスト コンテンツが表示される場合は、それらの見出しを表す View のインスタンスの android:accessibilityHeading 属性を true に設定します。見出しを追加することで、ユーザー補助サービスがユーザーを見出しから見出しへと直接移動できるようになります。ユーザー補助サービスは、この機能を使用してユーザーの UI ナビゲーション エクスペリエンスを改善できます。

グループのナビゲーションと出力

スクリーン リーダーは従来、android:focusable 属性を使用して、ViewGroup または View オブジェクトのコレクションを単一の単位として読み上げるタイミングを判断していました。これにより、ユーザーはビューが論理的に関連していることを理解できます。

Android 8.1 以前では、ViewGroup 内の各 View オブジェクトをフォーカス不可としてマークし、ViewGroup 自体をフォーカス可能としてマークする必要があります。この配置により、View の一部のインスタンスが、キーボード ナビゲーションが煩雑になるような方法でフォーカス可能としてマークされていました。

Android 9 以降では、View オブジェクトをフォーカス可能にすると望ましくない結果になる場合に、android:focusable 属性の代わりに android:screenReaderFocusable 属性を使用できます。スクリーン リーダーは、android:screenReaderFocusable または android:focusable を true に設定したすべての要素にフォーカスを当てます。

便利な操作

Android 9 では、ユーザーに代わって便利なアクションを実行するためのサポートが追加されています。

ツールチップの操作
ユーザー補助フレームワークに追加された機能により、アプリの UI でツールチップにアクセスできるようになります。getTooltipText() を使用してツールチップのテキストを読み取り、ACTION_SHOW_TOOLTIP と ACTION_HIDE_TOOLTIP を使用して View のインスタンスにツールチップの表示 / 非表示を指示します。
グローバル アクションを追加
Android 9 では、AccessibilityService クラスに 2 つのデバイス アクションのサポートが追加されています。サービスは、それぞれ GLOBAL_ACTION_LOCK_SCREEN アクションと GLOBAL_ACTION_TAKE_SCREENSHOT アクションを使用して、デバイスのロックとスクリーンショットの撮影をユーザーが実行できるようにします。

ウィンドウ変更の詳細

Android 9 では、アプリが複数のウィンドウを同時に再描画するときに、アプリのウィンドウの更新を簡単に追跡できます。TYPE_WINDOWS_CHANGED イベントが発生した場合は、getWindowChanges() API を使用して、ウィンドウがどのように変化したかを判断します。マルチウィンドウの更新中、各ウィンドウは独自のイベントセットを生成します。getSource() メソッドは、各イベントに関連付けられたウィンドウのルートビューを返します。

アプリが View オブジェクトのユーザー補助ペインのタイトルを定義している場合、アプリの UI が更新されたときにサービスが認識できます。TYPE_WINDOW_STATE_CHANGED イベントが発生したら、getContentChangeTypes() が返す型を使用して、ウィンドウがどのように変化したかを判断します。たとえば、フレームワークは、ペインに新しいタイトルが設定されたときや、ペインが消えたときを検出できます。

回転

意図しない回転を防ぐため、デバイスの向きが変わっても現在の向きを固定するモードが追加されました。ユーザーは必要に応じてシステムバーのボタンを押すことで、手動で回転させることができます。

ほとんどの場合、アプリの互換性への影響は最小限です。ただし、アプリにカスタマイズされた回転動作がある場合や、通常とは異なる画面の向きの設定を使用している場合は、ユーザーの回転設定が常に縦向きに設定されていた以前には気づかなかった問題が発生する可能性があります。アプリのすべてのキー アクティビティで回転の動作を確認し、画面の向きの設定がすべて最適なエクスペリエンスを提供していることを確認することをおすすめします。

詳しくは、関連する動作の変更点をご覧ください。

新しい回転モードを示す回転するモバイル。ユーザーが手動で回転をトリガーできる

新しい回転モードでは、ユーザーは必要に応じてシステムバーのボタンを使用して手動で回転させることができます。

テキスト

Android 9 では、テキスト関連の次の機能がプラットフォームに導入されています。

  • 事前計算されたテキスト: PrecomputedText クラスを使用すると、必要な情報を事前に計算してキャッシュに保存できるため、テキスト レンダリングのパフォーマンスが向上します。また、アプリがメインスレッド以外でテキスト レイアウトを実行することも可能になります。

  • 拡大鏡: Magnifier クラスは、拡大鏡 API を提供するプラットフォーム ウィジェットで、すべてのアプリで一貫した拡大鏡機能のエクスペリエンスを実現します。

  • スマート リンク化: Android 9 では、TextClassifier クラスが強化されています。このクラスは、機械学習を活用して、選択したテキスト内のエンティティを識別し、アクションを提案します。たとえば、TextClassifier を使用すると、ユーザーが電話番号を選択したことをアプリで検出できます。アプリは、その番号を使用して電話をかけるようユーザーに提案できます。TextClassifier の機能は、Linkify クラスの機能を置き換えます。

  • テキスト レイアウト: 複数の便利なメソッドと属性により、UI デザインの実装が容易になります。詳細については、TextView のリファレンス ドキュメントをご覧ください。

DEX ファイルの ART 事前変換

Android 9 以降を搭載するデバイスでは、Android ランタイム(ART)の事前コンパイラが、アプリ パッケージ内の DEX ファイルをよりコンパクトな表現に変換することで、圧縮された Dalvik Executable 形式(DEX)ファイルをさらに最適化します。この変更により、アプリの起動が速くなり、ディスク容量と RAM の消費量が少なくなります。

この改善は、ディスク I/O 速度が遅いローエンド デバイスで特に効果を発揮します。

デバイス上のシステム トレース

Android 9 では、デバイスからシステム トレースを記録し、その記録のレポートを開発チームと共有できます。このレポートは、HTML などの複数の形式に対応しています。

これらのトレースを収集することで、アプリのプロセスとスレッドに関連するタイミング データを取得し、他の種類のグローバルに重要なデバイスの状態を表示できます。

このツールの詳細については、オンデバイス システム トレースを実行するをご覧ください。