機能と API の概要

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

新しい API、変更された API、削除された API の一覧については、API 差分レポートをご覧ください。新しい API について詳しくは、Android API リファレンスをご覧ください。新しい API は、見つけやすいようにハイライト表示されています。また、プラットフォームの変更がアプリに影響する領域については、Android 12 の動作変更(Android 12 をターゲットとするアプリの場合とすべてのアプリの場合)をご確認ください。

新しいエクスペリエンス

ウィジェットの改善

Android 12 では既存の Widgets API が改善され、プラットフォームやランチャーにおけるユーザーとデベロッパーのエクスペリエンスが向上しています。ウィジェットを Android 12 に対応させ、新機能で更新するためのガイドを作成しました。

詳しくは、Android 12 におけるウィジェットの改善をご覧ください。

音声と組み合わせた触覚効果

Android 12 アプリは、スマートフォンのバイブレーションを使用して、オーディオ セッションから得られる触覚フィードバックを生成できます。これは、ゲームとオーディオのエクスペリエンスの没入感を高めるのに役立ちます。たとえば、触覚で強化した着信音を使って発信者を特定したり、自動車操縦ゲームで荒れ地を走る感触をシミュレートしたりすることができます。

詳しくは、HapticGenerator リファレンス ドキュメントをご覧ください。

スプラッシュ画面 API

Android 12 では、起動時のアプリ行きの動き、アプリアイコンを表示するスプラッシュ画面、アプリ本体への移行など、すべてのアプリに新しいアプリ起動アニメーションが導入されました。詳細については、スプラッシュ画面 API をご覧ください。

着信の重要度をランク付けできる新しい着信通知

Android 12 では、通話用の新しい通知スタイル Notification.CallStyle が追加されました。このテンプレートを使用して、ステータスバーに通話時間を示す視認性の高いチップを表示することで、アクティブな通話の重要度を示すことができます。このチップをタップすると通話に戻ります。

着信と進行中の通話がユーザーにとって最も重要であるため、こうした通知はシェード内で最上位にランクされます。このランキングにより、システムがこうした優先度の高い通話を他のデバイスに転送することもできます。

すべての種類の通話に対し、次のコードを実装します。

Kotlin

// Create a new call with the user as caller.
val incoming_caller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

Java

// Create a new call with the user as caller.
Person incoming_caller = new Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build();

forIncomingCall() を使用して、着信の通話スタイル通知を作成します。

Kotlin

// Create a call style notification for an incoming call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller)

Java

// Create a call style notification for an incoming call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller);

forOngoingCall() を使用して、進行中の通話の通話スタイル通知を作成します。

Kotlin

// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller)

Java

// Create a call style notification for an ongoing call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller);

forScreeningCall() を使用して、通話をスクリーニングするための通話スタイル通知を作成します。

Kotlin

// Create a call style notification for screening a call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller)

Java

Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller);

通知の画像サポートの拡充

Android 12 では、MessagingStyle() 通知と BigPictureStyle() 通知にアニメーション画像を表示することで、アプリの通知エクスペリエンスが拡充されました。また、ユーザーが通知シェードからメッセージに返信する際、画像メッセージを送信できるようになりました。

角丸 API

Android 12 では、角丸の半径と中心点を指定する RoundedCornerWindowInsets.getRoundedCorner(int position) が導入されました。これらの API を使用すると、角の丸い画面で UI 要素が切り詰められることを防止できます。

これらの API をアプリに実装しても、角の丸くない画面では効果がありません。

半径と中心点が示された角丸の画像

この機能を実装するには、アプリの境界に相対する WindowInsets.getRoundedCorner(int position)RoundedCorner 情報を取得します。アプリが画面全体を占有しない場合、API は中心点をアプリのウィンドウ境界上に置いて角丸を適用します。

次のコード スニペットは、アプリが RoundedCorner の情報に基づいてビューのマージンを設定することで、UI の切り詰めを防止する簡単な例を示しています。これは右上の角丸の場合です。

