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 台以上の物理カメラから同時にストリームにアクセスできます。デュアル フロント カメラまたはデュアル バック カメラを搭載したデバイスでは、シームレスなズーム、ボケ、ステレオ ビジョンなど、単一のカメラでは実現できない革新的な機能を作成できます。この 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 には、ハイ ダイナミック レンジ(HDR)VP9 プロファイル 2 のネイティブ サポートが追加されています。YouTube や Google Play ムービーなどの HDR 対応動画を、HDR 対応デバイスで視聴できます。

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

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

Android 9 では、指標、HDCP レベル、セキュリティ レベル、セッション数を取得し、セキュリティ レベルとセキュア ストップをより詳細に制御するためのメソッドが MediaDRM クラスに導入されています。詳しくは、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 でのデバイス上の機械学習を高速化するために 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 以降がインストールされたサポート対象のデバイスでは、ハードウェア セキュリティ モジュール内にある KeyMint(以前の Keymaster)HAL の実装である StrongBox KeyMint(以前の Keymaster)を使用できます。このモジュールには次のものが含まれています。

  • 独自の 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 デバイスは、トリプル データ暗号化アルゴリズム(Triple 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 などの複数の形式に対応しています。

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

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