機能と API の概要

Android 11 では、優れた新機能や API がデベロッパー向けに導入されています。下記のセクションで、アプリ向けの機能について確認し、関連する API を使ってみることができます。

新しい API、変更された API、削除された API の一覧については、API 差分レポートをご覧ください。新しい API の詳細については、Android API リファレンスをご覧ください。新しい API がハイライト表示されています。さらに、プラットフォームの変更がアプリに及ぼす影響について、Android 11 の動作変更に関するページ(Android R をターゲットとするアプリ向けすべてのアプリ向け)、およびプライバシーの変更に関するページもご確認ください。

新しいユーザー エクスペリエンス

デバイス コントロール

Android 11 には、接続されている外部デバイスのコントロールを表示させる、新しい ControlsProviderService API が用意されています。このコントロールは、Android の電源ボタンメニューの [デバイス コントロール] に表示されます。詳しくは、外部デバイスを制御するをご覧ください。

メディア コントロール

Android 11 では、メディア コントロールの表示方法が更新されています。メディア コントロールはクイック設定の近くに表示されます。複数のアプリからのセッションはスワイプ可能なカルーセルに配列されます。これには、スマートフォン、リモート ストリームでローカルに再生されるストリームが含まれます。外部デバイスやキャスト セッションで検出されたストリームや、以前の再開可能なセッションが、最後に再生された順序で配列されます。

ユーザーは、アプリを起動しなくてもカルーセルから以前のセッションを再開できます。再生が開始されると、ユーザーは通常の方法でメディア コントロールを操作できます。

詳しくは、メディア コントロールをご覧ください。

画面

ウォーターフォール表示のサポートの強化

Android 11 には、「ウォーターフォール表示」をサポートする複数の API が用意されています。この表示は、デバイスの端を回り込むように表示するものです。これは、ディスプレイ カットアウトのある表示の変形として扱われます。既存の DisplayCutout.getSafeInset…() メソッドが、カットアウトだけでなくウォーターフォール領域も避けて、表示可能なインセットを返すようになりました。アプリのコンテンツをウォーターフォール領域にレンダリングするには、以下のようにします。

  • DisplayCutout.getWaterfallInsets() を呼び出して、ウォーターフォール インセットの正確なサイズを取得します。

  • ウィンドウ レイアウト属性 layoutInDisplayCutoutModeLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS に設定すると、カットアウトとウォーターフォール領域を含めて画面のすべての端までウィンドウを拡張できるようになります。カットアウトとウォーターフォール領域には、重要なコンテンツを表示しないようにしてください。

ヒンジ角度センサーと折りたたみ式

Android 11 では、ヒンジベースの画面構成を持つデバイス上でアプリが稼働できるようになります。ヒンジの角度を判断するために、TYPE_HINGE_ANGLE を持つ新しいセンサーと、ヒンジの角度を監視してデバイスの 2 つの面の角度の測定値を知らせる新しい SensorEvent が提供されます。この未加工の測定値を使用すると、ユーザーがデバイスを操作するときに細かいアニメーションを実行できます。

折りたたみ式をご覧ください。

会話

会話の改善

Android 11 では、「会話」の処理方法がさまざまな点で改善されています。会話は、2 人以上の間で行われるリアルタイムの双方向通信です。こうした会話には特別な表示方法が提供され、それを操作する複数の新しいオプションがユーザーに提供されます。

会話の詳細と、アプリが会話をサポートする方法について詳しくは、会話をご覧ください。

チャットバブル

バブルをデベロッパーが利用できるようになり、システム全体で会話を表示できます。バブルは Android 10 では試験運用機能であり、開発者向けオプションで有効にするものでしたが、Android 11 ではその必要はなくなりました。

アプリが Android 11(API レベル 30)以降をターゲットとしている場合、新しい会話の要件を満たさない限り、その通知はバブルとして表示されません。具体的には、通知をショートカットに関連付ける必要があります。

Android 11 より前のバージョンの場合、通知をバブルにするには、通知が常にドキュメント UI モードで起動するように設定されていることを明示する必要がありました。Android 11 以降は、この設定を明示する必要はありません。通知をバブルにしている場合、プラットフォームで自動的に、常にドキュメント UI モードで起動するように通知が設定されます。