// Get the top-right rounded corner from WindowInsets.
final WindowInsets insets = getRootWindowInsets();
final RoundedCorner topRight = insets.getRoundedCorner(POSITION_TOP_RIGHT);
if (topRight == null) {
   return;
}

// Get the location of the close button in window coordinates.
int [] location = new int[2];
closeButton.getLocationInWindow(location);
final int buttonRightInWindow = location[0] + closeButton.getWidth();
final int buttonTopInWindow = location[1];

// Find the point on the quarter circle with a 45 degree angle.
final int offset = (int) (topRight.getRadius() * Math.sin(Math.toRadians(45)));
final int topBoundary = topRight.getCenter().y - offset;
final int rightBoundary = topRight.getCenter().x + offset;

// Check whether the close button exceeds the boundary.
if (buttonRightInWindow < rightBoundary && buttonTopInWindow > topBoundary) {
   return;
}

// Set the margin to avoid truncating.
int [] parentLocation = new int[2];
getLocationInWindow(parentLocation);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) closeButton.getLayoutParams();
lp.rightMargin = Math.max(buttonRightInWindow - rightBoundary, 0);
lp.topMargin = Math.max(topBoundary - buttonTopInWindow, 0);
closeButton.setLayoutParams(lp);

ピクチャー イン ピクチャー(PIP)の改善

Android 12 では、ピクチャー イン ピクチャー(PIP)モードの新機能が導入されました。詳細については、ピクチャー イン ピクチャーの改善をご覧ください。

ジェスチャー ナビゲーションの没入モードの改善

Android 12 では、没入モードが簡素化されてジェスチャー ナビゲーションがより簡単になりました。また、動画の視聴や書籍の閲覧といった他のアクティビティのエクスペリエンスとの一貫性が向上しました。アプリは、引き続き全画面表示のゲーム エクスペリエンスで偶発的なジェスチャーから保護されるため、ユーザーがプレイ中に誤ってゲームを終了することはありません。また、他のすべての全画面表示または没入型のエクスペリエンスでは、ユーザーが 1 回のスワイプでスマートフォンをナビゲートできるようになりました。

これを可能にするため、Android 12 以降、非スティッキー没入型エクスペリエンス(BEHAVIOR_SHOW_BARS_BY_TOUCHBEHAVIOR_SHOW_BARS_BY_SWIPE)の既存の動作はサポートされなくなります。それらはデフォルトの動作(BEHAVIOR_DEFAULT)で置き換えられました。これにより、システムバーを非表示にする際に 1 回のスワイプでジェスチャーを行うことが可能になります。このフラグにより、モードに応じてさまざまな視覚的および機能的な動作が有効になります。

  • 3 ボタンモードでは、視覚的および機能的な動作は、Android 12 より前のバージョンの没入モードと同じです。
  • ジェスチャー ナビゲーション モードの動作は次のとおりです。
    • 視覚的には、Android 11 以下の没入モードと同じです。
    • 機能的には、バーが非表示のときもジェスチャーを使用できます。Android 11 ではシステムの「戻る」ナビゲーションを呼び出すのに 2 回のスワイプが必要でしたが、1 回のスワイプで足りるようになりました。通知バーを下にスワイプするときやホームに移動するときに、追加のスワイプは必要はありません。

Android 12 のスティッキー没入モード(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE)に変更はありません。この機能には、次に示す下位互換性があります。

  • Android 11 以下をターゲットとする、Android 12 で動作するアプリの場合:
    • BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE は、機能的にも視覚的にも同様に動作します。
    • デフォルトの動作は BEHAVIOR_SHOW_BARS_BY_SWIPE にマッピングされています。
  • Android 12 をターゲットとする、Android 11(API レベル 30)以下で動作するアプリの場合:

リッチ コンテンツの挿入

Android 12 では、使用可能な任意のソース(クリップボード、キーボード、ドラッグ&ドロップ)からリッチ コンテンツを受け取れる新しい Unified API が導入されました。

詳しくは、コンテンツ受信用の Unified API をご覧ください。

カメラ

