Android 9 の機能と API

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

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

Wi-Fi RTT による屋内位置測定

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

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

ハードウェア サポートを備えた 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 など、会話に参加しているユーザーを識別するために使用されます。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 つの新しい Do-Not-Disturb 定数も用意されています。

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

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

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

Android 9 では、Multi-Camera APIFULL または 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 を作成します。デフォルト設定を変更するには、OnHeaderDecodedListenerdecodeDrawable() または decodeBitmap() に渡します。画像のデフォルトの幅と高さが判明すると、ImageDecoder はそれを使用して onHeaderDecoded() を呼び出します。エンコードされた画像がアニメーション GIF または WebP の場合、decodeDrawable()AnimatedImageDrawable クラスのインスタンスである Drawable を返します。

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

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

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

アニメーション

Android 9 には、GIF と WebP のアニメーション画像を描画して表示するための AnimatedImageDrawable クラスが導入されています。AnimatedImageDrawable は、レンダリング スレッドが AnimatedImageDrawable のアニメーションを実行するという点で AnimatedVectorDrawable と同様に機能します。また、レンダリング スレッドはワーカー スレッドを使用してデコードし、デコードがレンダリング スレッドの他のオペレーションを妨げないようにします。この実装により、アプリは、更新を管理したり、アプリの 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 Profile 2 が組み込まれているため、HDR 対応デバイスで YouTube や Play ムービーなどのソースから HDR 対応映画をユーザーに配信できます。

Android 9 には、High Efficiency Image File 形式(HEIF または HEIC)を使用した画像のエンコードのサポートが追加されています。これにより、圧縮が改善され、保存容量とネットワーク データの使用量が減少します。HEIF 静止画像サンプルは、MediaMuxer クラスと MediaExtractor クラスでサポートされています。Android 9 デバイスではプラットフォームがサポートされているため、バックエンド サーバーから HEIF イメージを簡単に送信して利用できます。このデータ形式の共有と表示にアプリが対応していることを確認したら、アプリの画像保存形式として HEIF を試してください。JPEG から Heic への変換は、ImageDecoder または BitmapFactory(JPEG ファイルからビットマップを取得する)を使用して実行できます。その後、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 Data Encryption Algorithm(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 ナビゲーション エクスペリエンスを改善できます。

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

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

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

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

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

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

ツールチップの操作
ユーザー補助フレームワークに追加された機能により、アプリの UI 内のツールチップにアクセスできるようになります。getTooltipText() を使用してツールチップのテキストを読み取り、ACTION_SHOW_TOOLTIPACTION_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 を提供するプラットフォーム ウィジェットであり、すべてのアプリで一貫した拡大鏡機能エクスペリエンスを提供します。

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

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

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

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

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

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

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

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

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