バブルのパフォーマンスに関していくつか改善が行われ、ユーザーが各アプリからバブルを柔軟に有効または無効にできるようになりました。試験運用版でサポートを実装していた場合、Android 11 では API が少し変更されています。

5G ビジュアル インジケーター

ユーザーのデバイスに 5G インジケーターを表示する方法については、5G 利用時にユーザーに知らせるをご覧ください。

プライバシー

Android 11 では、ユーザーのプライバシー保護を強化するための多くの変更や制限が導入されています。詳細については、プライバシーに関するページをご覧ください。

セキュリティ

生体認証の更新

Android 11 では、アプリデータのセキュリティ レベルを管理できるように、以下のように、生体認証が改善されています。これらの変更点は Jetpack Biometric ライブラリにも表示されます。

認証の種類

Android 11 では BiometricManager.Authenticators インターフェースが導入されており、アプリがサポートする認証の種類を宣言できます。

使用された認証の種類を判断する

ユーザー認証の後、getAuthenticationType() を呼び出すと、認証されたユーザーがデバイスの認証情報と生体認証情報のどちらを使用したかを確認できます。

利用ごとの認証キーに対するサポートの追加

Android 11 では、利用ごとの認証キーを使用した認証に対するサポートが強化されています。

サポート終了のメソッド

Android 11 では、以下のメソッドのサポートが終了します。

  • setDeviceCredentialAllowed() メソッド。
  • setUserAuthenticationValidityDurationSeconds() メソッド。
  • 引数のない canAuthenticate() のオーバーロードされたバージョン。

大規模なデータセットの安全な共有

機械学習やメディア再生が関係するような状況では、1 つの大規模データセットをアプリが別のアプリと共有したい場合があります。Android の以前のバージョンでは、同じデータセットのコピーを各アプリが個別にダウンロードする必要がありました。

Android 11 では、ネットワーク上とディスク上の両方でデータの冗長性を軽減するために、「共有データ blob」を使ってデバイス上でこうした大規模なデータセットをキャッシュに保存できます。共有データセットについて詳しくは、大規模データセットの共有に関する詳細なガイドをご覧ください。

ユーザーの認証情報なしで OTA で再起動した後にファイルベースの暗号化を行う

デバイスが OTA アップデートを完了して再起動すると、認証情報で保護されたストレージ内にある、認証情報で暗号化された(CE)鍵は、ファイルベースの暗号化(FBE)操作にすぐに使用できます。つまり OTA アップデートの後、アプリはユーザーが PIN、パターン、またはパスワードを入力する前に、CE 鍵を必要とする処理を再開できます。

パフォーマンスと品質

ワイヤレス デバッグ

Android 11 では、ワークステーションから Android Debug Bridge(adb)を介したワイヤレスでのアプリのデプロイとデバッグをサポートしています。たとえば、USB 経由でデバイスを物理的に接続することなく、ドライバのインストールなどの USB 接続に一般的な問題に対処しなくても、デバッグ可能なアプリを複数のリモート デバイスにデプロイできます。詳細については、ハードウェア デバイス上でのアプリの実行をご覧ください。

adb 増分 APK インストール

アプリへの変更がわずかな場合でも、デバイスに大きな(2 GB 以上の)APK をインストールすると時間がかかることがあります。adb(Android Debug Bridge)の増分 APK インストールを行うと、アプリの起動に必要なだけの APK をインストールし、残りのデータをバックグラウンドでストリーミングすることで、このプロセスを早めることができます。この機能がデバイスでサポートされていて、最新の SDK Platform-Tools がインストールされている場合、adb install は自動的にこの機能を使用します。サポートされていない場合、デフォルトのインストール方法が自動的に使用されます。

この機能を使用するには、次の adb コマンドを実行します。デバイスが増分インストールをサポートしていない場合、コマンドは失敗し、詳細な説明が出力されます。

adb install --incremental

adb 増分 APK インストールを実行する前に、APK に署名して、APK 署名スキーム v4 ファイルを作成する必要があります。この機能が動作するには、v4 署名ファイルを APK の次に配置する必要があります。

ネイティブ メモリ アロケータを使用したエラー検出

GWP-ASan はネイティブ メモリ割り当て機能であり、解放後の使用のバグと、ヒープバッファ オーバーフローのバグを見つけられるようにします。この機能はグローバルに有効にすることも、アプリの特定のサブプロセスに対して有効にすることもできます。詳細については、GWP-ASan ガイドをご覧ください。