Quad Bayer カメラセンサーのサポート

現在、Quad / Nona Bayer パターンに代表される超高解像度カメラセンサーが多くの Android デバイスに搭載されており、画質と低照度性能の面で高い柔軟性を備えています。Android 12 では、サードパーティ アプリがこうした汎用センサーを最大限に活用できるよう、新しいプラットフォーム API が導入されました。新しい API は、こうしたセンサーの固有の動作をサポートし、フル解像度または「最大解像度」モードと「デフォルト」モードで動作するときに、異なるストリーム構成や組み合わせをサポートする可能性があることを考慮に入れています。

グラフィックと画像

アプリが tombstone トレースに直接アクセスできるようにする

Android 12 以降では、ApplicationExitInfo.getTraceInputStream() メソッドを介して、プロトコル バッファとしてアプリのネイティブ クラッシュ tombstone にアクセスできます。プロトコル バッファは、こちらのスキーマを使用してシリアル化されます。これまでは、Android Debug Bridge(adb)でしかこの情報にアクセスできませんでした。

アプリに実装する一例を次に示します。

ActivityManager activityManager: ActivityManager = getSystemService(Context.ACTIVITY_SERVICE);
MutableList<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(/* packageName = */ null, /* pid = */ 0, /* maxNum = */ 5);
for ( ApplicationExitInfo aei: exitReasons ) {
    if ( aei.getReason() == REASON_CRASH_NATIVE ) {
        // Get the tombstone input stream.
        InputStream tombstoneInputStream = aei.getTraceInputStream();
        // The tombstone parser built with protoc uses the tombstone schema, then parses the trace.
        Tombstone tombstone = Tombstone.parseFrom(trace);
    }
}

AVIF 画像のサポート

Android 12 では、AV1 画像ファイル形式(AVIF)を使用する画像のサポートが導入されました。AVIF は、AV1 でエンコードされた画像と画像シーケンス用のコンテナ形式です。動画圧縮からのフレーム内エンコード済みコンテンツを活用します。これにより、JPEG などの古い画像形式と比べて、同じファイルサイズでの画質が大幅に向上します。この形式のメリットについては、Jake Archibald のブログ投稿で詳しく説明されています。

簡単になったぼかし、カラーフィルタ、その他の効果

Android 12 では、ぼかし、カラーフィルタ、Android シェーダー効果などの一般的なグラフィック効果を View やレンダリング階層に適用する、新しい RenderEffect が追加されました。効果は、チェーン効果(内部効果と外部効果)またはブレンド効果として組み合わせることができます。Android デバイスによっては処理能力が限られているため、この機能がサポートされている場合もあれば、サポートされていない場合もあります。

View.setRenderEffect(RenderEffect) を呼び出すことで、View の基になる RenderNode に効果を適用することもできます。

RenderEffect を実装するには:

view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))

ネイティブ アニメーション画像のデコード

Android 12 では、NDK ImageDecoder API が拡張され、アニメーション GIF とアニメーション WebP のファイル形式を使用する画像から、すべてのフレームとタイミング データをデコードできるようになりました。この API が Android 11 で導入されたときは、これらの形式のアニメーションに含まれる最初の画像のみをデコードしていました。

サードパーティ ライブラリの代わりに ImageDecoder を使用すると、さらに APK サイズを縮小できます。また、セキュリティとパフォーマンスに関連する今後のアップデートを利用できます。

この API について詳しくは、API リファレンスGitHub のサンプルをご覧ください。

メディア

互換性のあるメディアのコード変換

Android 12 は、デバイス上で記録された HEVC(H.265) および HDR(HDR10 および HDR10+)の動画を、幅広い標準的なプレーヤーに対応している AVC(H.264)形式に自動的にコード変換できます。これにより、古いアプリとの互換性を犠牲にすることなく、利用可能な最新のコーデックを活用できます。

詳しくは、互換性のあるメディアのコード変換をご覧ください。

パフォーマンス クラス

