Android 15 introduce nuove fantastiche funzionalità e API per gli sviluppatori. Le seguenti sezioni riassumono queste funzionalità per aiutarti a iniziare a utilizzare le API correlate.
Per un elenco dettagliato delle API nuove, modificate e rimosse, leggi il report sulle differenze delle API. Per maggiori dettagli sulle nuove API, visita il Riferimento API Android. Le nuove API sono evidenziate per garantire la visibilità. Inoltre, per saperne di più sulle aree in cui le modifiche alla piattaforma potrebbero interessare le tue app, assicurati di esaminare le modifiche al comportamento di Android 15 che interessano le app quando hanno come target Android 15 e i cambiamenti di comportamento che interessano tutte le app indipendentemente datargetSdkVersion
.
Fotocamera e contenuti multimediali
Android 15 include una serie di funzionalità che migliorano l'esperienza con la fotocamera e i contenuti multimediali e ti danno accesso a strumenti e hardware per aiutare i creator a trasformare la loro vision su Android.
Per ulteriori informazioni sulle ultime funzionalità e soluzioni per sviluppatori per contenuti multimediali e fotocamere Android, consulta l'articolo sulla creazione di esperienze con fotocamera e media Android moderni da Google I/O.
Aumento luce
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 dell'headroom HDR
Android 15 sceglie un margine HDR appropriato per le funzionalità sottostanti del dispositivo e la profondità di bit del riquadro. Per le pagine con molti contenuti SDR, ad esempio un'app di messaggistica che mostra una singola miniatura HDR, questo comportamento può finire per influenzare negativamente la luminosità percepita dei contenuti SDR. Android 15 ti consente di controllare il margine HDR con setDesiredHdrHeadroom
per trovare un equilibrio tra i contenuti SDR e HDR.
Controllo del volume
Android 15 introduce il supporto per Standard per il volume CTA-2075 per aiutarti evitare incoerenze del volume audio e fare in modo che gli utenti non debbano controllare regolare il volume passando da un contenuto all'altro. Il sistema sfrutta le note alle caratteristiche dei dispositivi di uscita (cuffie e altoparlanti) insieme metadati del volume disponibili nei contenuti audio AAC per regolare in modo intelligente il volume audio e livelli di compressione dell'intervallo dinamico.
Per abilitare questa funzionalità, devi assicurarti che i metadati relativi al volume siano disponibili in
i tuoi contenuti AAC e attivare la funzionalità della piattaforma nell'app. Per farlo,
creare un'istanza di un oggetto LoudnessCodecController
chiamando il metodo di fabbrica create con l'audio
ID sessione dall'AudioTrack
associato; questo
avvia automaticamente l'applicazione degli aggiornamenti audio. Puoi trasmettere un
OnLoudnessCodecUpdateListener
per modificare o filtrare
i parametri di volume prima di essere applicati
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
}
Anche AndroidX media3 ExoPlayer verrà aggiornato per utilizzare
LoudnessCodecController
API per un'integrazione perfetta delle app.
Dispositivi Virtual MIDI 2.0
Android 13 ha aggiunto il supporto della connessione a dispositivi MIDI 2.0 tramite USB, che comunicano tramite UMP (Universal MIDI Packets). Android 15 estende il supporto UMP alle app MIDI virtuali, consentendo alle app di composizione di controllare le app di sintetizzatore come dispositivo MIDI 2.0 virtuale come farebbero con un dispositivo USB MIDI 2.0.
Decodifica del 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 sviluppatori
Sebbene la maggior parte del nostro lavoro per migliorare la produttività sia incentrata su strumenti come Android Studio, Jetpack Compose e sulle librerie Android Jetpack, cerchiamo sempre nuovi modi all'interno della piattaforma per aiutarti a trasformare più facilmente la tua vision.
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 alle API PdfRenderer
. Le app possono incorporare funzionalità avanzate come il rendering di file protetti da password, annotazioni, modifica di moduli, ricerca e selezione con testo. Le ottimizzazioni dei PDF linearizzati sono supportate per velocizzare la visualizzazione dei PDF locali e ridurre l'utilizzo di risorse.
Il PdfRenderer
è stato spostato in un modulo che può essere aggiornato utilizzando gli aggiornamenti di sistema
Google Play indipendentemente dalla release della piattaforma e stiamo supportando
queste modifiche per tornare ad Android 11 (livello API 30) creando una versione
compatibile pre-Android 15 della piattaforma API, denominata
PdfRendererPreV
.
Apprezziamo il tuo feedback sui miglioramenti che abbiamo apportato alla piattaforma API PdfRenderer
e prevediamo di rendere ancora più semplice l'integrazione di queste API nella tua app con una prossima libreria Android Jetpack.
Perfezionamenti al passaggio automatico della lingua
Android 14 ha aggiunto il riconoscimento multilingue sul dispositivo nell'audio con passaggio automatico
da una lingua all'altra, ma questo può causare il mancato rilevamento delle parole,
soprattutto quando le lingue cambiano con meno pause tra le due frasi. Android 15 aggiunge ulteriori controlli per aiutare le app a adattare questo passaggio
al loro caso d'uso.
EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
limita il passaggio automatico all'inizio della sessione audio, mentre
EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
disattiva il cambio di lingua dopo un determinato numero di cambi. Queste opzioni sono particolarmente utili se prevedi che durante la sessione verrà parlata una sola lingua che dovrebbe essere rilevata automaticamente.
Miglioramento dell'API OpenType Variable Font
Android 15 migliora l'usabilità del carattere variabile OpenType. Ora puoi
Creare un'istanza FontFamily
da un carattere variabile senza specificare
degli assi di ponderazione con l'API buildVariableFamily
. Il renderer di testo esegue l'override
il valore dell'asse wght
affinché corrisponda al testo visualizzato.
Se utilizzi la nuova API, questo semplifica il codice per la creazione di una Typeface
considerevolmente:
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();
In precedenza, per creare lo stesso Typeface
, era necessario molto più codice:
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();
Ecco un esempio di come è stata creata una risorsa Typeface
con sia la vecchia che la nuova API
esegue il rendering:
In questo esempio, il Typeface
creato con l'API precedente non ha il valore
capacità di creare spessori di carattere precisi per i modelli 350, 450, 550 e 650
Font
, quindi il renderer torna al peso più vicino. Quindi
In questo caso, viene eseguito il rendering di 300 anziché 350, di 400 invece di 450 e
così via. Al contrario, l'elemento Typeface
creato con le nuove API crea in modo dinamico
un'istanza Font
per un determinato peso, in modo che le ponderazioni siano accurate per 350,
450, 550 e 650.
Controlli granulari per interruzione di riga
A partire da Android 15, una TextView
e i relativi
l'interruzione di riga può mantenere la porzione di testo specificata nella stessa riga per migliorare
la leggibilità. Puoi sfruttare questa personalizzazione dell'interruzione di riga utilizzando
il tag <nobreak>
nelle risorse di tipo stringa
createNoBreakSpan
Analogamente, puoi preservare le parole
la sillabazione usando il tag <nohyphen>
oppure
createNoHyphenationSpan
Ad esempio, la seguente risorsa stringa non include un'interruzione di riga e viene visualizzato con il testo "Pixel 8 Pro". in una posizione indesiderata:
<resources>
<string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>
Al contrario, questa risorsa stringa include il tag <nobreak>
, che aggrega la
a frase "Pixel 8 Pro". ed evita le interruzioni di riga:
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
La differenza nel modo in cui vengono visualizzate queste stringhe è mostrata nella figura seguente immagini:
Archiviazione delle app
L'anno scorso, Android e Google Play hanno annunciato il supporto per l'archiviazione delle app, che consente agli utenti di liberare spazio rimuovendo dal dispositivo le app usate raramente e pubblicate tramite Android App Bundle su Google Play. Android 15 ora include il supporto a livello di sistema operativo per l'archiviazione e l'annullamento dell'archiviazione delle app, semplificando l'implementazione da parte di tutti gli store.
Le app con autorizzazione REQUEST_DELETE_PACKAGES
possono chiamare il metodo
PackageInstaller
requestArchive
per richiedere l'archiviazione di un
pacchetto di app installato. Questa operazione rimuove l'APK e gli eventuali file memorizzati nella cache, ma conserva
i dati utente. Le app archiviate vengono restituite come app visualizzabili tramite le
API LauncherApps
; gli utenti vedranno un'opzione di interfaccia utente per evidenziare che queste
app sono archiviate. Se un utente tocca un'app archiviata, il programma di installazione responsabile riceverà una richiesta di annullamento dell'archiviazione e il processo di ripristino può essere monitorato dalla trasmissione di ACTION_PACKAGE_ADDED
.
Grafica
Android 15 introduce gli ultimi miglioramenti della grafica, tra cui ANGLE e le aggiunte al sistema grafico di Canvas.
Modernizzazione dell'accesso alle GPU di Android
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++.
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 si concentra sempre sull'aiutarti a migliorare le prestazioni e la qualità delle tue app. Android 15 introduce nuove API che aiutano a rendere più efficienti le attività nella tua app, a ottimizzarne le prestazioni e a raccogliere approfondimenti sulle tue app.
Per le best practice per l'efficienza energetica, il debug dell'utilizzo della rete e dell'alimentazione e i dettagli su come stiamo migliorando l'efficienza della batteria per il lavoro in background in Android 15 e nelle versioni recenti di Android, consulta la presentazione Migliorare l'efficienza della batteria del lavoro in background su Android da Google I/O.
API ApplicationStartInfo
Nelle versioni precedenti di Android, l'avvio delle app era un po' un mistero. Era
difficile determinare all'interno dell'app se fosse avviata da uno stato freddo,
caldo o caldo. Era anche difficile sapere quanto tempo trascorreva l'app durante le varie fasi di lancio: fork del processo, chiamata a onCreate
, disegno del primo frame e altro ancora. Quando è stata creata un'istanza della classe Application
, non avevi modo di sapere se l'app veniva avviata da una trasmissione, un fornitore di contenuti, un job, un backup, un avvio completato, una sveglia o una Activity
.
L'API ApplicationStartInfo
su Android 15 offre tutto questo e molto altro. Puoi anche aggiungere timestamp personalizzati al flusso
per raccogliere più facilmente i dati delle tempistiche in un unico posto. Oltre a raccogliere metriche, puoi usare ApplicationStartInfo
per ottimizzare direttamente l'avvio dell'app; ad esempio, puoi eliminare la costosa creazione di istanze di librerie relative all'interfaccia utente all'interno della tua classe Application
all'avvio della tua app a causa di una trasmissione.
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 nuovissima classe ProfilingManager
, che ti consente di
raccogliere le informazioni di profilazione dalla tua app. Prevediamo di includere questa
API Android Jetpack che semplificherà la creazione delle richieste di profilazione,
ma l'API di base consentirà la raccolta di dump dell'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 nella directory dei file dell'app. L'API limita la frequenza per minimizzare l'impatto sulle prestazioni.
Miglioramenti al database SQLite
Android 15 引入了新的 SQLite API,可提供底层 SQLite 引擎的高级功能,这些功能旨在解决应用中可能出现的特定性能问题。
开发者应查阅 SQLite 性能最佳实践,以充分利用其 SQLite 数据库,尤其是在使用大型数据库或运行对延迟敏感的查询时。
- 只读延迟事务:发出只读事务(不包括写入语句)时,使用
beginTransactionReadOnly()
和beginTransactionWithListenerReadOnly(SQLiteTransactionListener)
发出只读DEFERRED
事务。此类事务可以相互并发运行,如果数据库处于 WAL 模式,则它们可以与IMMEDIATE
或EXCLUSIVE
事务并发运行。 - 行数和 ID:新增了 API,用于检索已更改的行的计数或最后插入的行 ID,而无需发出额外的查询。
getLastChangedRowCount()
返回当前事务中的最新 SQL 语句插入、更新或删除的行数,而getTotalChangedRowCount()
返回当前连接的相关计数。getLastInsertRowId()
返回要在当前连接上插入的最后一行的rowid
。 - 原始语句:发出原始 SQlite 语句,绕过便捷封装容器以及它们可能产生的任何其他处理开销。
Aggiornamenti di Android Dynamic Performance Framework
Android 15 continua il nostro investimento nell'Android Dynamic Performance Framework (ADPF), un insieme di API che consentono a giochi e app che richiedono prestazioni elevate di interagire in modo più diretto con i sistemi di alimentazione e termici dei dispositivi Android. Sui dispositivi supportati, Android 15 aggiungerà nuove funzionalità ADPF:
- Una modalità di efficienza energetica per le sessioni di suggerimento che indicano che i thread associati dovrebbero preferire il risparmio energetico rispetto alle prestazioni, ottimo per carichi di lavoro in background a lunga esecuzione.
- Le durate di lavoro di GPU e CPU possono essere registrate nelle sessioni hint, consentendo al sistema di regolare insieme le frequenze di CPU e GPU per soddisfare al meglio le esigenze dei carichi di lavoro.
- Soglie di margine termico per interpretare il possibile stato di limitazione termica in base al margine di errore.
Per scoprire di più su come utilizzare l'DPF nelle tue app e nei tuoi giochi, consulta la documentazione.
Privacy
Android 15 include una serie di funzionalità che aiutano gli sviluppatori di app a proteggere la privacy degli utenti.
Rilevamento Registrazione dello schermo
Android 15 aggiunge il supporto delle app per rilevare che vengono registrate. Viene attivato un callback ogni volta che l'app passa tra visibilità o invisibile all'interno di una registrazione dello schermo. Un'app è considerate visibili se le attività di proprietà dell'UID del processo di registrazione sono vengono registrati. In questo modo, se la tua app esegue un'operazione sensibile, può informare l'utente che è in corso la 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 estese
Android 15 integra il supporto per una risoluzione più precisa di Intent
tramite
UriRelativeFilterGroup
, che contiene un insieme di
Oggetti UriRelativeFilter
che formano un insieme di Intent
regole di corrispondenza che devono essere soddisfatte tutte, inclusi i parametri di query dell'URL, l'URL
frammenti e regole di blocco o esclusione.
Queste regole possono essere definite nel file XML AndroidManifest
con il nuovo
<uri-relative-filter-group>
, che può includere facoltativamente un
Tag android:allow
. Questi tag possono contenere <data>
tag che utilizzano dati esistenti
nonché i nuovi attributi android:query
e android:fragment
attributi.
Ecco un esempio della sintassi 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>
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 selezionate più di recente
e video quando viene concesso l'accesso parziale alle autorizzazioni per i contenuti multimediali. Questo
può migliorare l'esperienza utente per le app che richiedono spesso
l'accesso a foto e video. Per usare questa funzionalità nella tua app, attiva
Argomento QUERY_ARG_LATEST_SELECTION_ONLY
durante l'esecuzione di query su MediaStore
a 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 integra le ultime estensioni relative a Connessione Salute di Android, una piattaforma sicura e centralizzata per gestire e condividere i dati relativi a salute e fitness raccolti dall'app. Questo aggiornamento aggiunge il supporto per nuovi tipi di dati relativi a fitness, alimentazione, temperatura cutanea, piani di allenamento e altro ancora.
Il monitoraggio della temperatura cutanea consente agli utenti di memorizzare e condividere dati più accurati sulla temperatura provenienti da un dispositivo indossabile o di altro tipo.
I piani di allenamento sono piani di allenamento strutturati per aiutare l'utente a raggiungere i suoi obiettivi di fitness. Il supporto dei piani di allenamento include una serie di obiettivi di completamento e prestazioni:
- Obiettivi di completamento relativi a calorie bruciate, distanza, durata, ripetizione e passi.
- Obiettivi di rendimento con il maggior numero possibile di ripetizioni (AMRAP), cadenza, battito cardiaco, potenza, frequenza di sforzo percepita e velocità.
Scopri di più sugli ultimi aggiornamenti di Connessione Salute in Android nell'articolo Realizzare esperienze adattabili con Android Health da Google I/O.
Condivisione schermo parziale
Android 15 supporta la condivisione dello schermo parziale per consentire agli utenti di condividere o registrare soltanto una finestra dell'app anziché l'intero schermo del dispositivo. Questa funzionalità, attivata per la prima volta in
Android 14 QPR2, include
MediaProjection
callback che consentono alla tua app
di personalizzare l'esperienza di condivisione dello schermo parziale. Tieni presente che per le app che hanno come target
Android 14 (livello API 34) o versioni successive,
ora è richiesto il consenso dell'utente per ogni
sessione di acquisizione di MediaProjection
.
Esperienza utente e UI di sistema
Android 15 offre a sviluppatori di app e utenti più controllo e flessibilità per configurare il proprio dispositivo in base alle loro esigenze.
Per scoprire di più su come utilizzare gli ultimi miglioramenti in Android 15 per migliorare l'esperienza utente della tua app, leggi la conversazione Migliorare l'esperienza utente dell'app per Android di Google I/O.
Anteprime del widget più approfondite con l'API Generated Previews
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.
Picture in picture
Android 15 introduce nuove modifiche in Picture in picture (PIP) per garantire una transizione più fluida quando entri in modalità PIP. Ciò sarà vantaggioso per 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 UI sovrapposti. Il callback è
viene attivata al completamento dell'animazione di entrata o uscita PIP. Inizia tra
Android 15, il corso PictureInPictureUiState
include un nuovo stato.
Con questo nuovo stato della UI, le app destinate ad Android 15 osserveranno
Richiamato callback Activity#onPictureInPictureUiStateChanged
con
isTransitioningToPip()
all'avvio dell'animazione PIP. Esistono
molti elementi UI non pertinenti all'app in modalità PIP, ad esempio
visualizzazioni o layout di esempio che includono informazioni come suggerimenti,
video, valutazioni e titoli. Quando l'app passa in modalità PIP, usa
Callback onPictureInPictureUiStateChanged
per nascondere questi elementi UI. Quando
passa alla modalità a schermo intero dalla finestra PIP, usa
onPictureInPictureModeChanged
per mostrare questi elementi, come mostrato in
i 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à di elementi UI non pertinenti (per una finestra PIP) per garantire un'animazione di inserimento in PIP più fluida e senza sfarfallii.
Regole Non disturbare migliorate
AutomaticZenRule
consente alle app di personalizzare le regole di Gestione dell'attenzione (non disturbare) e di decidere quando attivarle o disattivarle. Android 15 migliora notevolmente queste regole con l'obiettivo di migliorare l'esperienza utente. Sono inclusi i seguenti miglioramenti:
- L'aggiunta di tipi a
AutomaticZenRule
consente al sistema di applicare un trattamento speciale ad alcune regole. - L'aggiunta di un'icona a
AutomaticZenRule
consente di rendere più riconoscibili le modalità. - Aggiunta a
AutomaticZenRule
di una stringatriggerDescription
che descriva le condizioni in base alle quali la regola deve diventare attiva per l'utente. - Aggiunta di
ZenDeviceEffects
aAutomaticZenRule
per consentire alle regole di attivare, ad esempio, la visualizzazione in scala di grigi, la modalità notturna o l'oscuramento dello sfondo.
Impostare l'effetto VibrationEffect per i canali di notifica
Android 15 supporta l'impostazione di vibrazioni avanzate per le notifiche in arrivo per canale utilizzando NotificationChannel.setVibrationEffect
, in modo che gli utenti possano distinguere tra i diversi tipi di notifica senza dover guardare il dispositivo.
Schermi e fattori di forma grandi
Android 15 offre alle tue app il supporto per ottenere il massimo dai fattori di forma di Android, tra cui schermi di grandi dimensioni, convertibili e pieghevoli.
Multitasking migliorato su schermi di grandi dimensioni
Android 15 offre agli utenti modi migliori per svolgere più attività contemporaneamente sui dispositivi con schermi di grandi dimensioni. Ad esempio, gli utenti possono salvare le combinazioni di app preferite a schermo diviso per accedervi rapidamente e bloccare la barra delle app sullo schermo per passare rapidamente da un'app all'altra. Ciò significa che è più importante che mai assicurarsi che la tua app sia adattiva.
Google I/O organizza sessioni su Creazione di app Android adattive e Creazione di un'interfaccia utente con la libreria adattiva di Material 3. Inoltre, la nostra documentazione contiene molto altro per aiutarti a progettare schermi di grandi dimensioni.
Supporto per schermo di copertura
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.
Supporto satellite
Android 15 continua a estendere il supporto della piattaforma per la connettività satellitare e include alcuni elementi UI per garantire un'esperienza utente coerente in tutto il panorama della connettività satellitare.
Le app possono utilizzare ServiceState.isUsingNonTerrestrialNetwork()
per rilevare quando un dispositivo è connesso a un satellite, in modo da capire meglio il 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 l'utilizzo della connettività satellitare per l'invio e la ricezione di messaggi.
Esperienze NFC più fluide
Android 15 si sta adoperando per rendere l'esperienza dei pagamenti contactless più fluida e affidabile, continuando a supportare il solido ecosistema di app NFC di Android. Sui dispositivi supportati, le app possono chiedere al NfcAdapter
di attivare la modalità Osserva, in cui il dispositivo ascolta, ma non risponde ai lettori NFC, inviando il servizio NFC dell'app PollingFrame
gli oggetti per l'elaborazione. Gli oggetti PollingFrame
possono essere utilizzati per l'autenticazione
prima della prima comunicazione con il lettore NFC, consentendo in molti casi una transazione
con un solo tocco.
Inoltre, ora le app possono registrare un filtro sui dispositivi supportati in modo da ricevere notifiche sulle attività di polling loop, il che consente un funzionamento senza problemi con più applicazioni NFC.
Ruolo Wallet
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 dell'app e offre agli utenti maggiore trasparenza e controllo sui loro dati. Leggi la conversazione sulla protezione degli utenti su Android di Google I/O per scoprire di più su cosa stiamo facendo per migliorare le misure di salvaguardia degli utenti e proteggere 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.
Integra la registrazione Single Tap e l'accesso con richieste biometriche
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.
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 introduce un nuovo insieme di API che eseguono controlli delle autorizzazioni sugli URI dei contenuti:
Context.checkContentUriPermissionFull
: esegue un controllo completo delle autorizzazioni degli URI dei contenuti.- Attributo manifest
Activity
requireContentUriPermissionFromCaller
: applica le autorizzazioni specificate sugli URI dei contenuti forniti al momento dell'avvio dell'attività. ComponentCaller
class perActivity
chiamanti: rappresenta l'app che ha avviato l'attività.
Accessibilità
Android 15 aggiunge funzionalità che migliorano l'accessibilità per gli utenti.
Braille avanzato
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à e caratteristiche 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.
Motivazione 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 è stata introdotta per la prima volta in Android 8.0 (livello API 26) e la giustificazione tra caratteri offre funzionalità simili per le lingue che utilizzano lo spazio vuoto per la segmentazione, ad esempio cinese, giapponese e altri.
Configurazione automatica dell'interruzione di riga
Android ha iniziato a supportare le interruzioni di riga basate su frasi per il giapponese e il coreano in
Android 13 (livello API 33). Tuttavia, anche se le interruzioni di riga basate su frasi migliorano la leggibilità di righe di testo brevi, non funzionano bene per le righe di testo lunghe.
In Android 15, le app ora possono applicare interruzioni di riga basate a frase solo per brevi righe di testo, utilizzando l'opzione LINE_BREAK_WORD_STYLE_AUTO
. Questa opzione consente di selezionare lo stile delle parole migliore per il testo.
Per brevi righe di testo, vengono utilizzate interruzioni di riga basate su frase, che funzionano come LINE_BREAK_WORD_STYLE_PHRASE
, come mostrato nell'immagine seguente:
Per righe di testo più lunghe, LINE_BREAK_WORD_STYLE_AUTO
utilizza uno
stile di parole senza interruzioni, che funziona come
LINE_BREAK_WORD_STYLE_NONE
, come mostrato nella
seguente immagine:
Nuovo carattere Hentaigana giapponese
In Android 15, per impostazione predefinita viene raggruppato un nuovo file dei caratteri per la vecchia versione giapponese Hiragana (nota come Hentaigana). Le forme uniche dei personaggi Hentaigana possono conferire un tocco distintivo all'opera d'arte o al design, aiutando al contempo a preservare la trasmissione accurata e la comprensione degli antichi documenti giapponesi.
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.