Neural Networks API 1.3

Android 11 では Neural Networks API(NNAPI)が拡張、改善されています。

新しいオペレーション

NNAPI 1.3 では新しいオペランド タイプ TENSOR_QUANT8_ASYMM_SIGNED が導入され、TensorFlow Lite の新しい量子化スキームがサポートされています。

さらに、NNAPI 1.3 では以下の新しいオペレーションも導入されています。

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

新しい ML コントロール

NNAPI 1.3 には、機械学習(ML)をスムーズに行うための新しいコントロールが導入されています。

NDK Thermal API

デバイスが熱くなると、CPU や GPU がスロットルされ、アプリも予想外の影響を受けることがあります。複雑なグラフィック、大量の計算、または持続的なネットワーク アクティビティが組み込まれているアプリやゲームでは、問題が発生する可能性が高くなります。

Android 11 では NDK Thermal API を使用してデバイスの温度変化を監視することで、デバイスの消費電力を抑え、デバイスの温度を下げる対策を講じることができます。この API は Java Thermal API に似ています。これを使って、温度ステータスの変化に関する通知を受信したり、現在のステータスを直接ポーリングしたりできます。

テキストと入力

IME の遷移の改善

Android 11 では、画面キーボードなどのインプット メソッド エディタ(IME)の遷移を改善する新しい API が導入されました。これらの API を使用すると、IME の表示と非表示や、ステータスバー、ナビゲーション バーなどの要素と同期させて、アプリのコンテンツを調整することが簡単になります。

EditText にフォーカスがあるときに IME を表示するには、view.getInsetsController().show(Type.ime()) を呼び出します(このメソッドは、フォーカスされている EditText と同じ階層の任意のビューで呼び出すことが可能で、EditText で呼び出す必要は特にありません)。IME を非表示にするには、view.getInsetsController().hide(Type.ime()) を呼び出します。IME が現在表示されているかどうかを確認するには、view.getRootWindowInsets().isVisible(Type.ime()) を呼び出します。

アプリのビューを IME の表示と非表示に同期させるには、WindowInsetsAnimation.CallbackView.setWindowInsetsAnimationCallback() に指定することでビューのリスナーを設定します(このリスナーはどのビューでも設定可能で、EditText に設定する必要は特にありません)。IME はリスナーの onPrepare() メソッドを呼び出してから、遷移の開始時に onStart() を呼び出します。次に、遷移が進むたびに、onProgress() を呼び出します。遷移が完了すると、IME は onEnd() を呼び出します。遷移のどの時点でも、WindowInsetsAnimation.getFraction() を呼び出すことで遷移の進行状況を確認できます。

これらの API の使用例については、新しい WindowInsetsAnimation のコードサンプルをご覧ください。

IME アニメーションの制御

IME アニメーションや、ナビゲーション バーのような別のシステムバーのアニメーションを制御することもできます。そのためには、まず setOnApplyWindowInsetsListener() を呼び出して、ウィンドウ インセットの変更に対する新しいリスナーを設定します。

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

Java

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

IME またはその他のシステムバーを移動するには、コントローラの controlWindowInsetsAnimation() メソッドを呼び出します。

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

ICU ライブラリの更新

Android 11 では android.icu パッケージを更新して、ICU ライブラリのバージョン 66 を使用します。Android 10 ではバージョン 63 でした。このライブラリの新しいバージョンでは、CLDR ロケールデータが更新され、Android での国際化をサポートする拡張機能が複数追加されています。

ライブラリの新しいバージョンの主な変更点は以下のとおりです。

  • 書式設定 API の多くは、FormattedValue を拡張した新しい種類の戻りオブジェクトをサポートするようになりました。
  • LocaleMatcher API が拡張されて、ビルダークラス、java.util.Locale タイプのサポート、マッチングに関する追加データを示す結果クラスが追加されました。
  • Unicode 13 がサポートされるようになりました。

メディア

MediaCodec バッファの割り当て

Android 11 には、入出力バッファを割り当てる際のアプリの制御を強化できる新しい MediaCodec API が追加されました。これにより、アプリでのメモリ管理の効率を上げることができます。

新しいクラス:
新しいメソッド:

さらに、MediaCodec.Callback() で 2 つのメソッドの動作が変更されました。