Android 12 以降、Android にはパフォーマンス クラスという標準が導入されています。パフォーマンス クラスは、Android の基本要件を超えるハードウェア機能を指定します。各 Android デバイスは、サポート対象のパフォーマンス クラスを宣言します。デベロッパーは実行時にデバイスのパフォーマンス クラスをチェックし、デバイスの機能を最大限に活用するアップグレード環境を提供できます。

詳細については、パフォーマンス クラスをご覧ください。

動画エンコードの改善

Android 12 では、動画エンコードの量子化パラメータ(QP)値を制御する標準のキーセットが定義されています。これにより、デベロッパーはベンダー固有のコードを回避できます。

新しいキーは、MediaFormat API と NDK Media ライブラリで利用できます。

Android 12 以降の動画エンコーダでは、最低品質しきい値が適用されます。これにより、シーンの複雑性が高い動画をエンコードする場合に極端な品質低下が生じなくなります。

音声フォーカス

Android 12 以降、あるアプリが音声フォーカスをリクエストし、別のアプリがフォーカスを保持して再生している場合、フレームワークは再生中のアプリをフェードアウトさせます。

詳細については、音声フォーカスの改善をご覧ください。

MediaDrm の更新

現在の MediaDrm API にセキュアなデコーダ コンポーネントが必要かどうかを判断するには、次の手順を行う必要があります。

  1. MediaDrm を作成します。
  2. セッションを開いてセッション ID を取得します。
  3. セッション ID を使用して MediaCrypto を作成します。
  4. MediaCrypto.requiresSecureDecoderComponent(mimeType) を呼び出します。

新しいメソッド requiresSecureDecoder(@NonNull String mime)requiresSecureDecoder(@NonNull String mime, @SecurityLevel int level) を使用すると、MediaDrm を作成した直後にこれを判断できます。

セキュリティとプライバシー

Bluetooth の権限

Android 12 では、BLUETOOTH_SCANBLUETOOTH_ADVERTISEBLUETOOTH_CONNECT 権限が導入されました。この権限により、Android 12 をターゲットとするアプリ、特にデバイスの位置情報へのアクセスを必要としないアプリで、Bluetooth デバイスの操作が容易になります。

詳しくは、新しい Bluetooth 権限に関するガイドをご覧ください。

プライバシー ダッシュボード

縦のタイムラインに、位置情報にアクセスしたさまざまなアプリと、そのアクセスが発生した時刻が表示されます
図 1. プライバシー ダッシュボードの一部である位置情報使用状況画面。

Android 12 を搭載したサポート対象デバイスでは、システム設定にプライバシー ダッシュボード画面が表示されます。この画面では、位置情報、カメラ、マイク情報にアプリがいつアクセスしたのかが表示される個別画面にアクセスできます。各画面には、さまざまなアプリが特定の種類のデータにいつアクセスしたのかを示すタイムラインが表示されます。図 1 に、位置情報のデータアクセス タイムラインを示します。

アプリは、位置情報、カメラ、マイク情報にアクセスする理由をユーザーに理解してもらうために、根拠を示すことができます。この根拠は、新しいプライバシー ダッシュボード画面、アプリの権限画面、またはその両方に表示できます。

データアクセスの根拠を示す

アプリが位置情報、カメラ、マイク情報にアクセスする理由を説明する手順は次のとおりです。

  1. 起動時にアプリが特定の種類のデータアクセス アクションを行う根拠を示すアクティビティを追加します。

    Android 12 以降をターゲットとするアプリの場合、明示的に android:exported 属性の値を定義する必要があります。

  2. 新しく追加したアクティビティに次のインテント フィルタを追加します。

    <!-- android:exported required if you target Android 12. -->
    <activity android:name=".DataAccessRationaleActivity"
              android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
              android:exported="true">
           <!-- VIEW_PERMISSION_USAGE shows a selectable information icon on
                your app permission's page in system settings.
                VIEW_PERMISSION_USAGE_FOR_PERIOD shows a selectable information
                icon on the Privacy Dashboard screen. -->
        <intent-filter
           android:action="android.intent.action.VIEW_PERMISSION_USAGE"
           android:action="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" ... >
        </intent-filter>
    </activity>
    
  3. データアクセス根拠アクティビティで表示する内容を決定します。たとえば、アプリのウェブサイトやヘルプセンターの記事を表示できます。アプリがアクセスするデータの種類と、そのアクセスがいつ発生したのかについて、より詳細な説明を提供するには、権限使用状況インテントを呼び出したときに追加されるエクストラを処理します。

