Android 15 introduce funzionalità e API fantastiche per gli sviluppatori. Le sezioni seguenti riepilogano queste funzionalità per aiutarti a iniziare a utilizzare le API correlate.
Per un elenco dettagliato delle API aggiunte, modificate e rimosse, leggi il report sulle differenze delle API. Per informazioni dettagliate sulle API aggiunte, consulta il riferimento all'API Android. Per Android 15, cerca le API aggiunte nel livello API 35. Per scoprire le aree in cui le modifiche alla piattaforma potrebbero influire sulle tue app, consulta le modifiche al comportamento di Android 15 per le app che hanno come target Android 15 e per tutte le app.
Fotocamera e contenuti multimediali
Android 15 include una serie di funzionalità che migliorano l'esperienza con la fotocamera e i contenuti multimediali e che ti consentono di accedere a strumenti e hardware per aiutare i creator a dare vita alle loro idee su Android.
Per saperne di più sulle funzionalità e sulle soluzioni per sviluppatori più recenti per contenuti multimediali e fotocamera Android, guarda il talk Creare esperienze multimediali e con la fotocamera Android moderne di Google I/O.
Low Light Boost
Android 15 introduce la funzionalità Migliora Luce scarsa, una nuova modalità di esposizione automatica disponibile sia per la Fotocamera 2 che per l'estensione della fotocamera in modalità notturna. Luce scarsa regola l'esposizione dello stream Anteprima in condizioni di scarsa illuminazione. Questo processo è diverso da come l'estensione della fotocamera per la modalità notturna crea immagini fisse, perché la modalità notturna combina una serie di foto a raffica per creare un'unica immagine migliorata. Anche se la modalità notturna funziona molto bene per creare un'immagine statica, non è in grado di creare un flusso continuo di frame, a differenza di Low Light Boost. Grazie a Low Light Boost, la fotocamera abilita nuove funzionalità, tra cui:
- Fornire un'anteprima migliorata delle immagini per consentire agli utenti di inquadrare meglio le immagini in condizioni di scarsa illuminazione
- Scansione dei codici QR in condizioni di scarsa illuminazione
Se attivi Low Light Boost, la funzionalità si accende automaticamente quando c'è poca luce e si spegne quando c'è più luce.
Le app possono registrare durante lo streaming dell'anteprima in condizioni di scarsa illuminazione per salvare un video con luminosità maggiore.
Per ulteriori informazioni, vedi Migliora Luce scarsa.
Controlli della fotocamera in-app
Android 15 aggiunge una nuova estensione per un maggiore controllo sull'hardware della fotocamera e sui suoi algoritmi sui dispositivi supportati:
- Regolazioni avanzate dell'intensità del flash che consentono di controllare con precisione l'intensità del flash in entrambe le modalità
SINGLE
eTORCH
durante l'acquisizione delle immagini.
Controllo del headroom HDR
Android 15 会选择适合底层设备功能和面板的位深的 HDR 余量。对于包含大量 SDR 内容的页面(例如显示单个 HDR 缩略图的即时通讯应用),此行为最终可能会对 SDR 内容的感知亮度产生不利影响。Android 15 允许您使用 setDesiredHdrHeadroom
控制 HDR 余量,以在 SDR 和 HDR 内容之间取得平衡。
Controllo della loudness
Android 15 引入了对 CTA-2075 响度标准的支持,可帮助您避免音频响度不一致,并确保用户在切换内容时不必不断调整音量。系统利用输出设备(头戴式耳机和扬声器)的已知特性以及 AAC 音频内容中提供的响度元数据,智能调整音频响度和动态范围压缩级别。
如需启用此功能,您需要确保 AAC 内容中提供响度元数据,并在应用中启用平台功能。为此,您可以通过使用关联的 AudioTrack
中的音频会话 ID 调用其 create 工厂方法来实例化 LoudnessCodecController
对象;这会自动开始应用音频更新。您可以传递 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,可实现无缝应用集成。
Dispositivi MIDI 2.0 virtuali
Android 13 ha aggiunto il supporto per la connessione ai dispositivi MIDI 2.0 tramite USB, che comunicano utilizzando Universal MIDI Packets (UMP). Android 15 estende il supporto di UMP alla tecnologia MIDI virtuale app, che consentono alle app di composizione di controllare le app di sintetizzatore come un dispositivo virtuale MIDI 2.0, proprio come farebbero con un dispositivo USB MIDI 2.0.
Decodifica software AV1 più efficiente
dav1d, il popolare decodificatore software AV1 di VideoLAN, è ora disponibile per i dispositivi Android che non supportano la decodifica AV1 nell'hardware. dav1d è fino a 3 volte più potente rispetto al decodificatore software AV1 legacy, consentendo la riproduzione HD AV1 per più utenti, inclusi alcuni dispositivi di livello medio e basso.
Per il momento, l'app deve attivare l'utilizzo di dav1d richiamandola per nome
"c2.android.av1-dav1d.decoder"
. dav1d diventerà il decodificatore software
predefinito di AV1 in un aggiornamento successivo. Questo supporto è standardizzato e sottoposto a backporting sui dispositivi Android 11 che ricevono aggiornamenti di sistema Google Play.
Produttività e strumenti per gli sviluppatori
Sebbene la maggior parte del nostro lavoro per migliorare la produttività si basi su strumenti come Android Studio, Jetpack Compose e le librerie Android Jetpack, cerchiamo sempre modi per aiutarti a realizzare più facilmente la tua visione.
Aggiornamenti di OpenJDK 17
Android 15 continua il lavoro di aggiornamento delle librerie di base di Android per allinearsi alle funzionalità delle ultime release di OpenJDK LTS.
Sono inclusi le funzioni e i miglioramenti principali riportati di seguito:
- Miglioramenti della qualità della vita per i buffer NIO
- Stream
- Altri metodi per
math
estrictmath
- Aggiornamenti dei pacchetti di
util
, tra cuicollection
,map
eset
in sequenza - Assistenza di
ByteBuffer
inDeflater
- Aggiornamenti della sicurezza come
X500PrivateCredential
e aggiornamenti dei token di sicurezza
Queste API vengono aggiornate su oltre un miliardo di dispositivi con Android 12 (livello API 31) e versioni successive tramite gli aggiornamenti di sistema di Google Play, in modo da poter scegliere come target le funzionalità di programmazione più recenti.
Miglioramenti ai PDF
Android 15 include miglioramenti sostanziali a PdfRenderer
su quelle di livello inferiore. Le app possono incorporare funzionalità avanzate come il rendering
file protetti da password, annotazioni, modifica di moduli,
ricerca e selezione con testo. Sono supportate le ottimizzazioni dei PDF linearizzati per velocizzare la visualizzazione dei PDF locali e ridurre l'utilizzo delle risorse.
La libreria Jetpack PDF utilizza queste API per semplificare l'aggiunta di file PDF
funzionalità di visualizzazione per la tua app.
PdfRenderer
è stato spostato in un modulo che può essere aggiornato utilizzando gli aggiornamenti di sistema di Google Play indipendentemente dalla release della piattaforma e supportiamo queste modifiche fino ad Android 11 (livello API 30) creando una versione compatibile pre-Android 15 dell'API, chiamata PdfRendererPreV
.
Perfezionamenti del passaggio automatico della lingua
Android 14 增加了设备端音频中的多语言识别功能,可在语言之间自动切换,但这可能会导致单词丢失,尤其是在语言切换时,两种话语之间的停顿较少时。Android 15 添加了额外的控件,可帮助应用根据其用例调整此切换。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
会将自动切换限制为仅在音频会话开始时进行,而 EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
则会在指定次数的切换后停用语言切换。如果您希望自动检测到会话期间只讲一种语言,这些选项特别有用。
API OpenType Variable Font migliorata
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
不包含
为 350、450、550 和 650 创建准确的字体粗细
Font
实例,因此渲染程序会回退到最接近的权重。在
在此示例中,系统会渲染 300 而不是 350,渲染 400 而不是 450,
依此类推。相比之下,使用新 API 创建的 Typeface
会动态创建
给定权重的 Font
实例,因此系统会渲染 350 的准确权重,
450、550 和 650。
Controlli granulari delle interruzioni di riga
A partire da Android 15, un TextView
e l'interruzione di riga sottostante possono conservare la parte di testo specificata nella stessa riga per migliorare la leggibilità. Puoi sfruttare questa personalizzazione dell'interruzione di riga utilizzando il tag <nobreak>
nelle risorse stringa o createNoBreakSpan
. Analogamente, puoi impedire la suddivisione delle parole in sillabe utilizzando il tag <nohyphen>
o createNoHyphenationSpan
.
Ad esempio, la seguente risorsa stringa non include un a capo e viene visualizzata con il testo "Pixel 8 Pro" interrotto in un punto indesiderato:
<resources>
<string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>
Al contrario, questa risorsa stringa include il tag <nobreak>
, che inserisce un a capo nella frase "Pixel 8 Pro" e impedisce gli a capo:
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
La differenza nel modo in cui queste stringhe vengono visualizzate è mostrata nelle seguenti immagini:
Archiviazione delle app
Android 和 Google Play 宣布支持最后的应用归档功能 年,这让用户可以通过移除部分内容来释放空间 通过 Android 应用发布的设备中不常用的应用 前往 Google Play 下载套装。Android 15 在操作系统级别支持应用归档和解压缩,让所有应用商店都能更轻松地实现归档和解压缩。
具有 REQUEST_DELETE_PACKAGES
权限的应用可以调用
PackageInstaller
requestArchive
方法请求归档
已安装的应用软件包,这会移除 APK 和所有缓存的文件,但会保留
用户数据已归档的应用会通过 LauncherApps
API 作为可显示的应用返回;用户会看到一个界面处理,以突出显示这些应用已归档。如果用户点按已归档的应用,负责安装的应用会收到解除归档请求,并且可以通过 ACTION_PACKAGE_ADDED
广播监控恢复过程。
Grafica
Android 15 offre i più recenti miglioramenti della grafica, tra cui ANGLE e aggiunte al sistema grafico Canvas.
Modernizzazione dell'accesso alla GPU di Android
L'hardware Android si è evoluto molto sin dall'inizio, quando il sistema operativo principale veniva eseguito su una singola CPU e le GPU erano accessibili utilizzando API basate su pipeline a funzione fissa. L'API Vulkan® Graphic è disponibile nell'NDK a partire da Android 7.0 (livello API 24) con un'astrazione di livello inferiore che riflette meglio l'hardware GPU moderno, offre una migliore scalabilità per supportare più core CPU e offre un overhead di driver ridotto per la CPU, migliorando le prestazioni dell'app. Vulkan è supportato da tutti i moderni motori di gioco.
Vulkan è l'interfaccia preferita di Android per la GPU. Pertanto, Android 15 include ANGLE come livello facoltativo per l'esecuzione di OpenGL® ES su Vulkan. Il passaggio ad ANGLE standardizza l'implementazione di OpenGL per Android per migliorare la compatibilità e, in alcuni casi, le prestazioni. Puoi testare la stabilità e le prestazioni dell'app OpenGL ES con ANGLE attivando l'opzione sviluppatore in Impostazioni -> Sistema -> Opzioni sviluppatore -> Sperimentale: attiva ANGLE su Android 15.
Roadmap di Android ANGLE su Vulkan
Nell'ambito della semplificazione del nostro stack di GPU, d'ora in poi forniremo ANGLE come driver di sistema GL su un numero maggiore di nuovi dispositivi, con l'aspettativa futura che OpenID/ES sarà disponibile solo tramite ANGLE. Detto questo, prevediamo di continuare a supportare OpenGL ES su tutti i dispositivi.
Passi successivi consigliati
Utilizza le opzioni sviluppatore per selezionare il driver ANGLE per OpenGL ES e testare l'app. Per i nuovi progetti, consigliamo vivamente di utilizzare Vulkan per C/C++.
Miglioramenti per Canvas
Android 15 continua la nostra modernizzazione del sistema grafico Canvas di Android con nuove funzionalità:
Matrix44
fornisce una matrice 4 x 4 per la trasformazione delle coordinate che deve essere utilizzata quando vuoi manipolare il canvas in 3D.clipShader
interseca il clip corrente con lo Shader specificato, mentreclipOutShader
imposta il clip in base alla differenza tra il clip corrente e lo Shader, ciascuno trattando lo Shader come una maschera alfa. In questo modo è possibile disegnare forme complesse in modo efficiente.
Prestazioni e batteria
Android continua a impegnarsi per aiutarti a migliorare il rendimento e la qualità delle tue app. Android 15 introduce API che consentono di eseguire le attività nell'app in modo più efficiente, ottimizzare il rendimento delle app e raccogliere informazioni sulle tue app.
Per le best practice per il risparmio energetico, il debug dell'utilizzo di rete e di energia e dettagli su come stiamo migliorando l'efficienza energetica del lavoro in background in Android 15 e nelle versioni recenti di Android, consulta il talk Migliorare l'efficienza energetica del lavoro in background su Android della conferenza Google I/O.
API ApplicationStartInfo
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.
Informazioni dettagliate sulle dimensioni dell'app
A partire da Android 8.0 (livello API 26), Android ha incluso l'API StorageStats.getAppBytes
che riassume le dimensioni installate di un'app come un singolo numero di byte, ovvero una somma delle dimensioni dell'APK, delle dimensioni dei file estratti dall'APK e dei file generati sul dispositivo, come il codice compilato in anticipo (AOT). Questo numero non è molto
interessante in termini di come la tua app utilizza lo spazio di archiviazione.
Android 15 aggiunge l'API StorageStats.getAppBytesByDataType([type])
, che ti consente di ottenere informazioni dettagliate sull'utilizzo di tutto questo spazio da parte della tua app, tra cui suddivisioni dei file APK, codice AOT e velocità di velocità, metadati dex, librerie e profili guidati.
Profilazione gestita dall'app
Android 15 include la classe ProfilingManager
,
che ti consente di raccogliere informazioni sul profiling all'interno della tua app, ad esempio dump heap, profili heap, campionamento dello stack e altro ancora. Fornisce un callback alla tua app con un tag fornito per identificare il file di output, che viene inviato alla directory dei file della tua app. L'API limita la frequenza per ridurre al minimo
l'impatto sulle prestazioni.
Per semplificare la creazione di richieste di profilazione nella tua app, ti consigliamo di utilizzare l'Profiling
API AndroidX corrispondente, disponibile in Core 1.15.0-rc01 o versioni successive.
Miglioramenti al database SQLite
Android 15 introduce le API SQLite che espongono funzionalità avanzate motore SQLite sottostante che ha come target specifici problemi di prestazioni che possono manifest nelle app. Queste API sono incluse nell'aggiornamento di SQLite alla versione 3.44.3.
Gli sviluppatori devono consultare le best practice per le prestazioni di SQLite per ottenere il massimo dal proprio database SQLite, in particolare quando si lavora con database di grandi dimensioni o quando si eseguono query sensibili alla latenza.
- Transazioni differite di sola lettura: quando emetti transazioni di sola lettura (non includono istruzioni di scrittura), utilizza
beginTransactionReadOnly()
ebeginTransactionWithListenerReadOnly(SQLiteTransactionListener)
per emettere transazioniDEFERRED
di sola lettura. Queste transazioni possono essere eseguite in contemporanea e, se il database è in modalità WAL, eseguita in concomitanza conIMMEDIATE
oEXCLUSIVE
transazioni. - Conteggi e ID righe: sono state aggiunte API per recuperare il conteggio
righe o l'ultimo ID riga inserito senza inviare un'ulteriore query.
getLastChangedRowCount()
restituisce il numero di righe che sono stati inseriti, aggiornati o eliminati dall'istruzione SQL più recente all'interno la transazione corrente egetTotalChangedRowCount()
restituisce il conteggio della connessione corrente.getLastInsertRowId()
restituiscerowid
dell'ultima riga da inserire nella connessione corrente. - Istruzioni non elaborate: invia un'istruzione SQlite non elaborata, aggirando la convenienza e l'eventuale overhead di elaborazione aggiuntivo che potrebbe subire.
Aggiornamenti del framework Android Dynamic Performance
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.
Privacy
Android 15 include una serie di funzionalità che aiutano gli sviluppatori di app a proteggere la privacy degli utenti.
Rilevamento di registrazioni dello schermo
Android 15 aggiunge il supporto delle app per rilevare che vengono registrate. Un callback viene invocato ogni volta che l'app passa da visibile a invisibile all'interno di una registrazione dello schermo. Un'app è considerata visibile se vengono registrate attività di proprietà dell'UID della procedura di registrazione. In questo modo, se la tua app esegue un'operazione sensibile, puoi informare l'utente che è in corso una registrazione.
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)
}
Funzionalità IntentFilter espanse
Android 15 supporta la risoluzione Intent
più precisa tramite
UriRelativeFilterGroup
, che contiene un insieme di
UriRelativeFilter
oggetti che formano un insieme di Intent
regole di corrispondenza che devono essere soddisfatte, inclusi i parametri di query dell'URL, i frammenti di URL e le regole di blocco o esclusione.
Queste regole possono essere definite nel file XML AndroidManifest
con il
tag <uri-relative-filter-group>
, che può includere facoltativamente un
tag android:allow
. Questi tag possono contenere tag <data>
che utilizzano attributi di tag dati esistenti,
nonché gli attributi android:query
e android:fragment
.
Ecco un esempio di sintassi di 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>
Spazio privato
Lo spazio privato consente agli utenti di creare uno spazio separato sul proprio dispositivo in cui possono Tenere le app sensibili lontano da occhi indiscreti, sotto un ulteriore strato di autenticazione. Lo spazio privato utilizza un profilo utente separato. L'utente può scegli di usare il blocco dispositivo o un fattore di blocco separato per lo spazio privato.
Le app nello spazio privato vengono visualizzate in un contenitore separato in Avvio app e sono nascosti dalla visualizzazione Recenti, dalle notifiche, dalle impostazioni e dalle altre app quando lo spazio privato è bloccato. I contenuti generati e scaricati dagli utenti (ad esempio contenuti multimediali o file) e gli account siano separati tra lo spazio privato e nello spazio principale. Sharesheet del sistema e è possibile usare il selettore di foto per consentire alle app di accedere ai contenuti se lo spazio privato è sbloccato.
Gli utenti non possono spostare le app esistenti e i loro dati nello spazio privato. Invece, gli utenti selezionano un'opzione di installazione nello spazio privato per installare un'app utilizzando lo store che preferiscono. Le app nello spazio privato vengono installate come copie separate da eventuali app nello spazio principale (nuove copie della stessa app).
Quando un utente blocca lo spazio privato, il profilo viene interrotto. Mentre il profilo viene interrotto, le app nello spazio privato non sono più attive e non possono Attività in primo piano o in background, inclusa la visualizzazione di notifiche.
Ti consigliamo di testare l'app con spazio privato per assicurarti che funziona come previsto, soprattutto se la tua app rientra in una delle seguenti categorie categorie:
- App con logica per i profili di lavoro, che presuppone che qualsiasi le copie installate della propria app che non sono nel profilo principale profilo di lavoro.
- App mediche
- App Avvio app
- App dello store
Esegui una query sulla selezione utente più recente per l'accesso alle foto selezionate
Ora le app possono mettere in evidenza solo le foto e i video selezionati più di recente quando viene concesso l'accesso parziale alle autorizzazioni per i contenuti multimediali. Questa funzionalità può migliorare
l'esperienza utente per le app che richiedono spesso l'accesso a foto e
video. Per utilizzare questa funzionalità nella tua app, attiva l'argomento
QUERY_ARG_LATEST_SELECTION_ONLY
quando esegui query su MediaStore
tramite 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) });
Privacy Sandbox su Android
Android 15 include le ultime estensioni dei servizi pubblicitari Android, che incorporano la versione più recente di Privacy Sandbox su Android. Questa aggiunta fa parte del nostro lavoro di sviluppo di nuove tecnologie che migliorino la privacy degli utenti e consentano esperienze pubblicitarie efficaci e personalizzate per le app mobile. La nostra pagina Privacy Sandbox contiene ulteriori informazioni sui programmi Anteprima e beta di Privacy Sandbox su Android per aiutarti a iniziare.
Connessione Salute
Android 15 集成了与 Health Connect by Android 相关的最新扩展程序。Health Connect by Android 是一个安全的集中式平台,可用于管理和共享应用收集的健康与健身数据。此次更新 增加了对健身、 营养、体表温度、训练计划等。
体表温度追踪功能让用户可以更精确地存储和分享体表温度 来自穿戴式设备或其他跟踪设备的体温数据。
训练计划是一种结构化的锻炼计划,可帮助用户实现健身目标。训练计划支持各种完成和表现目标:
如需详细了解 Android 中 Health Connect 的最新更新,请参阅 利用 Android 打造自适应体验 健康演讲。
Condivisione schermo dell'app
Android 15 supporta la condivisione dello schermo delle app, quindi gli utenti possono condividere o registrare solo una finestra dell'app anziché l'intero schermo del dispositivo. Questa funzionalità, attivata per la prima volta in Android 14 QPR2, include callback di MediaProjection
che consentono alla tua app di personalizzare l'esperienza di condivisione schermo dell'app. Tieni presente che per le app che hanno come target Android 14 (livello API 34) o versioni successive, il consenso dell'utente è obbligatorio per ogni sessione di acquisizione MediaProjection
.
Esperienza utente e interfaccia utente di sistema
Android 15 offre agli sviluppatori di app e agli utenti maggiore controllo e flessibilità per configurare il proprio dispositivo in base alle proprie esigenze.
Per scoprire di più su come utilizzare i più recenti miglioramenti di Android 15 per migliorare l'esperienza utente della tua app, guarda la presentazione Migliorare l'esperienza utente della tua app Android del Google I/O.
Anteprime dei widget più ricche con l'API Generated Previews
在 Android 15 之前,提供微件选择器预览的唯一方法是指定静态图片或布局资源。这些预览通常与放置在主屏幕上的实际 widget 的外观大不相同。此外,由于无法使用 Jetpack Glance 创建静态资源,因此“资讯一览” 开发者必须为其微件截屏或创建 XML 布局, 微件预览。
Android 15 添加了对生成的预览的支持。这意味着,应用微件提供程序可以生成 RemoteViews
以用作选择器预览,而不是静态资源。
推送 API
应用可以通过推送 API 提供生成的预览。应用可以提供
预览,并且不会收到明确的请求,
以提供预览。预览会保留在 AppWidgetService
中,并且主持人可以按需请求预览。以下示例加载了一个 XML 微件
并将其设置为预览:
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
SociaLiteAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
预期的流程如下:
- 任何时候,widget 提供程序都会调用
setWidgetPreview
。提供的预览会与其他提供方信息一起保留在AppWidgetService
中。 setWidgetPreview
会通过AppWidgetHost.onProvidersChanged
回调。作为回应,微件宿主会重新加载其所有提供方信息。- 显示微件预览时,主机会检查
AppWidgetProviderInfo.generatedPreviewCategories
,如果所选类别可用,则调用AppWidgetManager.getWidgetPreview
以返回此提供程序的已保存预览。
何时调用 setWidgetPreview
由于没有用于提供预览的回调,因此应用可以选择在运行期间的任何时间发送预览。预览的更新频率取决于微件的用例。
以下列表介绍了两大类预览用例:
- 在 widget 预览中显示真实数据(例如个性化数据)的提供程序 或最新信息。这些提供商可以设置预览 已登录 Google 账号或已在其应用中完成初始配置。之后 可以设置一项定期任务,按照所选的节奏更新预览。 此类 widget 的示例包括照片、日历、天气或新闻 widget。
- 在预览中显示静态信息或不显示任何数据的快捷操作 widget 的提供程序。这些提供程序可以在应用首次启动时设置预览一次。例如,快速开车便是此类微件的示例 操作 widget 或 Chrome 快捷方式 widget。
某些提供商可能会在基座接入模式选择器上显示静态预览,但真实的 信息。这些提供商应遵循指南 设置预览
Picture in picture
Android 15 introduce modifiche alla modalità Picture in picture (PIP) per garantire una transizione ancora più fluida quando si accede a questa modalità. Ciò è utile per le app con elementi UI sovrapposti alla UI principale, che passa in PIP.
Gli sviluppatori utilizzano il callback onPictureInPictureModeChanged
per definire la logica
che attiva/disattiva la visibilità degli elementi dell'interfaccia utente sovrapposti. Questo callback viene attivato al termine dell'animazione di entrata o uscita in PiP. A partire da Android 15, la classe PictureInPictureUiState
include un altro stato.
Con questo stato dell'interfaccia utente, le app che hanno come target Android 15 (livello API 35) osserveranno il callback
Activity#onPictureInPictureUiStateChanged
invocato con
isTransitioningToPip()
non appena inizia l'animazione PiP. Esistono molti elementi dell'interfaccia utente che non sono pertinenti per l'app quando è in modalità PiP, ad esempio visualizzazioni o layout che includono informazioni come suggerimenti, video in programma, valutazioni e titoli. Quando l'app passa in modalità PIP, utilizza il
callback onPictureInPictureUiStateChanged
per nascondere questi elementi UI. Quando l'app passa alla modalità a schermo intero dalla finestra PiP, utilizza il callback onPictureInPictureModeChanged
per mostrare nuovamente questi elementi, come mostrato nei seguenti esempi:
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// Hide UI elements
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
if (isInPictureInPictureMode) {
// Unhide UI elements
}
}
Questa rapida attivazione/disattivazione della visibilità degli elementi dell'interfaccia utente irrilevanti (per una finestra PiP) contribuisce a garantire un'animazione di entrata PiP più fluida e senza sfarfallio.
Regole Non disturbare migliorate
AutomaticZenRule
允许应用自定义注意力机制
管理(勿扰)规则,并确定何时启用或停用
。Android 15 极大地增强了这些规则,旨在提高
用户体验。其中包含以下增强功能:
- 向
AutomaticZenRule
添加类型,让系统能够应用特殊类型 对某些规则的处理 - 向
AutomaticZenRule
添加图标,使模式更加丰富 易于识别。 - 将
triggerDescription
字符串添加到AutomaticZenRule
,用于描述 规则应当对用户生效的条件。 - 已添加
ZenDeviceEffects
更改为AutomaticZenRule
,从而允许规则触发灰度等操作 显示、夜间模式或调暗壁纸。
Impostare VibrationEffect per i canali di notifica
Android 15 supporta l'impostazione di vibrazioni intense per le notifiche in arrivo tramite
canale utilizzando NotificationChannel.setVibrationEffect
,
i tuoi utenti possano distinguere tra diversi tipi di notifiche senza
dover guardare il proprio dispositivo.
Chip della barra di stato della proiezione di contenuti multimediali e arresto automatico
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.
Schermi e fattori di forma di grandi dimensioni
Android 15 offre alle tue app il supporto necessario per sfruttare al meglio i fattori di forma di Android, inclusi schermi di grandi dimensioni, dispositivi con cerniera e pieghevoli.
Multitasking migliore su schermo grande
Android 15 为用户提供了在大屏设备上更好地进行多任务处理的方式。对于 例如,用户可以保存自己喜爱的分屏应用组合, 访问并固定屏幕上的任务栏,以便在应用之间快速切换。这意味着 让应用具备自适应能力比以往任何时候都更加重要。
Google I/O 大会上有一些关于构建自适应 Android 的会议 应用和使用 Material 3 构建界面 自适应库 我们的文档中提供了更多帮助信息,帮助您针对大型语言 。
Supporto della schermata del coperchio
La tua app può dichiarare una proprietà utilizzata da Android 15 per
consentire la visualizzazione di Application
o Activity
sulle piccole schermate di copertina dei dispositivi ribaltabili supportati. Queste schermate sono troppo piccole per essere
considerate target compatibili per l'esecuzione delle app per Android, ma la tua app può
attivarne il supporto, rendendo l'app disponibile in più luoghi.
Connettività
Android 15 aggiorna la piattaforma per consentire alla tua app di accedere agli ultimi progressi nelle tecnologie di comunicazione e wireless.
Assistenza satellitare
Android 15 continua a estendere il supporto delle piattaforme per la connettività satellitare e include alcuni elementi dell'interfaccia utente per garantire un'esperienza utente coerente panorama della connettività satellitare.
Le app possono utilizzare ServiceState.isUsingNonTerrestrialNetwork()
per rilevare quando un dispositivo è connesso a un satellite, in modo da avere una maggiore consapevolezza del motivo per cui i servizi di rete completi potrebbero non essere disponibili. Inoltre, Android 15 supporta le app SMS e MMS, nonché le app RCS precaricate, per utilizzare la connettività satellitare per l'invio e la ricezione di messaggi.
Esperienze NFC più fluide
Android 15 致力于打造更顺畅、更可靠的感应式付款体验,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter
进入观察模式。在该模式下,设备会监听 NFC 读取器但不会响应 NFC 读取器,从而将应用的 NFC 服务 PollingFrame
对象发送给系统进行处理。PollingFrame
对象可用于在与 NFC 读取器首次通信之前进行身份验证,以便在许多情况下实现一键交易。
此外,应用现在可以在受支持的设备上注册过滤器,以便接收轮询循环 activity 的通知,从而与多个 NFC 感知应用顺畅运行。
Ruolo del portafoglio
Android 15 introduce un nuovo ruolo Wallet che consente una maggiore integrazione con l'app Wallet preferita dell'utente. Questo ruolo sostituisce l'impostazione di pagamento contactless predefinita NFC. Gli utenti possono gestire il titolare del ruolo Wallet andando a Impostazioni > App > App predefinite.
Il ruolo Wallet viene utilizzato per il routing dei tocchi NFC per gli AID registrati nella categoria di pagamento. I tocchi vanno sempre al titolare del ruolo di Wallet, a meno che in primo piano non sia in esecuzione un'altra app registrata per lo stesso AID.
Questo ruolo viene utilizzato anche per determinare dove deve essere inserito il riquadro QuickAccess di Wallet quando viene attivato. Se il ruolo è impostato su "Nessuno", il riquadro QuickAccess non è disponibile e i tocchi NFC della categoria di pagamento vengono inviati solo all'app in primo piano.
Sicurezza
Android 15 ti aiuta a migliorare la sicurezza della tua app, a proteggere i dati della tua app e offre agli utenti maggiore trasparenza e controllo sui propri dati. Guarda la presentazione Safeguarding user security on Android di Google I/O per scoprire di più su cosa stiamo facendo per migliorare le misure di protezione degli utenti e difendere la tua app da nuove minacce.
Integrare Gestore delle credenziali con la compilazione automatica
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.
Integrare la registrazione e l'accesso con un solo tocco con le richieste biometriche
Gestore delle credenziali integra i prompt biometrici nella creazione delle credenziali e i processi di accesso, eliminando così la necessità da parte dei provider di gestire di prompt biometrici. Di conseguenza, i fornitori di credenziali devono concentrarsi solo i risultati dei flussi create e get, aumentati con il risultato del flusso biometrico. Questo processo semplificato crea credenziali più efficienti e semplificate processo di creazione e recupero.
Gestione delle chiavi per la crittografia end-to-end
Stiamo introducendo E2eeContactKeysManager
in Android 15, che
semplifica la crittografia end-to-end (E2EE) nelle tue app Android fornendo
un'API a livello di sistema operativo per l'archiviazione di chiavi pubbliche crittografiche.
E2eeContactKeysManager
è progettato per integrarsi con l'app dei contatti della piattaforma per offrire agli utenti un modo centralizzato per gestire e verificare le chiavi pubbliche dei loro contatti.
Controlli delle autorizzazioni sugli URI dei contenuti
Android 15 引入了一组可对内容 URI 执行权限检查的新 API:
Context.checkContentUriPermissionFull
:这会对内容 URI 执行完整的权限检查。Activity
清单属性requireContentUriPermissionFromCaller
:这会在 activity 启动时,对提供的内容 URI 强制执行指定权限。Activity
调用方的ComponentCaller
类:这表示启动 activity 的应用。
Accessibilità
Android 15 aggiunge funzionalità che migliorano l'accessibilità per gli utenti.
Braille migliore
In Android 15, abbiamo consentito a TalkBack di supportare i display braille che utilizzano lo standard HID sia tramite USB che tramite Bluetooth sicuro.
Questo standard, simile a quello utilizzato per mouse e tastiere, consentirà ad Android di supportare una gamma più ampia di display braille con il passare del tempo.
Internazionalizzazione
Android 15 aggiunge funzionalità che completano l'esperienza utente quando un dispositivo viene utilizzato in lingue diverse.
Carattere variabile CJK
A partire da Android 15, il file dei caratteri per le lingue cinese, giapponese e coreano (CJK), NotoSansCJK, è ora un carattere variabile. I caratteri variabili danno accesso a nuove possibilità per la tipografia creativa nelle lingue CJK. I designer possono esplorare un'ampia gamma di stili e creare layout visivamente accattivanti che prima erano difficili o impossibili da realizzare.
Giustificazione tra caratteri
A partire da Android 15, il testo può essere giustificato utilizzando la spaziatura tra le lettere
utilizzando JUSTIFICATION_MODE_INTER_CHARACTER
. La giustificazione tra parole era
introdotto per la prima volta in Android 8.0 (livello API 26) e
giustificazione offre funzionalità simili per i linguaggi che utilizzano
spazio vuoto per la segmentazione, ad esempio cinese, giapponese e altri.
Configurazione dell'interruzione di riga automatica
Android ha iniziato a supportare le interruzioni di riga basate su frase per il giapponese e il coreano in
Android 13 (livello API 33). Tuttavia, mentre le interruzioni di riga basate su frase migliorano
leggibilità di brevi righe di testo, non sono ideali per righe di testo lunghe.
In Android 15, le app possono applicare interruzioni di riga basate su frase solo per le righe brevi
di testo, utilizzando la classe LINE_BREAK_WORD_STYLE_AUTO
. Questa opzione seleziona lo stile della parola migliore per il testo.
Per brevi righe di testo, vengono utilizzate le interruzioni di riga basate su frase, che funzionano nello stesso modo
come LINE_BREAK_WORD_STYLE_PHRASE
, come mostrato in
immagine seguente:
Per le righe di testo più lunghe, LINE_BREAK_WORD_STYLE_AUTO
utilizza uno stile di parola senza interruzione di riga, che funziona come LINE_BREAK_WORD_STYLE_NONE
, come mostrato nell'immagine seguente:
Carattere hentaigana giapponese aggiuntivo
In Android 15, un file del carattere per l'hiragana giapponese antico (noto come hentaigana) è incluso per impostazione predefinita. Le forme uniche dei caratteri hentaigana possono aggiungere un tocco distintivo all'artwork o al design, contribuendo al contempo a preservare la trasmissione e la comprensione accurate dei documenti giapponesi antichi.
Cono VideoLAN Copyright (c) 1996-2010 VideoLAN. Questo logo o una versione modificata possono essere utilizzati o modificati da chiunque per fare riferimento al progetto VideoLAN o a qualsiasi prodotto sviluppato dal team VideoLAN, ma non implica alcuna approvazione da parte del progetto.
Vulkan e il logo Vulkan sono marchi registrati di Khronos Group Inc.
OpenGL è un marchio registrato e il logo OpenGL ES è un marchio di Hewlett Packard Enterprise utilizzato su autorizzazione di Khronos.