onInputBufferAvailable()
Block Model API を使用するように設定されている場合、インデックスを指定して MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer() を呼び出す代わりに、アプリはそのインデックスを指定して MediaCodec.getQueueRequest を使用し、LinearBlock / HardwareBuffer をスロットにアタッチする必要があります。
onOutputBufferAvailable()
アプリでインデックスを指定して MediaCodec.getOutputBuffer() を呼び出す代わりに、そのインデックスを指定して MediaCodec.getOutputFrame() を呼び出すことで OutputFrame オブジェクトと詳細、および LinearBlock / HardwareBuffer バッファを取得することもできます。

MediaCodec での低レイテンシのデコード

Android 11 では MediaCodec を拡張して、ゲームなどのリアルタイム アプリに対して、低レイテンシのデコードをサポートしています。コーデックが低レイテンシのデコードに対応しているかどうかは、FEATURE_LowLatencyMediaCodecInfo.CodecCapabilities.isFeatureSupported() に渡して確認できます。

低レイテンシのデコードをオンまたはオフにするには、次のいずれかを行います。

新しい AAudio 関数 AAudioStream_release()

関数 AAudioStream_close() は音声ストリームのリリースとクローズを同時に行います。これは危険な場合があります。クローズされたストリームに別のプロセスがアクセスしようとすると、そのプロセスはクラッシュします。

新しい関数 AAudioStream_release() はストリームをリリースしますが、クローズはしません。これによりリソースが解放され、ストリームは既知の状態のままになります。AAudioStream_close() を呼び出すまでオブジェクトは保持されます。

MediaParser API

MediaParser は、メディア抽出用の新しい低レベル API です。MediaExtractor よりも柔軟性があり、メディア抽出機能を詳細に制御できます。

USB デバイスからの音声キャプチャ

RECORD_AUDIO 権限のないアプリが、UsbManager を使用して、音声キャプチャ機能を持つ USB オーディオ機器(USB ヘッドセットなど)へのアクセスをリクエストすると、その機器の使用許可を確認するよう求める警告メッセージがユーザーに表示されます。システムは「常に使用する」オプションを無視するので、アプリがアクセスをリクエストするたびに、ユーザーは警告を確認して権限を付与する必要があります。

この動作を回避するため、アプリで RECORD_AUDIO 権限をリクエストしてください。

マイクへの同時アクセス

Android 11 では新しいメソッドが AudioRecord API、MediaRecorder API、AAudioStream API に追加されています。これらのメソッドは、選択したユースケースに関係なく、同時にキャプチャする機能を有効または無効にします。音声入力の共有をご覧ください。

出力の切り替え

Android 11 では、Cast API と MediaRouter API を使用するアプリについて、新しい動作が実装されています。

アプリ内からキャスト機能を利用するオプションに加えて、切り替えオプションもシステム メディア プレーヤーに表示されます。これによりユーザーは、スマートフォンで視聴していた動画をキッチンで見続けたり、自宅でも車内でもオーディオを聞いたりなど、視聴形態を変えながらデバイスをシームレスに切り替えることが可能になります。出力の切り替えをご覧ください。

接続

Wi-Fi Passpoint の強化

Android 11 で追加された Passpoint 機能については、Passpoint をご覧ください。

Wi-Fi Suggestion API の拡張

Android 11 では Wi-Fi Suggestion API が拡張され、以下のように、アプリのネットワーク管理機能が強化されています。

  • 接続管理アプリは、接続解除リクエストを許可することで自分のネットワークを管理できます。
  • Passpoint ネットワークは Suggestion API に統合され、ユーザーに候補として提示されることがあります。
  • Analytics API を使用して、ネットワークの品質に関する情報を取得できます。

CallScreeningService の更新

Android 11 以降、CallScreeningService は着信の STIR/SHAKEN 確認ステータス(verstat)に関する情報をリクエストできます。この情報は着信の通話の詳細の一部として提供されます。

CallScreeningServiceREAD_CONTACTS 権限を持つ場合、ユーザーの連絡先に含まれる番号に対して着信または発信があったときにアプリに通知があります。

詳細については、発信者番号のなりすましを防止するをご覧ください。

Open Mobile API の更新

Android 11 以降での OMAPI のサポートについては、Open Mobile API リーダーのサポートをご覧ください。

パフォーマンスに優れた VPN