追加したインテント フィルタに応じて、特定の画面でアプリ名の横に情報アイコンが表示されます。

  • VIEW_PERMISSION_USAGE アクションを含むインテント フィルタを追加した場合、システム設定にあるアプリの権限ページにアイコンが表示されます。
  • VIEW_PERMISSION_USAGE_FOR_PERIOD アクションを含むインテント フィルタを追加した場合、プライバシー ダッシュボード画面にアプリが表示されるたびに、アプリ名の横にアイコンが表示されます。

ユーザーがそのアイコンを選択すると、アプリの根拠アクティビティが開始されます。

アプリ オーバーレイ ウィンドウを非表示にする

ユーザーがデベロッパーのアプリを操作したときに表示される内容をデベロッパーが細かく制御できるように、Android 12 では、SYSTEM_ALERT_WINDOW 権限のあるアプリが描画するオーバーレイ ウィンドウを非表示にする機能が導入されました。

HIDE_OVERLAY_WINDOWS 権限を宣言した後、アプリは setHideOverlayWindows() を呼び出して、アプリ自体のウィンドウが表示されているときに TYPE_APPLICATION_OVERLAY 型のウィンドウをすべて非表示にするよう示すことができます。アプリはこの処理を、トランザクション確認フローなどのプライベートな画面を表示する際に行えます。

TYPE_APPLICATION_OVERLAY 型のウィンドウを表示するアプリは、ピクチャー イン ピクチャーバブルなど、ユースケースに適した代替手段を検討する必要があります。

既知の署名者権限保護フラグ

Android 12 では、署名レベルの権限knownCerts 属性が導入されました。この属性を使用すると、宣言時に既知の署名証明書のダイジェストを参照できます。

アプリはこの属性を宣言し、指定した署名レベルの権限の protectionLevel 属性で新しい knownSigner フラグを使用できます。その場合、現在の署名者を含むリクエスト元アプリの署名系列の署名者が、knownCerts 属性で権限とともに宣言されたダイジェストのいずれかに一致すると、システムはリクエスト元アプリに権限を付与します。

knownSigner フラグを使用すると、デバイスとアプリは、デバイスの製造時や出荷時にアプリに署名することなく、他のアプリに署名権限を付与できます。

デバイス プロパティの証明

Android 12 では、アプリが新しい鍵を生成したときにアテステーション証明書内のデバイス プロパティを検証できるアプリのセットが拡張されました。

Android 9(API レベル 28)以降、Keymaster 4.0 以上を使用するデバイス ポリシー オーナー(DPO)は、アテステーション証明書内のデバイス プロパティを検証できます。Android 12 以降は、Android 12 をターゲットとするすべてのアプリで、setDevicePropertiesAttestationIncluded() メソッドを使用してこの検証を実行できます。

生成されるデバイス プロパティには、次の Build フィールドが含まれています。

  • BRAND
  • DEVICE
  • MANUFACTURER
  • MODEL
  • PRODUCT

ロック画面での通知アクションの保護

Android 12 では、新しい setAuthenticationRequired フラグが Notification.Action.Builder に追加されました。このフラグを使用すると、ロックされたデバイスの通知にセキュリティのレイヤを追加できます。

指定の通知アクションにこのフラグを true 値で適用した場合、ロックされたデバイスでユーザーがそのアクションを呼び出すと、常に認証リクエストが行われます。以前は、ユーザーが通知アクションを呼び出してアクティビティを起動した場合や、直接応答した場合にのみ、ロックされたデバイスで認証がリクエストされていました。

この機能を実装するには、通知アクションに setAuthenticationRequired を追加します。

