Android 15 為開發人員推出了強大的新功能和 API。以下各節會概述這些功能,協助您開始使用相關 API。
如需新增、修改及移除 API 的詳細清單,請參閱 API 差異比較報表。如要進一步瞭解新增的 API,請參閱 Android API 參考資料;如果是 Android 15,請查看在 API 級別 35 中新增的 API。如要瞭解平台變更可能會影響應用程式的哪些方面,請務必查看指定 Android 15 為目標的應用程式和所有應用程式適用的 Android 15 行為變更。
相機和媒體
Android 15 包含多種功能,可改善相機和媒體體驗,並提供工具和硬體,協助創作者在 Android 上實現創作構想。
如要進一步瞭解 Android 媒體和相機的最新功能和開發人員解決方案,請參閱 Google I/O 大會的「建構現代化 Android 媒體和相機體驗」演講。
低光源增強
Android 15 introduces Low Light Boost, an auto-exposure mode available to both Camera 2 and the night mode camera extension. Low Light Boost adjusts the exposure of the Preview stream in low-light conditions. This is different from how the night mode camera extension creates still images, because night mode combines a burst of photos to create a single, enhanced image. While night mode works very well for creating a still image, it can't create a continuous stream of frames, but Low Light Boost can. Thus, Low Light Boost enables camera capabilities, such as:
- Providing an enhanced image preview, so users are better able to frame their low-light pictures
- Scanning QR codes in low light
If you enable Low Light Boost, it automatically turns on when there's a low light level, and turns off when there's more light.
Apps can record off the Preview stream in low-light conditions to save a brightened video.
For more information, see Low Light Boost.
應用程式內攝影機控制項
Android 15 新增了擴充功能,讓你在支援的裝置上進一步控管相機硬體及其演算法:
HDR 頭尾空間控制
Android 15 會選擇適用於面板的基礎裝置功能和位元深度的 HDR 進步空間。如果頁面含有大量 SDR 內容 (例如顯示單一 HDR 縮圖的訊息應用程式),這項行為最後可能影響 SDR 內容的亮度。Android 15 可讓您使用 setDesiredHdrHeadroom
控制 HDR 進步空間,在 SDR 和 HDR 內容之間取得平衡。
音量控制
Android 15 開始支援 CTA-2075 音量標準,協助您 可避免音訊音量不一致的情況,同時確保使用者不必一直 調整音量。系統會利用輸出裝置 (耳機和喇叭) 的已知特性,以及 AAC 音訊內容提供的音量中繼資料,智慧調整音訊音量和動態範圍壓縮等級。
如要啟用這項功能,請務必確保檔案含有音量中繼資料
您的 AAC 內容,並在應用程式中啟用平台功能。為此,您
透過以下方式將 LoudnessCodecController
物件執行個體化:
呼叫其 create 工廠方法,並與音訊
來自相關聯 AudioTrack
的工作階段 ID;本
系統就會開始自動套用音訊更新您可以傳遞 OnLoudnessCodecUpdateListener
,藉此修改或篩選音量參數,再套用至 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 也會更新,使用
透過 LoudnessCodecController
API 完美整合應用程式。
虛擬 MIDI 2.0 裝置
Android 13 新增了支援功能,可透過 USB 連線至MIDI 2.0 裝置,並透過通用 MIDI 封包 (UMP) 進行通訊。Android 15 將 UMP 支援擴充為虛擬 MIDI 應用程式,方便組合應用程式控制合成器應用程式 安裝 MIDI 2.0 虛擬裝置,就像使用 USB MIDI 2.0 裝置一樣。
提高 AV1 軟體解碼效率
dav1d 是 VideoLAN 的熱門 AV1 軟體解碼器,現可用於硬體中不支援 AV1 解碼的 Android 裝置。dav1d 的效能比舊版 AV1 軟體解碼器高出 3 倍,可讓更多使用者 (包括一些低階和中階裝置) 透過 HD AV1 播放。
目前,應用程式必須以 "c2.android.av1-dav1d.decoder"
的名稱叫用 dav1d,以便選擇加入 dav1d。後續更新會將 dav1d 設為預設 AV1 軟體解碼器。這項支援功能經過標準化及向後移植至收到 Google Play 系統更新的 Android 11 裝置。
開發人員工作效率和工具
在改善效率提升中心的大部分工作中,我們都會以 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 對 PdfRenderer
進行了大幅改善。
相互整合應用程式可導入轉譯等進階功能
受密碼保護的檔案、註解、表單編輯、
搜尋及選取副本。支援線性化 PDF 最佳化功能,可加快本機 PDF 檢視速度並減少資源使用量。Jetpack PDF 程式庫會使用這些 API,簡化在應用程式中新增 PDF 檢視功能的程序。
PdfRenderer
已移至可透過 Google Play 系統更新進行更新的模組,不受平台版本影響。我們會透過建立與 Android 15 以下版本相容的 API 途徑 (稱為 PdfRendererPreV
),將這些變更回溯至 Android 11 (API 級別 30)。
自動切換語言的細微調整
Android 14 新增了裝置端的多語言辨識功能,支援自動切換語言,但這可能會導致字詞遭到捨棄,尤其是在語言切換時,兩個語音之間的停頓幅度較小。Android 15 新增了額外控制項,協助應用程式調整相關用途。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
會限制自動切換至音訊工作階段開頭,EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
則會在經過指定數量的切換按鈕後停用語言切換功能。如果您預期會在工作階段應自動偵測單一語言,就很適合使用這些選項。
改良的 OpenType Variable Font API
Android 15 改善了 OpenType 變數字型的可用性。您現在可以
在不指定變數的情況下,使用變數字型建立 FontFamily
執行個體
使用 buildVariableFamily
API 加權軸。文字轉譯器覆寫設定
與顯示文字相符的 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
沒有
建立準確的字型粗細
Font
例項,因此轉譯器會改回使用最接近的權重。如此
那麼轉譯值會是 300 而不是 350,而是顯示 400,而非 450;且
依此類推相反地,使用新 API 建立的 Typeface
會以動態方式建立
指定權重的 Font
例項,因此會以 350 為單位呈現準確的權重
450、550 和 650。
精細的換行控制
從 Android 15 開始,TextView
和基礎的斷行元件可保留文字的指定部分,以便在同一行中顯示,藉此改善可讀性。您可以在字串資源或 createNoBreakSpan
中使用 <nobreak>
標記,充分利用這項換行自訂功能。同樣地,您也可以使用 <nohyphen>
標記或 createNoHyphenationSpan
,避免系統斷字。
舉例來說,下列字串資源未包含換行符號,因此在顯示「Pixel 8 Pro」時,文字會在不適當的位置中斷:
<resources>
<string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>
相反地,這個字串資源包含 <nobreak>
標記,可將「Pixel 8 Pro」這個詞組包起來,並防止換行:
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
下圖顯示這些字串的算繪方式差異:
應用程式封存
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 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 hardware has evolved quite a bit from the early days where the core OS would run on a single CPU and GPUs were accessed using APIs based on fixed-function pipelines. The Vulkan® graphics API has been available in the NDK since Android 7.0 (API level 24) with a lower-level abstraction that better reflects modern GPU hardware, scales better to support multiple CPU cores, and offers reduced CPU driver overhead — leading to improved app performance. Vulkan is supported by all modern game engines.
Vulkan is Android's preferred interface to the GPU. Therefore, Android 15 includes ANGLE as an optional layer for running OpenGL® ES on top of Vulkan. Moving to ANGLE will standardize the Android OpenGL implementation for improved compatibility, and, in some cases, improved performance. You can test out your OpenGL ES app stability and performance with ANGLE by enabling the developer option in Settings -> System -> Developer Options -> Experimental: Enable ANGLE on Android 15.
The Android ANGLE on Vulkan roadmap
As part of streamlining our GPU stack, going forward we will be shipping ANGLE as the GL system driver on more new devices, with the future expectation that OpenGL/ES will be only available through ANGLE. That being said, we plan to continue support for OpenGL ES on all devices.
Recommended next steps
Use the developer options to select the ANGLE driver for OpenGL ES and test your app. For new projects, we strongly encourage using Vulkan for C/C++.
改善 Canvas
Android 15 continues our modernization of Android's Canvas graphics system with additional capabilities:
Matrix44
provides a 4x4 matrix for transforming coordinates that should be used when you want to manipulate the canvas in 3D.clipShader
intersects the current clip with the specified shader, whileclipOutShader
sets the clip to the difference of the current clip and the shader, each treating the shader as an alpha mask. This supports the drawing of complex shapes efficiently.
效能和電池
Android 持續致力於協助您改善應用程式的效能和品質。Android 15 推出了 API,可協助您更有效率地執行應用程式工作、最佳化應用程式效能,以及收集應用程式深入分析資訊。
如要瞭解省電最佳做法、網路和電力使用情況偵錯,以及我們如何改善 Android 15 和近期 Android 版本的背景工作電池效率,請參閱 Google I/O 的「Improving battery efficiency of background work on Android」(改善 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.
詳細應用程式大小資訊
Since Android 8.0 (API level 26), Android has included the
StorageStats.getAppBytes
API that summarizes the installed
size of an app as a single number of bytes, which is a sum of the APK size, the
size of files extracted from the APK, and files that were generated on the
device such as ahead-of-time (AOT) compiled code. This number is not very
insightful in terms of how your app is using storage.
Android 15 adds the
StorageStats.getAppBytesByDataType([type])
API, which lets
you get insight into how your app is using up all that space, including APK file
splits, AOT and speedup related code, dex metadata, libraries, and guided
profiles.
應用程式管理的剖析
Android 15 包含 ProfilingManager
類別,可讓您從應用程式內收集剖析資訊,例如記憶體快照資料、記憶體快照資料、堆疊取樣等。它會為您的應用程式提供回呼,並提供標記來識別輸出檔案,該檔案會傳送至應用程式的檔案目錄。API 會實施頻率限制,盡可能降低對效能的影響。
如要簡化應用程式中的剖析要求建構程序,建議您使用對應的 Profiling
AndroidX API (適用於 Core 1.15.0-rc01 以上版本)。
SQLite 資料庫改善功能
Android 15 推出 SQLite API,可公開基礎 SQLite 引擎的進階功能,針對應用程式可能出現的特定效能問題進行調整。這些 API 已隨 SQLite 更新至 3.44.3 版一併提供。
開發人員應參考提升 SQLite 效能的最佳做法 充分運用 SQLite 資料庫,尤其是處理大型資料集時 或執行容易受到延遲時間影響的查詢時
- 唯讀延遲交易:在發出唯讀交易 (不包含寫入陳述式) 時,請使用
beginTransactionReadOnly()
和beginTransactionWithListenerReadOnly(SQLiteTransactionListener)
發出唯讀DEFERRED
交易。這類交易可以同時執行,如果資料庫處於 WAL 模式,則可以與IMMEDIATE
或EXCLUSIVE
交易同時執行。 - 資料列計數與 ID:新增了 API 以擷取已變更的計數
資料列或上次插入的資料列 ID,且無須發出額外查詢。
getLastChangedRowCount()
會傳回資料列數量 最新的 SQL 陳述式已插入、更新或刪除 目前交易,而getTotalChangedRowCount()
會傳回目前連線的計數。getLastInsertRowId()
會傳回要在目前連線中插入的最後一列的rowid
。 - 原始陳述式:發布原始 SQlite 陳述式,略過便利性 以及可能會產生的任何額外處理負擔。
Android 動態效能架構更新
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 adds 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
,其中包含一組 UriRelativeFilter
物件,可形成一組必須滿足的 Intent
比對規則,包括網址查詢參數、網址片段,以及封鎖或排除規則。
您可以在 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" />
<category android:name="android.intent.category.DEFAULT" />
<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>
私人空間
私人空間可讓使用者在裝置上建立獨立空間,並允許他們存取 能防止敏感應用程式遭到窺探 驗證。私人空間會使用獨立的使用者個人資料。使用者可以 可以選擇使用裝置鎖定功能,或為私人空間設定獨立的鎖定方式。
私人空間中的應用程式會顯示在啟動器中的獨立容器中。 不會顯示在「最近」檢視畫面、通知、設定和其他應用程式中 私人空間鎖定時就會傳送快訊使用者撰寫及下載的內容 (例如 媒體或檔案) 和帳戶,就在私人空間和 主要空間。系統 Sharesheet 和 相片挑選工具可用於授權應用程式存取內容 私人空間。
使用者無法將現有的應用程式及其資料移至私人空間。 使用者要透過私人空間的安裝選項安裝應用程式 提供線上應用程式私人空間中的應用程式會以下列形式安裝: 將副本與主空間中的任何應用程式分開 (相同應用程式的新副本)。
使用者鎖定私人空間後,設定檔就會停止。個人資料期間 已停止,私人空間中的應用程式已停止運作,因此無法執行 前景或背景活動,包括顯示通知。
建議您使用私人空間測試應用程式,確保應用程式 可正常運作,尤其是以下類型的應用程式 類別:
- 具備工作資料夾邏輯的應用程式,假設應用程式設有 不在主要設定檔中, 工作資料夾。
- 醫療應用程式
- 啟動器應用程式
- 應用程式商店應用程式
查詢使用者最近一次選取的「指定相片存取權」
現在應用程式只能醒目顯示最近選取的相片
。這個
功能可改善經常要求的應用程式使用者體驗
存取相片和影片。如要在應用程式中使用這項功能,請啟用
查詢 MediaStore
時,QUERY_ARG_LATEST_SELECTION_ONLY
引數
透過 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 版 Privacy Sandbox
Android 15 包含最新的 Android 廣告服務擴充功能,並納入最新版本的 Android 版 Privacy Sandbox。這些額外措施是我們開發新技術的一環,旨在改善使用者隱私並打造行動應用程式中成效良好的個人化廣告體驗。如要進一步瞭解 Android 版 Privacy Sandbox 開發人員預覽版和 Beta 版計畫,請參閱隱私權沙箱頁面,瞭解如何開始使用。
Health Connect
Android 15 整合了 Health Connect by Android 的最新擴充功能,這是一個安全且集中式的平台,可用於管理及分享應用程式收集的健康與健身資料。這次更新新增了健身、營養、皮膚溫度、訓練計畫等其他資料類型的支援。
皮膚溫度追蹤功能可讓使用者透過穿戴式裝置或其他追蹤裝置,儲存及分享更準確的溫度資料。
訓練計畫是結構化的運動計畫,可協助使用者達成健身目標。訓練計畫支援各種完成和表現目標:
如要進一步瞭解 Android 中的 Health Connect 最新更新,請觀看 Google I/O 大會的 透過 Android 健康資料建構可調整的體驗演講。
分享局部螢幕畫面
使用者體驗和系統 UI
Android 15 可讓應用程式開發人員和使用者更靈活地控管及設定裝置,以符合自身需求。
如要進一步瞭解如何使用 Android 15 的最新改善功能來改善應用程式的使用者體驗,請參閱 Google I/O 大會的改善 Android 應用程式的使用者體驗。
使用 Generated Previews API 提供更豐富的小工具預覽畫面
Before Android 15, the only way to provide widget picker previews was to specify a static image or layout resource. These previews often differ significantly from the look of the actual widget when it is placed on the home screen. Also, static resources can't be created with Jetpack Glance, so a Glance developer had to screenshot their widget or create an XML layout to have a widget preview.
Android 15 adds support for generated previews. This means that app widget
providers can generate RemoteViews
to use as the picker preview, instead
of a static resource.
Push API
Apps can provide generated previews through a push API. Apps can provide
previews at any point in their lifecycle, and don't receive an explicit request
from the host to provide previews. Previews are persisted in AppWidgetService
,
and hosts can request them on-demand. The following example loads an XML widget
layout resource and sets it as the preview:
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
SociaLiteAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
The expected flow is:
- At any time, the widget provider calls
setWidgetPreview
. The provided previews are persisted inAppWidgetService
with other provider info. setWidgetPreview
notifies hosts of an updated preview through theAppWidgetHost.onProvidersChanged
callback. In response, the widget host reloads all of its provider information.- When displaying a widget preview, the host checks
AppWidgetProviderInfo.generatedPreviewCategories
, and if the chosen category is available, callsAppWidgetManager.getWidgetPreview
to return the saved preview for this provider.
When to call setWidgetPreview
Because there is no callback to provide previews, apps can choose to send previews at any point when they are running. How often to update the preview depends on the widget's use case.
The following list describes the two main categories of preview use cases:
- Providers that show real data in their widget previews, such as personalized or recent information. These providers can set the preview once the user has signed in or has done initial configuration in their app. After this, they can set up a periodic task to update the previews at their chosen cadence. Examples of this type of widget could be a photo, calendar, weather or news widget.
- Providers that show static information in previews or quick-action widgets that don't display any data. These providers can set previews once, when the app first launches. Examples of this type of widget include a drive quick actions widget or chrome shortcuts widget.
Some providers might show static previews on the hub mode picker, but real information on the homescreen picker. These providers should follow the guidance for both of these use cases to set previews.
子母畫面
Android 15 introduces changes in Picture-in-Picture (PiP) ensuring an even smoother transition when entering into PiP mode. This will be beneficial for apps having UI elements overlaid on top of their main UI, which goes into PiP.
Developers use the onPictureInPictureModeChanged
callback to define logic
that toggles the visibility of the overlaid UI elements. This callback is
triggered when the PiP enter or exit animation is completed. Beginning in
Android 15, the PictureInPictureUiState
class includes another state.
With this UI state, apps targeting Android 15 (API level 35) will observe the
Activity#onPictureInPictureUiStateChanged
callback being invoked with
isTransitioningToPip()
as soon as the PiP animation starts. There are
many UI elements that are not relevant for the app when it is in PiP mode, for
example views or layout that include information such as suggestions, upcoming
video, ratings, and titles. When the app goes to PiP mode, use the
onPictureInPictureUiStateChanged
callback to hide these UI elements. When the
app goes to full screen mode from the PiP window, use
onPictureInPictureModeChanged
callback to unhide these elements, as shown in
the following examples:
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
if (isInPictureInPictureMode) {
// Unhide UI elements
}
}
This quick visibility toggle of irrelevant UI elements (for a PiP window) helps ensure a smoother and flicker-free PiP enter animation.
改善「零打擾」規則
AutomaticZenRule
lets apps customize Attention
Management (Do Not Disturb) rules and decide when to activate or deactivate
them. Android 15 greatly enhances these rules with the goal of improving the
user experience. The following enhancements are included:
- Adding types to
AutomaticZenRule
, allowing the system to apply special treatment to some rules. - Adding an icon to
AutomaticZenRule
, helping to make the modes be more recognizable. - Adding a
triggerDescription
string toAutomaticZenRule
that describes the conditions on which the rule should become active for the user. - Added
ZenDeviceEffects
toAutomaticZenRule
, allowing rules to trigger things like grayscale display, night mode, or dimming the wallpaper.
為通知管道設定 VibrationEffect
Android 15 支援使用 NotificationChannel.setVibrationEffect
為特定管道設定豐富的震動效果,讓使用者不必查看裝置,就能區分不同類型的通知。
媒體投影狀態列方塊和自動停止
Media projection can expose private user information. A new, prominent status bar chip makes users aware of any ongoing screen projection. Users can tap the chip to stop screen casting, sharing, or recording. Also, for a more intuitive user experience, any in‑progress screen projection now automatically stops when the device screen is locked.
大螢幕和板型規格
Android 15 可讓應用程式充分運用 Android 板型規格,包括大螢幕、折疊式裝置和折疊式裝置。
改善大螢幕多工處理
Android 15 可讓使用者在大螢幕裝置上更妥善地進行多工處理。適用對象 舉例來說,使用者可以儲存喜愛的分割畫面應用程式組合,以便快速 ,並將工作列固定在畫面上,即可快速切換應用程式。也就是說 確保應用程式會自動調適,比以往更重要。
Google I/O 大會建構可自動調整的 Android 環境 應用程式以及使用 Material 3 建構使用者介面 自動調整程式庫 這能幫助您,而我們的說明文件也更勝以往,能進一步協助您運用大型語言設計 螢幕。
支援封面螢幕
應用程式可以宣告 Android 15 用來宣告的屬性,以便讓您的 Application
或 Activity
顯示在支援的可滑動裝置小封面螢幕。這些畫面太小,無法視為 Android 應用程式的相容目標,但您的應用程式可以選擇支援這些畫面,藉此在更多地方提供您的應用程式。
連線能力
Android 15 會更新平台,讓應用程式存取通訊和無線技術的最新進展。
衛星支援
Android 15 持續擴大平台支援範圍,包括衛星連線,以及 包含一些 UI 元素,確保 衛星連線環境。
應用程式可以使用 ServiceState.isUsingNonTerrestrialNetwork()
執行下列操作:
會偵測裝置是否與衛星連線
可能無法使用完整網路服務的原因此外,Android 15
支援簡訊和多媒體訊息應用程式,以及預先載入的 RCS 應用程式
可以收發訊息的衛星連線。
更順暢的 NFC 體驗
Android 15 致力在繼續支援 Android 強大的 NFC 應用程式生態系統的同時,提供更順暢可靠的感應支付體驗。在支援的裝置上,應用程式可以要求 NfcAdapter
進入「觀測模式」,此時裝置會監聽,但不會回應 NFC 讀取器,並傳送應用程式的 NFC 服務 PollingFrame
物件來處理。在首次與 NFC 讀取器通訊之前,可以使用 PollingFrame
物件進行驗證,這樣在多數情況下就能進行一次輕觸交易。
此外,應用程式現在可以在支援的裝置上註冊篩選器,以便在輪詢迴圈活動時收到通知,讓多個 NFC 感知應用程式都能順暢運作。
錢包角色
Android 15 導入了新的錢包角色,可更緊密地與使用者偏好的錢包應用程式整合。這個角色會取代 NFC 預設的感應支付設定。使用者可以依序前往「設定」>「應用程式」>「預設應用程式」,管理錢包角色持有人。
針對付款類別中註冊的 AID 進行 NFC 感應支付時,系統會使用「錢包」角色。除非在前景中執行註冊相同 AID 的另一個應用程式,否則感應功能會一律傳送至錢包角色持有者。
這個角色也能用來判斷在啟用錢包 QuickAccess 圖塊後應前往的位置。將角色設為「None」時,則無法使用 QuickAccess 設定方塊,且付款類別的 NFC 輕觸動作只會傳送至前景應用程式。
安全性
Android 15 可協助您提升應用程式的安全性、保護應用程式資料,並讓使用者更清楚瞭解及掌控自己的資料。請參閱 Google I/O 的「在 Android 上保護使用者安全」演講,進一步瞭解我們如何改善使用者安全防護機制,並防範應用程式遭到新威脅攻擊。
將 Credential Manager 與自動填入功能整合
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 會將生物特徵辨識提示訊息整合至憑證建立和登入程序,因此提供者不必管理生物特徵辨識提示訊息。因此,憑證提供者只需要專注於 建立和取得流量的結果,並透過生物特徵辨識流程結果增強。 這個簡化程序可建立更有效率且精簡的憑證建立和擷取程序。
端對端加密的金鑰管理
我們將在 Android 15 中推出 E2eeContactKeysManager
,藉由提供 OS 層級 API 來儲存加密編譯公開金鑰,進而在 Android 應用程式中加入端對端加密 (E2EE)。
E2eeContactKeysManager
的設計旨在與平台聯絡應用程式整合,讓使用者能集中管理及驗證聯絡人的公開金鑰。
內容 URI 的權限檢查
Android 15 導入了一組新的 API,可對內容 URI 執行權限檢查:
Context.checkContentUriPermissionFull
:這會對內容 URI 執行完整權限檢查。Activity
資訊清單屬性requireContentUriPermissionFromCaller
:這會在活動啟動時對提供的內容 URI 強制執行指定權限。Activity
呼叫端的ComponentCaller
類別:代表啟動活動的應用程式。
無障礙設定
Android 15 新增了可改善使用者無障礙體驗的功能。
改善點字
在 Android 15 中,我們讓 TalkBack 能夠支援透過 USB 和安全藍牙採用 HID 標準的點字顯示器。
如同滑鼠和鍵盤所使用的標準,Android 日後將支援更多點字顯示器。
國際化
Android 15 新增了功能,可在使用不同語言的裝置上提供更完善的使用者體驗。
CJK 變數字型
自 Android 15 起,中文、日文和韓文 (CJK) 語言的字型檔案現在是可變的字型。變數字型為 CJK 語言的廣告素材字體排版開啟了新的可能性。設計人員可以探索更多樣式,建立視覺效果引人注目的版面配置,而這些版面配置原本難以實現或無法實現。
字元間對齊
從 Android 15 開始,系統可根據字母間距,使用字母間距
使用 JUSTIFICATION_MODE_INTER_CHARACTER
。有多字的理由
Android 8.0 (API 級別 26) 首次推出的功能,以及跨字元
對於使用
空白字元做為區隔,例如中文、日文等。
自動換行設定
Android 已開始在下列國家/地區支援日文和韓文的詞組換行符號:
Android 13 (API 級別 33)。不過,雖然使用詞組的分行符號改善了
簡短的文字易讀性,對長行文字的效果不佳。
在 Android 15 中,應用程式只能針對短行套用以詞組為準的換行符號
方法是使用 LINE_BREAK_WORD_STYLE_AUTO
如果有需要 SQL 指令的分析工作負載
則 BigQuery 可能是最佳選擇這個選項可為文字選取最合適的字詞樣式選項。
以短行文字來說,使用以詞組為基準的換行符號,運作方式也相同
如 LINE_BREAK_WORD_STYLE_PHRASE
,如
如下圖片:
對於較長的文字,LINE_BREAK_WORD_STYLE_AUTO
會使用 no
斷行文字樣式,功能與
LINE_BREAK_WORD_STYLE_NONE
,如
如下圖片:
額外的日文平假字字型
在 Android 15 中,這是日文平假名 (也稱為 Hentaigana) 的字型檔案 系統預設會整合在一起由於平假名字元的形狀獨特,因此可為圖像或設計增添獨特風格,同時也能確保古代日本文件的正確傳遞和理解。
VideoLAN cone Copyright (c) 1996-2010 VideoLAN,任何人都可以使用或修改此標誌或修改後的版本,以參照 VideoLAN 專案或 VideoLAN 團隊開發的任何產品,但不代表專案背書。
Vulkan 和 Vulkan 標誌是 Khronos Group Inc.的註冊商標。
OpenGL 是註冊商標,OpenGL ES 標誌是 Khronos 許可使用的 Hewlett Packard Enterprise 商標。