API レベル 30 以上をターゲットとするアプリや、API レベル 29 以上で起動するデバイス上のアプリでは、ユーザー設定の VPN でも、アプリベースの VPN でも IKEv2/IPsec を適用できます。

VPN はオペレーティング システム ネイティブとして実行され、アプリ内で IKEv2/IPsec VPN 接続を確立するのに必要なコードが簡素化されます。

プロセスごとのネットワーク アクセス制御

プロセスごとにネットワーク アクセスを有効にする方法については、ネットワーク使用量の管理をご覧ください。

同じ FQDN を使って複数の Passpoint 設定をインストールできる

Android 11 以降では、PasspointConfiguration.getUniqueId() を使って PasspointConfiguration オブジェクトの一意の識別子を取得できます。それにより、アプリのユーザーが同じ完全修飾ドメイン名(FQDN)を使って複数のプロファイルをインストールできるようになります。

この機能は、携帯通信会社がモバイル カントリー コード(MCC)とモバイル ネットワーク コード(MNC)の複数の組み合わせをネットワーク上にデプロイし、FQDN は 1 つしかない場合に便利です。Android 11 以上では、ユーザーが MCC または MNC を使用して SIM をインストールする場合、ネットワークに一致する、ホーム プロバイダと同じ FQDN を持つ複数のプロファイルをインストールできます。

GNSS アンテナのサポート

Android 11 では GnssAntennaInfo クラスが導入されます。このクラスは、全球測位衛星システム(GNSS)が提供できるセンチメートル精度の位置情報をアプリがさらに活用できるようにします。

詳しくは、アンテナ較正情報に関するガイドをご覧ください。

グラフィック

NDK 画像デコーダー

NDK の ImageDecoder API は、画像を直接デコードするための Android C / C++ アプリ用標準 API を提供します。アプリ デベロッパーは、JNI を介してフレームワーク API を使用したり、サードパーティ製の画像デコード ライブラリをバンドルしたりする必要がなくなります。詳細については、画像デコーダー デベロッパー ガイドをご覧ください。

Frame rate API

Android 11 では、アプリが想定するフレームレートをシステムに通知できる API が追加され、複数のリフレッシュ レートをサポートするデバイスで表示がガタつくのを減らすことができます。この API の使用方法については、フレームレートのガイドをご覧ください。

低レイテンシのサポートでのリクエストと確認

一部のディスプレイでは、外部ディスプレイやテレビなどのグラフィックを後処理することがあります。この後処理はグラフィックを改善しますが、レイテンシが増大することがあります。HDMI 2.1 に対応している新型ディスプレイには、「自動低レイテンシ モード」(ALLM、「ゲームモード」とも呼ばれる)があり、この後処理をオフに切り替えることでレイテンシが最小限に抑えられます。ALLM について詳しくは、HDMI 2.1 仕様をご覧ください。

ウィンドウから、可能であれば、自動低レイテンシ モードを使用するようにリクエストできます。ALLM はゲームやビデオ会議など、可能な限り最高のグラフィックを提供するよりも、低レイテンシのほうが重要なアプリで特に有効です。

後処理の最小化をオンまたはオフに切り替えるには、Window.setPreferMinimalPostProcessing() を呼び出すか、またはウィンドウの preferMinimalPostProcessing 属性を true に設定します。すべてのディスプレイが後処理の最小化に対応しているわけではありません。特定のディスプレイが対応しているかどうかを調べるには、新しいメソッド Display.isMinimalPostProcessingSupported() を呼び出します。

パフォーマンスに優れたグラフィックのデバッグレイヤの挿入

アプリは、外部グラフィック レイヤ(GLESVulkan)をネイティブ アプリのコードに読み込めるようになりました。デバッグ可能なアプリと同じ機能を公開できますが、パフォーマンスのオーバーヘッドは発生しません。この機能は、GAPID のようなツールでアプリをプロファイリングする場合に特に重要です。アプリをプロファイリングするには、アプリをデバッグ可能にする代わりに、アプリ マニフェスト ファイルに次のメタデータ要素を含めてください。

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

画像とカメラ

アクティブな撮影中に通知音とバイブレーションをミュートする

Android 11 以降、カメラをアクティブに使用する際、アプリで setCameraAudioRestriction() を使用して、バイブレーションだけ、または音とバイブレーションの両方をミュートするか、どちらもミュートしないように設定できます。