Notification n1 = new Notification.Builder(context, NotificationListenerVerifierActivity.TAG)
...
.addAction(new Notification.Action.Builder(R.drawable.ic_stat_charlie,
context.getString(R.string.action_test_title), makeBroadcastIntent(context))

// Make sure this notification action will always request authentication when
// invoked from a lock screen
.setAuthenticationRequired(true).build())

.build();

接続

帯域幅推定の改善

Android 12 では、getLinkDownstreamBandwidthKbps()getLinkUpstreamBandwidthKbps() で提供される帯域幅推定機能が、Wi-Fi とモバイル接続の両方で改善されました。返される値が、デバイス上のすべてのアプリについて、携帯通信会社または Wi-Fi の SSID、ネットワークの種類、信号レベル別の、全期間の加重平均スループットを表すようになりました。これにより、返される予想スループットの推定値がさらに正確かつ現実的になり、アプリのコールド スタート時に推定値を提供でき、他のスループット推定方法を使用する場合に比べて少ないサイクルで済みます。

コンパニオン アプリを起動したままにする

Android 12 では、デバイスを管理するためにコンパニオン アプリを実行し続けることができるように、次のような API が導入されました。

  • コンパニオン デバイスが範囲内にある場合にアプリを復帰させられるようにする。
  • デバイスが範囲内にある間、プロセスが動作し続けることを保証する。

API を使用するには、コンパニオン デバイス マネージャーを使用してデバイスを接続する必要があります。詳細については、CompanionDeviceManager.startObservingDevicePresence()CompanionDeviceService.onDeviceAppeared() をご覧ください。

コンパニオン デバイス マネージャーのプロファイル

Android 12 以降をターゲットとするパートナー アプリは、スマートウォッチに接続する際にコンパニオン デバイス プロファイルを使用できるようになりました。プロファイルを使用すると、デバイスタイプ固有の権限の付与を 1 つのステップにまとめることで、登録プロセスを簡素化できます。

権限を付与するよう求めるプロンプトを表示するスマートフォンのスクリーンショット

まとめた権限は、デバイスが接続されるとコンパニオン アプリに付与され、デバイスが関連付けられている間に限り有効です。アプリを削除するか関連付けを削除すると、権限が削除されます。

詳細については、AssociationRequest.Builder.setDeviceProfile() をご覧ください。

Wi-Fi Aware(NAN)の機能強化

Android 12 では、Wi-Fi Aware で次の機能強化が行われました。

  • Android 12 以上を搭載したデバイスでは、サービスの中断や圏外への移動が原因でアプリが検出済みのサービスを喪失したときに、onServiceLost() コールバックを使用してアラートを受け取ることができます。
  • 複数のデータパス(NAN データパス)を設定する方法は、より効率化されています。以前のバージョンでは L2 メッセージを使用してイニシエータのピア情報を交換していたため、レイテンシが発生していました。Android 12 以上を搭載したデバイスでは、応答側(サーバー)がピアを承認するように構成できます。つまり、イニシエータ情報を事前に認識する必要がありません。これにより、データパスの確立が高速化され、1 つのネットワーク リクエストのみで複数のポイントツーポイント リンクが有効になります。
  • Android 12 以上を搭載したデバイスでは、リソース不足を理由にフレームワークが検出リクエストまたは接続リクエストを拒否することを防ぐため、WifiAwareManager.getAvailableAwareResources() を呼び出せるようになりました。このメソッドの戻り値から、使用可能なデータパスの数、使用可能なパブリッシュ セッションの数、使用可能なサブスクライブ セッションの数を取得できます。

ピアツーピア接続とインターネット接続の同時実行

Android 12 以降をターゲットとするデバイスがハードウェア サポート対象のデバイス上で動作する場合、ピアツーピア接続を使用しても、ピアデバイスへの接続を作成する際に既存の Wi-Fi 接続は切断されません。この機能のサポートを確認するには、WifiManager.isMultiStaConcurrencySupported() を使用します。

ストレージ

