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 デモアプリで使用中の Wi-Fi 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 など、会話に参加しているユーザーを識別するために使用されます。他の多くの API(addMessage() など)では、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 には、視覚的な中断を抑制するために使用できる、新しい Do-Not-Disturb 定数が 7 つあります。

マルチカメラのサポートとカメラの更新

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

カメラのその他の改善点としては、最初のキャプチャ中の遅延を短縮するための追加のセッション パラメータや、カメラ クライアントがカメラ ストリーミングを停止、開始することなく、さまざまなユースケースを処理できるサーフェス共有などがあります。ディスプレイ ベースのフラッシュ サポートと、アプリレベルの手ぶれ補正と特殊効果のための OIS タイムスタンプへのアクセスのための API も追加しました。

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

Android 9 では、対応デバイスで外部 USB/UVC カメラもサポートされます。

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

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

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

画像のプロパティはさまざまな方法で設定できます。

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

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

アニメーション

Android 9 には、GIF と WebP のアニメーション画像を描画して表示するための AnimatedImageDrawable クラスが導入されています。レンダリング スレッドが AnimatedImageDrawable のアニメーションを駆動するという点で、AnimatedImageDrawableAnimatedVectorDrawable と同様に動作します。また、レンダリング スレッドはワーカー スレッドを使用してデコードし、デコードがレンダリング スレッドの他のオペレーションを妨げないようにします。この実装により、アプリは、画像の更新を管理したり、アプリの 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 画像圧縮、Media API

Android 9 には、ハイ ダイナミック レンジ(HDR)VP9 プロファイル 2 のサポートが組み込まれているため、HDR 対応デバイスの YouTube や Play ムービーなどのソースから HDR 対応の映画をユーザーに配信できます。

また、Android 9 には、高効率画像ファイル形式(HEIF または HEIC)を使用した画像のエンコードのサポートが追加されています。これにより、圧縮が改善され、保存容量とネットワーク データの使用量を削減できます。HEIF 静止画像サンプルは、MediaMuxer クラスと MediaExtractor クラスでサポートされています。Android 9 デバイスではプラットフォームがサポートされているため、バックエンド サーバーから HEIF イメージを簡単に送信して利用できます。アプリがこのデータ形式と共有および表示に関して互換性があることを確認したら、アプリの画像保存形式として HEIF を試してください。ImageDecoder または BitmapFactory(JPEG ファイルからビットマップを取得する)を使用して、JPEG から HIC への変換を行うことができます。その後、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 は、見出しのプリフェッチなど、プリフェッチ ジョブを実行してユーザー エクスペリエンスを改善できます。

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

Neural Networks API 1.1

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

既知の問題: ANEURALNETWORKS_TENSOR_QUANT8_ASYMM テンソルを ANEURALNETWORKS_PAD 演算(Android 9 以降で利用可能)に渡すと、NNAPI からの出力が、ハイレベルの機械学習フレームワーク(TensorFlow Lite など)からの出力と一致しないことがあります。問題が解決するまで、代わりに ANEURALNETWORKS_TENSOR_FLOAT32 のみを渡すようにしてください。

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

自動入力フレームワーク

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

セキュリティの機能強化

Android 9 には、以降のセクションで説明するような多くのセキュリティ機能が導入されています。

Android Protected の確認

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

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

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

Android Protected の確認のサポートを追加する方法については、Android Protected の確認のガイドをご覧ください。

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

Android 9 では、アプリに代わって生体認証ダイアログが提供されます。この機能により、ダイアログの標準化された外観、配置が実現されるため、ユーザーは信頼できる生体認証情報チェッカーに対する認証を自信を持って行うことができます。

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

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

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

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

システムは、StrongBox Keymaster に格納されている鍵を確認するときに、高信頼実行環境(TEE)による鍵の整合性を裏付けます。

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

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

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

詳しくは、暗号化された鍵を安全にインポートする方法をご覧ください。

鍵のローテーションを使用した APK 署名スキーム

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

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

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

Android 9 では、unlockedDeviceRequired フラグが導入されています。このオプションは、指定した鍵を使用して処理中のデータまたは保存されているデータの復号を許可する前に、キーストアで画面をロック解除する必要があるかどうかを決定します。これらのタイプの鍵は、健康データやエンタープライズ データなどの機密データを暗号化してディスクに保存する場合に適しています。このフラグを使用すると、デバイスがロックされている間は、スマートフォンの紛失や盗難があった場合にデータを復号できないという高い安心感を得ることができます。

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

従来の暗号化のサポート

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

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

WPS のサポート終了

Wi-Fi Protected Setup(WPS)はセキュリティ上の理由によりサポートを終了しました。

Android のバックアップ

Android 9 には、バックアップと復元に関連する新しい機能と開発者向けオプションが追加されています。これらの変更の詳細については、次のセクションで説明します。

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

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

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

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

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

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

ユーザー補助

Android 9 では、ユーザー補助フレームワークの機能強化により、アプリのユーザー エクスペリエンスをさらに容易に高めることができます。

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

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

たとえば、ショッピング アプリでは、スクリーン リーダーを使用して、あるお買い得品のカテゴリから次のカテゴリに直接移動できます。スクリーン リーダーは、次のカテゴリに移動する前にカテゴリ内のすべてのアイテムを読み上げる必要はありません。

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

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

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

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

見出しに基づくナビゲーション

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

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

従来、スクリーン リーダーは android:focusable 属性を使用して、ViewGroupView オブジェクトのコレクション)を 1 つのユニットとして読み取るタイミングを判断していました。そうすることで、ビューが互いに論理的に関連していることをユーザーが把握できました。

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

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

コンビニエンス アクション

Android 9 には、ユーザーの代わりに便利な操作を行うためのサポートが追加されています。

ツールチップの操作
ユーザー補助フレームワークに追加された機能により、アプリの UI のツールチップを利用できるようになります。ツールチップのテキストを読み上げるには getTooltipText() を使用し、ツールチップを表示または非表示にするように View のインスタンスに指示するには、ACTION_SHOW_TOOLTIPACTION_HIDE_TOOLTIP を使用します。
追加されたグローバル アクション
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 を提供するプラットフォーム ウィジェットであり、すべてのアプリで一貫した拡大鏡機能を実現します。

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

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

ART による DEX ファイルの事前変換

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

この改善は、特にディスク I/O 速度の遅いローエンド デバイスにメリットをもたらします。

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

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

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

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