Android Emulator でのカメラサポートの拡張

Android 11 以降のエミュレータでのカメラに対する拡張サポートについては、カメラのサポートをご覧ください。

複数のカメラを同時に使用するためのサポート

Android 11 には、前面カメラと背面カメラの両方など、複数のカメラを一度に使用できるかどうかを問い合わせる API が追加されています。

アプリを実行中のデバイスでそのサポートを確認するには、以下のメソッドを使用します。

  • getConcurrentCameraIds(): 同じアプリプロセスで設定されたときに、保証されるストリームの組み合わせで同時にストリーミングできるカメラ ID の組み合わせの Set を返します。
  • isConcurrentSessionConfigurationSupported(): 複数のカメラデバイスが同時に、対応するセッション設定をサポートできるかどうかを問い合わせます。

複数フレームが含まれる HEIF 画像のサポートの強化

Android 11 以降、ImageDecoder.decodeDrawable() メソッドを呼び出して、アニメーションやバースト写真など、一連のフレームが含まれる HEIF 画像を渡すと、その画像シーケンス全体が含まれる AnimatedImageDrawable が返されます。Android の以前のバージョンでこのメソッドは、単一フレームの BitmapDrawable を返していました。

同じシーケンス内にない複数のフレームが HEIF グラフィックに含まれる場合、MediaMetadataRetriever.getImageAtIndex() を呼び出して個々のフレームを取得できます。

ユーザー補助

ユーザー補助サービスのデベロッパー向けの更新

ユーザー補助のカスタム サービスを作成する場合、Android 11 では以下の機能を使用できます。

  • ユーザー補助サービスのユーザー向けの説明には、書式なしテキストのほかに HTML と画像も使用できるようになりました。この柔軟さを活用すると、エンドユーザーにサービスの内容とその支援方法について説明しやすくなります。
  • contentDescription より重要な意味を持つ UI 要素の状態の説明を利用するには、getStateDescription() メソッドを呼び出します。
  • タッチイベントがシステムのタッチ探索機能をバイパスするようにリクエストするには、setTouchExplorationPassthroughRegion() を呼び出します。同様に、ジェスチャーがシステムのジェスチャー検出機能をバイパスするようにリクエストするには、setGestureDetectionPassthroughRegion() を呼び出します。
  • 「入力」や「次へ」などの IME 操作のほか、FLAG_SECURE フラグを有効にしないウィンドウのスクリーンショットをリクエストできます。

追加の機能

アプリプロセスの終了の理由

Android 11 では、最近のプロセスの終了についてその理由を報告する ActivityManager.getHistoricalProcessExitReasons() メソッドが導入されています。アプリはこのメソッドを使用して、プロセスの終了が、ANR、メモリの問題、またはその他の理由のどれによるのかなど、クラッシュの診断情報を収集できます。また、新しい setProcessStateSummary() メソッドを使用して、後で分析するために状態に関するカスタム情報を保存できます。

getHistoricalProcessExitReasons() メソッドは、アプリプロセスの終了に関する情報を含む ApplicationExitInfo クラスのインスタンスを返します。このクラスのインスタンスに対して getReason() を呼び出すことで、アプリのプロセスが強制終了した原因を特定できます。たとえば、REASON_CRASH の戻り値は、アプリで未処理の例外が発生したことを示します。終了イベントの一意性を確保する必要があれば、getTimestamp() メソッドからのタイムスタンプに基づくハッシュ値など、アプリ固有の ID をアプリで管理できます。

参考情報

詳しくは、Medium のアプリのプライバシーと安定性を高める Android 11 の新しいツールに関する記事をご覧ください。

リソースローダ

Android 11 には、アプリがリソースの検索方法と読み込み方法を動的に拡張できる新しい API が導入されています。新しい API クラス ResourcesLoaderResourcesProvider がこの新しい機能を主に提供します。これらはともに、追加のリソースやアセットを提供する機能や、既存のリソースやアセットの値を変更する機能を提供します。

ResourcesLoader オブジェクトは ResourcesProvider オブジェクトをアプリの Resources インスタンスに提供するコンテナです。そして ResourcesProvider オブジェクトは、APK とリソースのテーブルからリソースデータを読み込むメソッドを提供します。