Android 12 では、ストレージ管理 API に対し、以降のセクションに示す変更が加えられています。

録音用の新しいディレクトリ

新しい Environment.DIRECTORY_RECORDINGS フォルダに保存されている音声ファイルが録音として認識されます。アプリがシステムのメディアストアに対してクエリを行うとき、IS_RECORDING フラグを使用して録音を取得できます。

メディア管理アクセス

ユーザーは、メディア ファイルを頻繁に編集するなど、特定のアプリを信頼してメディア管理を行う場合があります。Android 11(API レベル 30)以降をターゲットとし、デバイスのデフォルト ギャラリー アプリではないアプリの場合、アプリがファイルを変更または削除しようとするたびに、確認ダイアログを表示する必要があります。

Android 12 をターゲットとするアプリの場合、ファイル操作のたびにユーザーに確認を求めることなく、次の各操作を行う権限をアプリに付与するよう、ユーザーにリクエストできます。

手順は次のとおりです。

  1. アプリのマニフェスト ファイルで、新しい MANAGE_MEDIA 権限と READ_EXTERNAL_STORAGE 権限を宣言します。

    確認ダイアログを表示せずに createWriteRequest() を呼び出すために、ACCESS_MEDIA_LOCATION 権限も宣言します。

  2. アプリで UI を表示して、アプリにメディア管理アクセス権を付与する理由を説明します。

  3. ACTION_REQUEST_MANAGE_MEDIA インテントのアクションを呼び出します。これにより、ユーザーはシステム設定の [メディア管理アプリ] 画面に移動します。ここから、ユーザーは特別なアプリアクセス権を付与できます。

アプリ ストレージへのアクセス

アプリは、起動時にアプリがユーザーのデバイスに保存したデータをユーザーが管理できるカスタム アクティビティを宣言、作成できます。アプリはマニフェスト ファイルの android:manageSpaceActivity 属性を使用して、このカスタム「容量管理」アクティビティを宣言します。ファイル マネージャー アプリは、アプリがアクティビティをエクスポートしない場合、つまりアクティビティが android:exportedfalse に設定している場合でも、この「容量管理」アクティビティを起動できます。

Android 12 では、MANAGE_EXTERNAL_STORAGE 権限と QUERY_ALL_PACKAGES 権限の両方を持つアプリ(ファイル管理アプリなど)は、新しい getManageSpaceActivityIntent() を使用して、別のカスタム「容量管理」アクティビティにユーザーを誘導できます(他のアプリのために定義されている場合)。

getManageSpaceActivityIntent() メソッドは、パッケージ名とリクエスト コードを受け取り、次のいずれかを返します。

  • 指定したパッケージ名を持つアプリでカスタム「容量管理」アクティビティを定義している場合、PendingIntentgetManageSpaceActivityIntent() メソッドを呼び出したアプリは、返されたインテントを呼び出して、ユーザーをカスタム アクティビティに誘導できます。
  • 指定したパッケージ名を持つアプリで「容量管理」アクティビティを定義していない場合、null

拡張ファイル アクセスのサポート

getMediaUri() メソッドが、既存の ExternalStorageProvider URI のサポートに加えて、MediaDocumentsProvider URI をサポートするようになりました。システムは、URI を返す前に呼び出し元に URI を付与するようになりました。

また、createWriteRequest() で付与されるメディア URI が、File クラスの API をサポートするようになりました。これらの API は、ファイルの読み取り、書き込み、名前の変更、削除を行うことができます。

コア機能

アプリの自動アップデート

Android 12 では、PackageInstaller API を使用するアプリ向けに setRequireUserAction() メソッドが導入されました。このメソッドにより、ユーザーにアクションの確認を求めることなく、インストーラ アプリがアプリのアップデートを実施できます。

デバイスのチップセットに関する情報

Android 12 では、SoC チップセットのベンダー情報とモデル情報を SDK 経由で公開する 2 つの定数が android.os.Build に追加されました。それぞれ Build.SOC_MANUFACTURERBuild.SOC_MODEL を呼び出すことで、この情報を取得できます。