Android 15 では、デベロッパー向けに優れた新しい機能と API が導入されています。以降のセクションでは、関連する API の使用を開始する際に役立つこれらの機能の概要を説明します。
新しい API、変更された API、削除された API の詳細なリストについては、API 差分レポートをご覧ください。新しい API について詳しくは、Android API リファレンスをご覧ください。新しい API は、見やすくするためにハイライト表示されています。また、プラットフォームの変更がアプリに影響する領域については、Android 15 をターゲットとするアプリに影響する Android 15 の動作変更と、targetSdkVersion
に関係なくすべてのアプリに影響する動作変更をご覧ください。カメラとメディア
Android 15 には、カメラとメディアのエクスペリエンスを向上させるさまざまな機能が含まれています。また、クリエイターが Android でビジョンを具現化するのをサポートするツールやハードウェアにアクセスできます。
Android のメディアとカメラの最新機能とデベロッパー ソリューションについて詳しくは、Google I/O の最新の Android メディアとカメラ エクスペリエンスの構築の講演をご覧ください。
ローライト ブースト
Android 15 では、新しい自動露出モードであるローライト ブーストが導入され、カメラ 2 と夜間モードのカメラ拡張機能の両方で使用できます。ローライト ブーストは、暗い場所でプレビュー ストリームの露出を調整します。これは、夜間モードのカメラ拡張機能が静止画像を作成する方法とは異なります。夜間モードでは、大量の写真を組み合わせて 1 つの補正された画像を作成するためです。夜間モードは静止画像の作成には適していますが、フレームの連続ストリームを作成することはできませんが、ローライト ブーストは作成できます。そのため、ローライト ブーストにより、次のような新しいカメラ機能が有効になります。
- 強化された画像プレビューを提供することで、ユーザーが暗い場所での写真をより適切にフレームに収められるようにする
- 暗い場所での QR コードのスキャン
ローライト ブーストを有効にすると、光量が不足すると自動的にオンになり、光量が増加するとオフになります。
アプリは、暗い場所でプレビュー ストリームから録画して、明るい動画を保存できます。
詳しくは、ローライト ブーストをご覧ください。
アプリ内カメラ コントロール
Android 15 では、サポート対象デバイスのカメラ ハードウェアとアルゴリズムをより詳細に制御するための新しい拡張機能が追加されています。
HDR ヘッドルーム コントロール
Android 15 では、基盤となるデバイスの機能とパネルのビット深度に適した HDR ヘッドルームが選択されます。1 つの HDR サムネイルを表示するメッセージ アプリなど、SDR コンテンツが大量にあるページの場合、この動作は SDR コンテンツの明度に悪影響を及ぼす可能性があります。Android 15 では、setDesiredHdrHeadroom
を使用して HDR ヘッドルームを制御し、SDR と HDR のコンテンツのバランスを取ることができます。
![](https://developer.android.com/static/about/versions/15/images/hdr-headroom.png?authuser=0000&hl=ja)
音量調整
Android 15 introduces support for the CTA-2075 loudness standard to help you avoid audio loudness inconsistencies and ensure users don't have to constantly adjust volume when switching between content. The system leverages known characteristics of the output devices (headphones and speaker) along with loudness metadata available in AAC audio content to intelligently adjust the audio loudness and dynamic range compression levels.
To enable this feature, you need to ensure loudness metadata is available in
your AAC content and enable the platform feature in your app. For this, you
instantiate a LoudnessCodecController
object by
calling its create factory method with the audio
session ID from the associated AudioTrack
; this
automatically starts applying audio updates. You can pass an
OnLoudnessCodecUpdateListener
to modify or filter
loudness parameters before they are applied on the
MediaCodec
.
// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = …
val audioTrack = AudioTrack.Builder()
.setSessionId(sessionId)
.build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
val lcController = LoudnessCodecController.create(mSessionId)
// Starts applying audio updates for each added MediaCodec
}
AndroidX media3 ExoPlayer will also be updated to use the
LoudnessCodecController
APIs for a seamless app integration.
Virtual MIDI 2.0 デバイス
Android 13 では、Universal MIDI Packets(UMP)を使用して通信する USB を使用して MIDI 2.0 デバイスに接続するためのサポートが追加されました。Android 15 では、UMP のサポートが仮想 MIDI アプリに拡張されています。これにより、合成アプリは USB MIDI 2.0 デバイスの場合と同様に、シンセサイザー アプリを仮想 MIDI 2.0 デバイスとして制御できます。
AV1 ソフトウェア デコードの効率化
VideoLAN の一般的な AV1 ソフトウェア デコーダである dav1d が、ハードウェアでの AV1 デコードをサポートしていない Android デバイスで利用できるようになりました。dav1d は、従来の AV1 ソフトウェア デコーダよりも最大 3 倍のパフォーマンスが高く、一部の低中層デバイスを含む多くのユーザーが HD AV1 再生が可能です。
現時点では、アプリで "c2.android.av1-dav1d.decoder"
という名前で dav1d を呼び出して、dav1d の使用を有効にする必要があります。dav1d は、今後のアップデートでデフォルトの AV1 ソフトウェア デコーダになります。このサポートは標準化されており、Google Play システム アップデートを受信する Android 11 デバイスにバックポートされています。
デベロッパーの生産性とツール
生産性を向上させるための Google の取り組みのほとんどは、Android Studio、Jetpack Compose、Android Jetpack ライブラリなどのツールを中心としていますが、ユーザーがより簡単にビジョンを実現できる方法を常に模索しています。
OpenJDK 17 の更新
Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.
The following key features and improvements are included:
- Quality-of-life improvements around NIO buffers
- Streams
- Additional
math
andstrictmath
methods util
package updates including sequencedcollection
,map
, andset
ByteBuffer
support inDeflater
- Security updates such as
X500PrivateCredential
and security key updates
These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.
PDF の改善
Android 15 includes substantial improvements to the PdfRenderer
APIs. Apps can incorporate advanced features such as rendering
password-protected files, annotations, form editing,
searching, and selection with copy. Linearized PDF
optimizations are supported to speed local PDF viewing and reduce resource use.
![](https://developer.android.com/static/about/versions/15/images/pdf-rendering.png?authuser=0000&hl=ja)
The PdfRenderer
has been moved to a module that can be updated using Google
Play system updates independent of the platform release, and we're supporting
these changes back to Android 11 (API level 30) by creating a compatible
pre-Android 15 version of the API surface, called
PdfRendererPreV
.
We value your feedback on the enhancements we've made to the PdfRenderer
API
surface, and we plan to make it even easier to incorporate these APIs into your
app with an upcoming Android Jetpack library.
言語の自動切り替えによる調整
Android 14 では、言語の自動切り替えを伴うデバイス上の多言語認識機能が追加されていますが、特に 2 つの発話間の一時停止が少なく言語が切り替わる場合は、単語が欠落する可能性があります。Android 15 では、アプリがユースケースに合わせてこの切り替えを調整できるように、コントロールが追加されています。
EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
は自動切り替えを音声セッションの開始に制限し、EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
は定義された回数の切り替えの後に言語切り替えを無効にします。これらのオプションは、セッション中に 1 つの言語が自動検出されることを想定している場合に特に便利です。
OpenType Variable Font API を改善
Android 15 では、OpenType 可変フォントのユーザビリティが改善されています。buildVariableFamily
API を使用して、太さの軸を指定せずに可変フォントから FontFamily
インスタンスを作成できるようになりました。テキスト レンダラは、表示テキストと一致するように wght
軸の値をオーバーライドします。
新しい API を使用すると、Typeface
を作成するコードが大幅に簡素化されます。
Kotlin
val newTypeface = Typeface.CustomFallbackBuilder( FontFamily.Builder( Font.Builder(assets, "RobotoFlex.ttf").build()) .buildVariableFamily()) .build()
Java
Typeface newTypeface = Typeface.CustomFallbackBuilder( new FontFamily.Builder( new Font.Builder(assets, "RobotoFlex.ttf").build()) .buildVariableFamily()) .build();
以前は、同じ Typeface
を作成するには、より多くのコードが必要でした。
Kotlin
val oldTypeface = Typeface.CustomFallbackBuilder( FontFamily.Builder( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 400") .setWeight(400) .build()) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 100") .setWeight(100) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 200") .setWeight(200) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 300") .setWeight(300) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 500") .setWeight(500) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 600") .setWeight(600) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 700") .setWeight(700) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 800") .setWeight(800) .build() ) .addFont( Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 900") .setWeight(900) .build() ).build() ).build()
Java
Typeface oldTypeface = new Typeface.CustomFallbackBuilder( new FontFamily.Builder( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 400") .setWeight(400) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 100") .setWeight(100) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 200") .setWeight(200) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 300") .setWeight(300) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 500") .setWeight(500) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 600") .setWeight(600) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 700") .setWeight(700) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 800") .setWeight(800) .build() ) .addFont( new Font.Builder(assets, "RobotoFlex.ttf") .setFontVariationSettings("'wght' 900") .setWeight(900) .build() ) .build() ).build();
新旧両方の API で作成した Typeface
の表示例を次に示します。
この例では、古い API で作成された Typeface
には、350、450、550、650 の Font
インスタンスに対して正確なフォントの太さを作成する機能がないため、レンダラは最も近い太さにフォールバックします。つまり、この場合、350 ではなく 300 がレンダリングされ、450 ではなく 400 がレンダリングされるといった具合です。一方、新しい API で作成された Typeface
は、指定された重みに対して Font
インスタンスが動的に作成されるため、350、450、550、650 についても正確な重みがレンダリングされます。
きめの細かい改行コントロール
Starting in Android 15, a TextView
and the underlying
line breaker can preserve the given portion of text in the same line to improve
readability. You can take advantage of this line break customization by using
the <nobreak>
tag in string resources or
createNoBreakSpan
. Similarly, you can preserve words from
hyphenation by using the <nohyphen>
tag or
createNoHyphenationSpan
.
For example, the following string resource doesn't include a line break, and renders with the text "Pixel 8 Pro." breaking in an undesirable place:
<resources>
<string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>
In contrast, this string resource includes the <nobreak>
tag, which wraps the
phrase "Pixel 8 Pro." and prevents line breaks:
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
The difference in how these strings are rendered is shown in the following images:
![](https://developer.android.com/static/about/versions/15/images/line-breaks-none.png?authuser=0000&hl=ja)
<nobreak>
tag.![](https://developer.android.com/static/about/versions/15/images/line-breaks-included.png?authuser=0000&hl=ja)
<nobreak>
tag.アプリのアーカイブ
Android and Google Play announced support for app archiving last year, allowing users to free up space by partially removing infrequently used apps from the device that were published using Android App Bundle on Google Play. Android 15 now includes OS level support for app archiving and unarchiving, making it easier for all app stores to implement it.
Apps with the REQUEST_DELETE_PACKAGES
permission can call the
PackageInstaller
requestArchive
method to request archiving an
installed app package, which removes the APK and any cached files, but persists
user data. Archived apps are returned as displayable apps through the
LauncherApps
APIs; users will see a UI treatment to highlight that those
apps are archived. If a user taps on an archived app, the responsible installer
will get a request to unarchive it, and the restoration process can be
monitored by the ACTION_PACKAGE_ADDED
broadcast.
グラフィック
Android 15 では、ANGLE や Canvas グラフィック システムの追加など、最新のグラフィック改善が行われています。
Android の GPU アクセスのモダナイゼーション
Android ハードウェアは、コア OS が単一の CPU で実行され、GPU が固定関数パイプラインに基づく API を使用してアクセスされる初期の時代から大きく進化しました。Vulkan® グラフィック API は、Android 7.0(API レベル 24)以降、下位レベルの抽象化により NDK で利用できます。これにより、最新の GPU ハードウェアを反映し、複数の CPU コアをサポートするように拡張性が向上し、CPU ドライバのオーバーヘッドが削減されるため、アプリのパフォーマンスを改善できます。Vulkan は、最新のすべてのゲームエンジンでサポートされています。
Vulkan は Android で推奨される GPU のインターフェースです。そのため、Android 15 では、Vulkan 上で OpenGL® ES を実行するためのオプション レイヤとして ANGLE が含まれています。ANGLE に移行すると、Android OpenGL 実装が標準化され、互換性が向上し、場合によってはパフォーマンスも向上します。ANGLE を使用した OpenGL ES アプリの安定性とパフォーマンスをテストするには、Android 15 で [設定] -> [システム] -> [開発者向けオプション] -> [試験運用版: ANGLE を有効にする] で開発者向けオプションを有効にします。
Vulkan の Android ANGLE ロードマップ
![Android GPU API の今後の変更のロードマップ。](https://developer.android.com/static/about/versions/15/images/angle-vulkan-roadmap.png?authuser=0000&hl=ja)
GPU スタックの効率化の一環として、今後さらに多くの新しいデバイスで ANGLE を GL システム ドライバとしてリリースする予定です。将来的には、OpenGL/ES は ANGLE を通じてのみ利用できるようになることが予想されます。ただし、すべてのデバイスで OpenGL ES のサポートを継続する予定です。
推奨される次のステップ
開発者向けオプションを使用して、OpenGL ES 用の ANGLE ドライバを選択し、アプリをテストします。新しいプロジェクトでは、C/C++ 用の Vulkan を使用することを強くおすすめします。
Canvas の改善点
Android 15 では、次の新機能によって Android のキャンバス グラフィック システムのモダナイゼーションが引き続き行われています。
Matrix44
は、キャンバスを 3D で操作する場合に使用する座標を変換するための 4x4 マトリックスを提供します。clipShader
は現在のクリップと指定されたシェーダーを交差させ、clipOutShader
はクリップを現在のクリップとシェーダーの差分に設定し、それぞれがシェーダーをアルファマスクとして扱います。これにより、複雑な図形の描画が効率的にサポートされます。
パフォーマンスとバッテリー
Android は、引き続きアプリのパフォーマンスと品質の改善に力を注いでいます。Android 15 では、アプリ内のタスクの実行の効率化、アプリのパフォーマンスの最適化、アプリに関する分析情報の収集に役立つ新しい API が導入されています。
バッテリー効率の高いおすすめの方法、ネットワークと電力使用量のデバッグ、および Android 15 と Android の最近のバージョンにおけるバックグラウンド処理のバッテリー効率を向上させる方法について詳しくは、Google I/O の Android でのバックグラウンド処理のバッテリー効率を改善するをご覧ください。
ApplicationStartInfo API
In previous versions of Android, app startup has been a bit of a mystery. It was
challenging to determine within your app whether it started from a cold, warm,
or hot state. It was also difficult to know how long your app spent during the
various launch phases: forking the process, calling onCreate
, drawing the
first frame, and more. When your Application
class was instantiated, you had no
way of knowing whether the app started from a broadcast, a content provider, a
job, a backup, boot complete, an alarm, or an Activity
.
The ApplicationStartInfo
API on Android 15 provides
all of this and more. You can even choose to add your own timestamps into the
flow to help collect timing data in one place. In addition to collecting
metrics, you can use ApplicationStartInfo
to help directly optimize app
startup; for example, you can eliminate the costly instantiation of UI-related
libraries within your Application
class when your app is starting up due to a
broadcast.
アプリのサイズに関する詳細情報
Android 8.0(API レベル 26)以降、アプリのインストール サイズを 1 つのバイト数として要約する StorageStats.getAppBytes
API が追加されました。これは、APK サイズ、APK から抽出されたファイルのサイズ、デバイス上で生成されたファイル(AOT コンパイル済みコードなど)の合計です。この数値は、アプリがストレージをどのように使用しているかという点から見て、あまり意味がありません。
Android 15 では、StorageStats.getAppBytesByDataType([type])
API が追加されています。これにより、APK ファイルの分割、AOT と高速化に関連するコード、dex メタデータ、ライブラリ、ガイド付きプロファイルなど、アプリがその容量をどのように使用しているかに関する分析情報を取得できます。
アプリ管理のプロファイリング
Android 15 には、アプリ内からプロファイリング情報を収集できる新しい ProfilingManager
クラスが含まれています。プロファイリング リクエストの作成を簡素化する Android Jetpack API でこれをラップする予定ですが、コア API ではヒープダンプ、ヒープ プロファイル、スタック サンプリングなどの収集が可能になります。出力ファイルを識別するタグで指定されたコールバックをアプリに提供します。出力ファイルは、アプリのファイル ディレクトリに配信されます。パフォーマンスへの影響を最小限に抑えるために、API はレート制限を行います。
SQLite データベースの改善
Android 15 introduces new SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps.
Developers should consult best practices for SQLite performance to get the most out of their SQLite database, especially when working with large databases or when running latency-sensitive queries.
- Read-only deferred transactions: when issuing transactions that are
read-only (don't include write statements), use
beginTransactionReadOnly()
andbeginTransactionWithListenerReadOnly(SQLiteTransactionListener)
to issue read-onlyDEFERRED
transactions. Such transactions can run concurrently with each other, and if the database is in WAL mode, they can run concurrently withIMMEDIATE
orEXCLUSIVE
transactions. - Row counts and IDs: new APIs were added to retrieve the count of changed
rows or the last inserted row ID without issuing an additional query.
getLastChangedRowCount()
returns the number of rows that were inserted, updated, or deleted by the most recent SQL statement within the current transaction, whilegetTotalChangedRowCount()
returns the count on the current connection.getLastInsertRowId()
returns therowid
of the last row to be inserted on the current connection. - Raw statements: issue a raw SQlite statement, bypassing convenience wrappers and any additional processing overhead that they may incur.
Android Dynamic Performance Framework の更新
Android 15 continues our investment in the Android Dynamic Performance Framework (ADPF), a set of APIs that allow games and performance intensive apps to interact more directly with power and thermal systems of Android devices. On supported devices, Android 15 will add new ADPF capabilities:
- A power-efficiency mode for hint sessions to indicate that their associated threads should prefer power saving over performance, great for long-running background workloads.
- GPU and CPU work durations can both be reported in hint sessions, allowing the system to adjust CPU and GPU frequencies together to best meet workload demands.
- Thermal headroom thresholds to interpret possible thermal throttling status based on headroom prediction.
To learn more about how to use ADPF in your apps and games, head over to the documentation.
プライバシー
Android 15 には、アプリ デベロッパーがユーザーのプライバシーを保護するために役立つさまざまな機能が搭載されています。
画面の録画の検出
Android 15 adds support for apps to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. An app is considered visible if activities owned by the registering process's UID are being recorded. This way, if your app is performing a sensitive operation, you can inform the user that they're being recorded.
val mCallback = Consumer<Int> { state ->
if (state == SCREEN_RECORDING_STATE_VISIBLE) {
// We're being recorded
} else {
// We're not being recorded
}
}
override fun onStart() {
super.onStart()
val initialState =
windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
mCallback.accept(initialState)
}
override fun onStop() {
super.onStop()
windowManager.removeScreenRecordingCallback(mCallback)
}
拡張された IntentFilter 機能
Android 15 では、UriRelativeFilterGroup
を通じて、より正確な Intent
解決をサポートしています。これには、URL クエリ パラメータ、URL フラグメント、ブロックルールまたは除外ルールなど、それぞれ満たす必要がある Intent
一致ルールのセットを形成する一連の UriRelativeFilter
オブジェクトが含まれています。
これらのルールは、AndroidManifest
XML ファイルで新しい <uri-relative-filter-group>
タグを使用して定義できます。このタグには必要に応じて android:allow
タグを含めることができます。これらのタグには、既存のデータタグ属性を使用する <data>
タグと、新しい android:query
属性と android:fragment
属性を含めることができます。
AndroidManifest
構文の例を次に示します。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:domain="astore.com" />
<uri-relative-filter-group>
<data android:pathPrefix="/auth" />
<data android:query="region=na" />
</uri-relative-filter-group>
<uri-relative-filter-group android:allow="false">
<data android:pathPrefix="/auth" />
<data android:query="mobileoptout=true" />
</uri-relative-filter-group>
<uri-relative-filter-group android:allow="false">
<data android:pathPrefix="/auth" />
<data android:fragmentPrefix="faq" />
</uri-relative-filter-group>
</intent-filter>
プライベート スペース
プライベート スペースを使用すると、デバイスに別のスペースを作成して、機密性の高いアプリがのぞき見されないように、追加の認証レイヤを作成できます。プライベート スペースでは別のユーザー プロフィールを使用します。ユーザーは、デバイスロックを使用するか、プライベート スペースの個別のロック係数を使用するかを選択できます。
プライベート スペースのアプリは、ランチャーの別のコンテナに表示され、プライベート スペースがロックされているときは、[最近] ビュー、通知、設定、その他のアプリには表示されません。ユーザーが作成したコンテンツやダウンロードしたコンテンツ(メディアやファイルなど)とアカウントは、プライベート スペースとメイン スペースで分離されます。システム共有シートと写真選択ツールを使用すると、プライベート スペースがロック解除されているときに、アプリがスペース全体のコンテンツにアクセスできるようになります。
ユーザーは既存のアプリとそのデータをプライベート スペースに移動できません。代わりに、ユーザーはプライベート スペースでインストール オプションを選択し、任意のアプリストアを使用してアプリをインストールします。プライベート スペースのアプリは、メインスペースのアプリとは別のコピー(同じアプリの新しいコピー)としてインストールされます。
ユーザーがプライベート スペースをロックすると、プロフィールは停止されます。プロファイルが停止すると、プライベート スペースのアプリはアクティブではなくなり、通知の表示など、フォアグラウンド アクティビティやバックグラウンド アクティビティを実行できなくなります。
特にアプリが次のいずれかのカテゴリに分類される場合は、プライベート スペースでアプリをテストして、アプリが想定どおりに動作するかどうか確認することをおすすめします。
- 仕事用プロファイルのロジックを持つアプリ。メイン プロファイルにない、アプリのインストール済みコピーが仕事用プロファイルにあることを前提としています。
- ランチャー アプリ
- アプリストア アプリ
「選択した写真へのアクセス」について最新のユーザー選択をクエリする
It is now possible for apps to highlight only the most recently selected photos
and videos when partial access to media permissions is granted. This
feature can improve the user experience for apps that frequently request
access to photos and videos. To use this feature in your app, enable the
QUERY_ARG_LATEST_SELECTION_ONLY
argument when querying MediaStore
through ContentResolver
.
Kotlin
val externalContentUri = MediaStore.Files.getContentUri("external") val mediaColumns = arrayOf( FileColumns._ID, FileColumns.DISPLAY_NAME, FileColumns.MIME_TYPE, ) val queryArgs = bundleOf( // Return only items from the last selection (selected photos access) QUERY_ARG_LATEST_SELECTION_ONLY to true, // Sort returned items chronologically based on when they were added to the device's storage QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC", QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?", QUERY_ARG_SQL_SELECTION_ARGS to arrayOf( FileColumns.MEDIA_TYPE_IMAGE.toString(), FileColumns.MEDIA_TYPE_VIDEO.toString() ) )
Java
Uri externalContentUri = MediaStore.Files.getContentUri("external"); String[] mediaColumns = { FileColumns._ID, FileColumns.DISPLAY_NAME, FileColumns.MIME_TYPE }; Bundle queryArgs = new Bundle(); queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true); queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC"); queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?"); queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] { String.valueOf(FileColumns.MEDIA_TYPE_IMAGE), String.valueOf(FileColumns.MEDIA_TYPE_VIDEO) });
Android 版プライバシー サンドボックス
Android 15 には、最新バージョンの Android 版プライバシー サンドボックスを組み込んだ最新の Android 広告サービス拡張機能が搭載されています。この追加は、ユーザーのプライバシーを向上させ、モバイルアプリで効果的なパーソナライズド広告体験を可能にする新しいテクノロジーを開発する取り組みの一環です。プライバシー サンドボックスのページには、Android 版プライバシー サンドボックス デベロッパー プレビューとベータ版プログラムに関する詳細情報が記載されています。
ヘルスコネクト
Android 15 integrates the latest extensions around Health Connect by Android, a secure and centralized platform to manage and share app-collected health and fitness data. This update adds support for new data types across fitness, nutrition, skin temperature, training plans, and more.
Skin temperature tracking allows users to store and share more accurate temperature data from a wearable or other tracking device.
Training plans are structured workout plans to help a user achieve their fitness goals. Training plans support includes a variety of completion and performance goals:
- Completion goals around calories burned, distance, duration, repetition, and steps.
- Performance goals around as many repetitions as possible (AMRAP), cadence, heart rate, power, perceived rate of exertion, and speed.
Learn more about the latest updates to Health Connect in Android in the Building adaptable experiences with Android Health talk from Google I/O.
部分的画面共有
Android 15 では部分的な画面共有がサポートされているため、ユーザーはデバイスの画面全体ではなく、アプリ ウィンドウのみを共有または録画できます。この機能には Android 14 QPR2 で初めて有効になり、アプリで部分的な画面共有のエクスペリエンスをカスタマイズできる MediaProjection
コールバックが含まれています。Android 14(API レベル 34)以降をターゲットとするアプリでは、MediaProjection
キャプチャ セッションごとにユーザーの同意が必要になりました。
ユーザー エクスペリエンスとシステム UI
Android 15 では、アプリ デベロッパーとユーザーは、ニーズに合わせてデバイスをより細かく柔軟に設定できます。
Android 15 の最新の改善点を使用してアプリのユーザー エクスペリエンスを改善する方法について詳しくは、Google I/O の Android アプリのユーザー エクスペリエンスを改善するをご覧ください。
Generated Previews API によるリッチなウィジェット プレビュー
Android 15 より前は、ウィジェット選択ツールのプレビューを表示する唯一の方法は、静的な画像またはレイアウト リソースを指定することです。多くの場合、このようなプレビューは、ホーム画面に配置したときの実際のウィジェットの外観とは大きく異なります。また、Jetpack Glance では静的リソースを作成できないため、Glance のデベロッパーはウィジェットのスクリーンショットを作成するか、XML レイアウトを作成してウィジェットのプレビューを表示する必要がありました。
Android 15 では、生成されたプレビューのサポートが追加されています。つまり、アプリ ウィジェット プロバイダは、静的リソースの代わりに選択ツールのプレビューとして使用する RemoteViews
を生成できます。
![](https://developer.android.com/static/about/versions/15/images/generated-previews.png?authuser=0000&hl=ja)
push API
アプリは、生成されたプレビューを push API を介して提供できます。アプリはライフサイクルのどの時点でもプレビューを提供できます。プレビューを提供するようにホストから明示的なリクエストを受け取ることはありません。プレビューは AppWidgetService
に保持され、ホストはオンデマンドでリクエストできます。次の例では、XML ウィジェットのレイアウト リソースを読み込んでプレビューとして設定しています。
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
SociaLiteAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
想定されるフローは次のとおりです。
- ウィジェット プロバイダは常に
setWidgetPreview
を呼び出します。提供されたプレビューは、他のプロバイダ情報とともにAppWidgetService
に保持されます。 setWidgetPreview
は、AppWidgetHost.onProvidersChanged
コールバックを介して、更新されたプレビューをホストに通知します。これに応じて、ウィジェットのホストはすべてのプロバイダ情報を再読み込みします。- ウィジェットのプレビューを表示すると、ホストは
AppWidgetProviderInfo.generatedPreviewCategories
を確認し、選択されたカテゴリが使用可能な場合は、AppWidgetManager.getWidgetPreview
を呼び出して、このプロバイダの保存済みプレビューを返します。
setWidgetPreview
を呼び出すタイミング
プレビューを提供するためのコールバックがないため、アプリは実行中の任意の時点でプレビューを送信することを選択できます。プレビューを更新する頻度は、ウィジェットのユースケースによって異なります。
次のリストでは、プレビューのユースケースの 2 つの主なカテゴリについて説明します。
- パーソナライズされた情報や最新情報などの実際のデータをウィジェットのプレビューに表示するプロバイダ。これらのプロバイダは、ユーザーがログインするかアプリで初期構成を行った後に、プレビューを設定できます。その後、選択した頻度でプレビューを更新する定期的なタスクを設定できます。このタイプのウィジェットの例としては、写真ウィジェット、カレンダー ウィジェット、天気ウィジェット、ニュース ウィジェットなどがあります。
- プレビューやクイック アクション ウィジェットに静的情報(データが表示されない)を表示するプロバイダ。これらのプロバイダは、アプリの初回起動時にプレビューを 1 回設定できます。このタイプのウィジェットの例としては、ドライブのクイック アクション ウィジェットや Chrome ショートカット ウィジェットなどがあります。
プロバイダによっては、ハブモード選択ツールに静的プレビューが表示されていても、ホーム画面選択ツールに実際の情報が表示される場合があります。これらのプロバイダは、両方のユースケースのガイダンスに従ってプレビューを設定する必要があります。
ピクチャー イン ピクチャー
Android 15 では、ピクチャー イン ピクチャー(PIP)に新しい変更が導入され、PIP モードに移行する際の移行がよりスムーズになりました。これは、PIP に入る UI 要素をメイン UI の上にオーバーレイしているアプリに役立ちます。
デベロッパーは onPictureInPictureModeChanged
コールバックを使用して、オーバーレイされた UI 要素の表示を切り替えるロジックを定義します。このコールバックは、PIP の開始アニメーションまたは終了アニメーションが完了するとトリガーされます。Android 15 以降では、PictureInPictureUiState
クラスに新しい状態が含まれています。
この新しい UI の状態では、Android 15 をターゲットとするアプリでは、PIP アニメーションが開始したらすぐに、isTransitioningToPip()
で Activity#onPictureInPictureUiStateChanged
コールバックが呼び出されます。提案、公開予定の動画、評価、タイトルなどの情報を含むビューやレイアウトなど、PIP モードのアプリには関係のない UI 要素が多数あります。アプリが PIP モードになったら、onPictureInPictureUiStateChanged
コールバックを使用してこれらの UI 要素を非表示にします。アプリが PIP ウィンドウから全画面モードに移行したら、次の例に示すように、onPictureInPictureModeChanged
コールバックを使用してこれらの要素を再表示します。
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
if (isInPictureInPictureMode) {
// Unhide UI elements
}
}
PIP ウィンドウに関係のない UI 要素の表示を簡単に切り替えられるため、PIP 開始アニメーションが滑らかでちらつきません。
サイレント モード ルールの改善
AutomaticZenRule
を使用すると、アプリはアテンション管理(サイレント モード)ルールをカスタマイズし、いつ有効にするか無効にするかを決定できます。Android 15 では、ユーザー エクスペリエンスの向上を目的として、これらのルールが大幅に強化されています。次の機能強化が含まれています。
AutomaticZenRule
にタイプを追加し、システムで一部のルールに特別な処理を適用できるようにしました。AutomaticZenRule
にアイコンを追加して、モードを認識しやすくしました。- ユーザーに対してルールをアクティブにする条件を記述する
triggerDescription
文字列をAutomaticZenRule
に追加します。 AutomaticZenRule
にZenDeviceEffects
が追加され、グレースケール表示、夜間モード、壁紙を暗くするなどのルールをトリガーできるようになりました。
通知チャンネルの VibrationEffect を設定する
Android 15 では、NotificationChannel.setVibrationEffect
を使用してチャンネルごとに着信通知にリッチ バイブレーションを設定できるため、ユーザーはデバイスを見ることなく、さまざまな種類の通知を区別できます。
大画面とフォーム ファクタ
Android 15 では、大画面、フリップ式デバイス、折りたたみ式デバイスなど、Android のフォーム ファクタを最大限に活用するためのサポートがアプリで提供されています。
大画面でのマルチタスクの改善
Android 15 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.
Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.
カバー画面のサポート
アプリは、サポートされているフリップ式デバイスの小さなカバー画面に Application
または Activity
を表示できるように、Android 15 で使用されるプロパティを宣言できます。これらの画面は小さすぎるため、Android アプリの実行可能なターゲットとして見なされませんが、アプリでサポートをオプトインすることで、より多くの場所でアプリを利用できるようになります。
接続
Android 15 ではプラットフォームが更新され、アプリは最新の通信技術とワイヤレス技術にアクセスできます。
衛星のサポート
Android 15 では、引き続き衛星接続のプラットフォーム サポートを拡張しており、衛星接続の状況全体で一貫したユーザー エクスペリエンスを実現するため、いくつかの UI 要素が含まれています。
アプリは ServiceState.isUsingNonTerrestrialNetwork()
を使用して、デバイスが衛星に接続されていることを検出できます。これにより、完全なネットワーク サービスが利用できない理由について、より認識しやすくなります。また、Android 15 では、SMS アプリと MMS アプリ、プリロードされた RCS アプリで、衛星接続を使用してメッセージを送受信できます。
![](https://developer.android.com/static/about/versions/15/images/satellite-notification.png?authuser=0000&hl=ja)
NFC の操作性が向上
Android 15 is working to make the tap to pay experience more seamless and
reliable while continuing to support Android's robust NFC app ecosystem. On
supported devices, apps can request the NfcAdapter
to enter
observe mode, where the device listens but doesn't respond to NFC
readers, sending the app's NFC service PollingFrame
objects to process. The PollingFrame
objects can be used to auth
ahead of the first communication to the NFC reader, allowing for a one tap
transaction in many cases.
In addition, apps can now register a filter on supported devices so they can be notified of polling loop activity, which allows for smooth operation with multiple NFC-aware applications.
ウォレットの役割
Android 15 では、ユーザーが使用するウォレット アプリとより緊密に統合できるウォレットの新しいロールが導入されています。このロールは、NFC のデフォルトの非接触型決済の設定に代わるものです。ウォレットのロールを保持するユーザーは、[設定] > [アプリ] > [デフォルト アプリ] に移動して管理できます。
ウォレットのロールは、支払いカテゴリに登録されている AID に NFC タップをルーティングする場合に使用します。同じ AID に登録されている別のアプリがフォアグラウンドで実行されている場合を除き、タップは常にウォレットのロール所有者に移動します。
このロールは、ウォレットのクイックアクセス タイルが有効な場合にどこに配置するかを決定するためにも使用されます。ロールが「なし」に設定されている場合、QuickAccess タイルは使用できず、支払いカテゴリの NFC タップはフォアグラウンド アプリにのみ配信されます。
セキュリティ
Android 15 では、アプリのセキュリティの強化、アプリのデータの保護、ユーザーによるデータの透明性と管理が可能になります。ユーザーの安全保護対策を改善し、新たな脅威からアプリを保護するために Google が行っている取り組みについて詳しくは、Google I/O の Android でのユーザー セキュリティの保護に関する講演をご覧ください。
認証情報マネージャーを自動入力と統合する
Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.
生体認証プロンプトにシングルタップによる登録とログインを統合
Credential Manager integrates biometric prompts into the credential creation and sign-in processes, eliminating the need for providers to manage biometric prompts. As a result, credential providers only need to focus on the results of the create and get flows, augmented with the biometric flow result. This simplified process creates a more efficient and streamlined credential creation and retrieval process.
エンドツーエンドの暗号化のための鍵管理
Android 15 で導入された E2eeContactKeysManager
は、暗号公開鍵の保存用に OS レベルの API を提供することで、Android アプリのエンドツーエンドの暗号化(E2EE)を容易にします。
E2eeContactKeysManager
は、プラットフォームの連絡先アプリと統合するように設計されています。これにより、ユーザーは連絡先の公開鍵を一元的に管理および検証できます。
コンテンツ URI に対する権限チェック
Android 15 では、コンテンツ URI に対して権限チェックを行う新しい API セットが導入されています。
Context.checkContentUriPermissionFull
: コンテンツ URI に対して完全な権限チェックを実行します。Activity
マニフェスト属性requireContentUriPermissionFromCaller
: アクティビティの起動時に、指定されたコンテンツ URI に指定された権限を適用します。Activity
呼び出し元のComponentCaller
クラス: アクティビティを起動したアプリを表します。
ユーザー補助
Android 15 では、ユーザーのユーザー補助機能を向上させる機能が追加されています。
点字の改善
Android 15 では、USB とセキュアな Bluetooth の両方で HID 標準を使用する点字ディスプレイを TalkBack でサポートできるようになりました。
マウスやキーボードで使用されている標準規格と同様に、Android は今後、より幅広い種類の点字ディスプレイをサポートするようになります。
多言語対応
Android 15 では、デバイスをさまざまな言語で使用する場合のユーザー エクスペリエンスに役立つ機能が追加されています。
CJK 可変フォント
Android 15 以降、中国語、日本語、韓国語(CJK)言語のフォント ファイル NotoSansCJK が可変フォントになりました。可変フォントを使用すると、CJK 言語でのクリエイティブ タイポグラフィの可能性が広がります。デザイナーは、より幅広いスタイルを検討し、以前は実現が困難または不可能だった、視覚に訴えるレイアウトを作成できます。
![](https://developer.android.com/static/about/versions/15/images/cjk-variable-font.png?authuser=0000&hl=ja)
文字間の両端揃え
Android 15 以降では、JUSTIFICATION_MODE_INTER_CHARACTER
を使用して、文字間隔を利用してテキストの両端揃えを行うことができます。単語間の両端揃えは Android 8.0(API レベル 26)で初めて導入されました。文字間両端揃えは、中国語や日本語などのセグメンテーションに空白文字を使用する言語でも同様の機能を提供します。
![](https://developer.android.com/static/about/versions/15/images/none-japanese.png?authuser=0000&hl=ja)
JUSTIFICATION_MODE_NONE
を使用した日本語テキストのレイアウト。![](https://developer.android.com/static/about/versions/15/images/none-english.png?authuser=0000&hl=ja)
JUSTIFICATION_MODE_NONE
を使用した英語テキストのレイアウト。![](https://developer.android.com/static/about/versions/15/images/inter-word-japanese.png?authuser=0000&hl=ja)
JUSTIFICATION_MODE_INTER_WORD
を使用した日本語テキストのレイアウト。![](https://developer.android.com/static/about/versions/15/images/inter-word-english.png?authuser=0000&hl=ja)
JUSTIFICATION_MODE_INTER_WORD
を使用した英語テキストのレイアウト。![](https://developer.android.com/static/about/versions/15/images/inter-character-japanese.png?authuser=0000&hl=ja)
JUSTIFICATION_MODE_INTER_CHARACTER
を使用した日本語テキストのレイアウト。![](https://developer.android.com/static/about/versions/15/images/inter-character-english.png?authuser=0000&hl=ja)
JUSTIFICATION_MODE_INTER_CHARACTER
を使用した英語テキストのレイアウト。改行の自動設定
Android started supporting phrase-based line breaks for Japanese and Korean in
Android 13 (API level 33). However, while phrase-based line breaks improve the
readability of short lines of text, they don't work well for long lines of text.
In Android 15, apps can now apply phrase-based line breaks only for short lines
of text, using the LINE_BREAK_WORD_STYLE_AUTO
option. This option selects the best word style option for the text.
For short lines of text, phrase-based line breaks are used, functioning the same
as LINE_BREAK_WORD_STYLE_PHRASE
, as shown in the
following image:
![](https://developer.android.com/static/about/versions/15/images/line-break-auto-short.png?authuser=0000&hl=ja)
LINE_BREAK_WORD_STYLE_AUTO
applies phrase-based line breaks to improve the readability of the text.
This is the same as applying
LINE_BREAK_WORD_STYLE_PHRASE
.For longer lines of text, LINE_BREAK_WORD_STYLE_AUTO
uses a no
line-break word style, functioning the same as
LINE_BREAK_WORD_STYLE_NONE
, as shown in the
following image:
![](https://developer.android.com/static/about/versions/15/images/line-break-auto-long.png?authuser=0000&hl=ja)
LINE_BREAK_WORD_STYLE_AUTO
applies no line-break word style to improve the readability of the text.
This is the same as applying
LINE_BREAK_WORD_STYLE_NONE
.新しい日本語の変態文字フォント
Android 15 では、古い日本語のひらがな(変名)の新しいフォント ファイルがデフォルトでバンドルされています。変身長のユニークな形は、アートワークやデザインに独特の魅力をプラスし、古代日本の文書を正確に伝え、理解するのにも役立ちます。
![](https://developer.android.com/static/about/versions/15/images/hentaigana-font.png?authuser=0000&hl=ja)
VideoLAN cone Copyright (c) 1996-2010 VideoLAN. このロゴまたは修正版は、VideoLAN プロジェクト、または VideoLAN チームが開発したプロダクトに言及するために、誰でも使用または変更することができますが、プロジェクトによる承認を示すものではありません。
Vulkan および Vulkan ロゴは、Khronos Group Inc.の登録商標です。
OpenGL は Hewlett Packard Enterprise の登録商標で、OpenGL ES ロゴは Khronos の許可を得て使用しています。