この API の主な使用例の 1 つは、カスタム アセットの読み込みです。loadFromDirectory() を使用して、ファイルベースのリソースとアセットの解決をリダイレクトする ResourcesProvider を作成し、アプリケーションの APK ではなく特定のディレクトリを検索できます。これらのアセットへは、AssetManager API クラスからメソッドの open() ファミリーを介してアクセスできます。APK にバンドルされているアセットの場合と同様です。

APK 署名スキーム v4

Android 11 では APK 署名スキーム v4 のサポートが追加されます。このスキームでは、新しい種類の署名が別のファイル(apk-name.apk.idsig)に生成されますが、それ以外は v2、v3 と同様です。APK に変更はありません。このスキームは adb 増分 APK インストールに対応しており、APK のインストールを高速化します。

動的インテント フィルタ

インテントを受け取るには、アプリのマニフェストでインテント フィルタを定義して、アプリが受け取れるデータの種類をコンパイル時に宣言する必要があります。Android 10 以下では、ランタイムにアプリがインテント フィルタを変更する方法はありません。これは、仮想マシンやリモート デスクトップなどの仮想化アプリで問題となります。ユーザーがその中にインストールするソフトウェアを仮想化アプリで正確に把握できないからです。

Android 11 では、新しいマニフェスト要素として MIME グループが導入され、アプリがインテント フィルタ内に MIME タイプの動的セットを宣言し、ランタイムにプログラムでそれを変更できるようになります。MIME グループを使用するには、新しい android:mimeGroup 属性を使って、データ要素をアプリのマニフェストに含めてください。

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

android:mimeGroup 属性の値は、ランタイムに MIME グループを識別する任意の文字列 ID です。MIME グループのコンテンツにアクセスして更新するには、その ID を PackageManager API クラスの以下の新しいメソッドに渡します。

プログラムで MIME グループに追加する MIME タイプは、マニフェストで明示的に宣言された静的 MIME タイプとまったく同じように機能します。

自動入力機能の強化

Android 11 では自動入力サービスが強化されています。

AssistStructure.ViewNode のヒント ID

自動入力サービスでは多くの場合、ビューのプロパティに基づいてビューの署名ハッシュを計算する方法が有効です。ビューのヒントは、署名ハッシュの計算に含めるのに特に適したプロパティですが、ヒントの文字列はスマートフォンのロケールによって変わる場合があります。この問題を解決するため、Android 11 では AssistStructure.ViewNode を拡張し、ビューのヒントのテキスト リソース ID を返す新しい getHintIdEntry() メソッドを追加しました。このメソッドが提供するロケールに依存しない値を、署名ハッシュの計算に使用できます。

データセットが表示されたイベント

Android 11 では、自動入力サービスの候補を改善できるように、自動入力サービスが提示したデータセットをユーザーがどれも選択しなかった場合を識別する方法が提供されています。Android 11 では、FillEventHistory が新しい TYPE_DATASETS_SHOWN イベントタイプを報告します。自動入力サービスがデータセットをユーザーに提示するたびに、FillEventHistory がこのタイプのイベントをログに記録します。自動入力サービスは、これらのイベントと既存の TYPE_DATASET_SELECTED イベントを併用して、自動入力が提供する候補のいずれかをユーザーが選択したかどうかを判断できます。

IME の統合

キーボードや他の IME が、プルダウン メニューではなく、候補領域または類似のインターフェースで自動入力候補をインライン表示できるようになりました。候補はユーザーに表示されますが、パスワードやクレジット カード番号などの機密情報を保護するために、ユーザーが選択するまで IME には伝わりません。IME とパスワード マネージャーでこの機能をサポートする方法については、自動入力をキーボードと統合するをご覧ください。

コンテンツ キャプチャ サービスとのデータ共有

Android 11 以降、アプリはデバイスのコンテンツ キャプチャ サービスとデータを共有できます。この機能を使用するデバイスでは、ユーザーの環境で現在再生中の曲の名前を表示するなど、状況に応じた高度な情報を提供しやすくなります。

アプリのデータをコンテンツ キャプチャ サービスで利用できるようにするには、ContentCaptureManager のインスタンスで shareData() メソッドを呼び出します。システムがデータ共有リクエストを受け入れると、コンテンツ キャプチャ サービスと共有する書き込み専用のファイル記述子がアプリに渡されます。