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 introduces Low Light Boost, a new 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 new 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.
Controlli della fotocamera in-app
Android 15 adds a new extension for more control over the camera hardware and its algorithms on supported devices:
- Advanced flash strength adjustments enabling precise control of flash
intensity in both
SINGLE
andTORCH
modes while capturing images.
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.
![](https://developer.android.com/static/about/versions/15/images/hdr-headroom.png?authuser=9&hl=it)
Controllo del volume
Android 15 introduces support for the CTA-2075 loudness standard to help you avoid audio loudness inconsistencies and ensure users don't have to constantly adjust volume when switching between content. The system leverages known characteristics of the output devices (headphones and speaker) along with loudness metadata available in AAC audio content to intelligently adjust the audio loudness and dynamic range compression levels.
To enable this feature, you need to ensure loudness metadata is available in
your AAC content and enable the platform feature in your app. For this, you
instantiate a LoudnessCodecController
object by
calling its create factory method with the audio
session ID from the associated AudioTrack
; this
automatically starts applying audio updates. You can pass an
OnLoudnessCodecUpdateListener
to modify or filter
loudness parameters before they are applied on the
MediaCodec
.
// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = …
val audioTrack = AudioTrack.Builder()
.setSessionId(sessionId)
.build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
val lcController = LoudnessCodecController.create(mSessionId)
// Starts applying audio updates for each added MediaCodec
}
AndroidX media3 ExoPlayer will also be updated to use the
LoudnessCodecController
APIs for a seamless app integration.
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 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.
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.
![](https://developer.android.com/static/about/versions/15/images/pdf-rendering.png?authuser=9&hl=it)
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 added on-device, multi-language recognition in audio with automatic
switching between languages, but this can cause words to get dropped,
especially when languages switch with less of a pause between the two
utterances. Android 15 adds additional controls to help apps tune this switching
to their use case.
EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS
confines the automatic switching to the beginning of the audio session, while
EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES
deactivates the
language switching after a defined number of switches. These options are
particularly useful if you expect that there will be a single language spoken
during the session that should be autodetected.
Miglioramento dell'API OpenType Variable Font
Android 15 improves the usability of the OpenType variable font. You can now
create a FontFamily
instance from a variable font without specifying
weight axes with the buildVariableFamily
API. The text renderer overrides
the value of wght
axis to match the displaying text.
Using the new API, this simplifies the code for creating a Typeface
considerably:
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();
Previously, to create the same Typeface
, you would need much more code:
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();
Here's an example of how a Typeface
created with both the old and new APIs
renders:
In this example, the Typeface
created with the old API doesn't have the
capability to create accurate font weights for the 350, 450, 550 and 650
Font
instances, so the renderer falls back to the closest weight. So in
this case, 300 is rendered instead of 350, 400 is rendered instead of 450, and
so on. By contrast, the Typeface
created with the new APIs dynamically creates
a Font
instance for a given weight, so accurate weights are rendered for 350,
450, 550, and 650 as well.
Controlli granulari per interruzione di riga
Starting in Android 15, a TextView
and the underlying
line breaker can preserve the given portion of text in the same line to improve
readability. You can take advantage of this line break customization by using
the <nobreak>
tag in string resources or
createNoBreakSpan
. Similarly, you can preserve words from
hyphenation by using the <nohyphen>
tag or
createNoHyphenationSpan
.
For example, the following string resource doesn't include a line break, and renders with the text "Pixel 8 Pro." breaking in an undesirable place:
<resources>
<string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>
In contrast, this string resource includes the <nobreak>
tag, which wraps the
phrase "Pixel 8 Pro." and prevents line breaks:
<resources>
<string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>
The difference in how these strings are rendered is shown in the following images:
![](https://developer.android.com/static/about/versions/15/images/line-breaks-none.png?authuser=9&hl=it)
<nobreak>
tag.![](https://developer.android.com/static/about/versions/15/images/line-breaks-included.png?authuser=9&hl=it)
<nobreak>
tag.Archiviazione delle app
Android and Google Play announced support for app archiving last year, allowing users to free up space by partially removing infrequently used apps from the device that were published using Android App Bundle on Google Play. Android 15 now includes OS level support for app archiving and unarchiving, making it easier for all app stores to implement it.
Apps with the REQUEST_DELETE_PACKAGES
permission can call the
PackageInstaller
requestArchive
method to request archiving an
installed app package, which removes the APK and any cached files, but persists
user data. Archived apps are returned as displayable apps through the
LauncherApps
APIs; users will see a UI treatment to highlight that those
apps are archived. If a user taps on an archived app, the responsible installer
will get a request to unarchive it, and the restoration process can be
monitored by the ACTION_PACKAGE_ADDED
broadcast.
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
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
![Roadmap delle prossime modifiche alle API GPU Android.](https://developer.android.com/static/about/versions/15/images/angle-vulkan-roadmap.png?authuser=9&hl=it)
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 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 introduces new SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps.
Developers should consult best practices for SQLite performance to get the most out of their SQLite database, especially when working with large databases or when running latency-sensitive queries.
- Read-only deferred transactions: when issuing transactions that are
read-only (don't include write statements), use
beginTransactionReadOnly()
andbeginTransactionWithListenerReadOnly(SQLiteTransactionListener)
to issue read-onlyDEFERRED
transactions. Such transactions can run concurrently with each other, and if the database is in WAL mode, they can run concurrently withIMMEDIATE
orEXCLUSIVE
transactions. - Row counts and IDs: new APIs were added to retrieve the count of changed
rows or the last inserted row ID without issuing an additional query.
getLastChangedRowCount()
returns the number of rows that were inserted, updated, or deleted by the most recent SQL statement within the current transaction, whilegetTotalChangedRowCount()
returns the count on the current connection.getLastInsertRowId()
returns therowid
of the last row to be inserted on the current connection. - Raw statements: issue a raw SQlite statement, bypassing convenience wrappers and any additional processing overhead that they may incur.
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 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)
}
Funzionalità IntentFilter estese
Android 15 supporta una risoluzione Intent
più precisa tramite UriRelativeFilterGroup
, che contiene un insieme di oggetti UriRelativeFilter
che formano un insieme di regole di corrispondenza Intent
che devono essere soddisfatte singolarmente, inclusi i parametri di query dell'URL, i frammenti di URL e le regole di blocco o di esclusione.
Queste regole possono essere definite nel file XML AndroidManifest
con il nuovo tag <uri-relative-filter-group>
, che può facoltativamente includere un tag android:allow
. Questi tag possono contenere tag <data>
che utilizzano attributi di tag dati
esistenti, nonché i nuovi attributi android:query
e android:fragment
.
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
Private space lets users create a separate space on their device where they can keep sensitive apps away from prying eyes, under an additional layer of authentication. The private space uses a separate user profile. The user can choose to use the device lock or a separate lock factor for the private space.
Apps in the private space show up in a separate container in the launcher, and are hidden from the recents view, notifications, settings, and from other apps when the private space is locked. User-generated and downloaded content (such as media or files) and accounts are separated between the private space and the main space. The system sharesheet and the photo picker can be used to give apps access to content across spaces when the private space is unlocked.
Users can't move existing apps and their data into the private space. Instead, users select an install option in the private space to install an app using whichever app store they prefer. Apps in the private space are installed as separate copies from any apps in the main space (new copies of the same app).
When a user locks the private space, the profile is stopped. While the profile is stopped, apps in the private space are no longer active and can't perform foreground or background activities, including showing notifications.
We recommend that you test your app with private space to make sure your app works as expected, especially if your app falls into one of the following categories:
- Apps with logic for work profiles that assumes that any installed copies of their app that aren't in the main profile are in the work profile.
- Launcher apps
- App store apps
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 relative ai 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, abilita 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 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
Prima di Android 15, l'unico modo per fornire le anteprime del selettore widget era specificare una risorsa statica di layout o immagine. Queste anteprime spesso differiscono notevolmente dall'aspetto del widget effettivo quando è posizionato sulla schermata Home. Inoltre, non è possibile creare risorse statiche con Jetpack Glance, pertanto gli sviluppatori di Glance hanno dovuto acquisire uno screenshot del widget o creare un layout XML per avere un'anteprima del widget.
Android 15 aggiunge il supporto per le anteprime generate. Ciò significa che i fornitori di widget
app possono generare RemoteViews
da utilizzare come anteprima del selettore, anziché
una risorsa statica.
![](https://developer.android.com/static/about/versions/15/images/generated-previews.png?authuser=9&hl=it)
API Push
Le app possono fornire anteprime generate tramite un'API push. Le app possono fornire anteprime in qualsiasi momento del loro ciclo di vita e non ricevono una richiesta esplicita dall'host per fornire le anteprime. Le anteprime sono rese persistenti in AppWidgetService
e gli host possono richiederle on demand. L'esempio seguente carica una risorsa di layout del widget XML e la imposta come anteprima:
AppWidgetManager.getInstance(appContext).setWidgetPreview(
ComponentName(
appContext,
SociaLiteAppWidgetReceiver::class.java
),
AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
RemoteViews("com.example", R.layout.widget_preview)
)
Il flusso previsto è:
- Il fornitore del widget chiama
setWidgetPreview
in qualsiasi momento. Le anteprime fornite sono rese persistenti inAppWidgetService
con altre informazioni sul provider. setWidgetPreview
avvisa gli organizzatori di un'anteprima aggiornata tramite il callbackAppWidgetHost.onProvidersChanged
. In risposta, l'host del widget ricarica tutte le informazioni del provider.- Quando viene visualizzata l'anteprima del widget, l'host controlla
AppWidgetProviderInfo.generatedPreviewCategories
e, se la categoria scelta è disponibile, chiamaAppWidgetManager.getWidgetPreview
per restituire l'anteprima salvata per questo provider.
Quando chiamare setWidgetPreview
Poiché non è disponibile un callback per fornire le anteprime, le app possono scegliere di inviarle in qualsiasi momento quando sono in esecuzione. La frequenza con cui aggiornare l'anteprima dipende dal caso d'uso del widget.
Nell'elenco che segue vengono descritte le due categorie principali di casi d'uso in anteprima:
- Fornitori che mostrano dati reali nelle anteprime del widget, ad esempio informazioni personalizzate o recenti. Questi fornitori possono impostare l'anteprima una volta che l'utente ha eseguito l'accesso o ha completato la configurazione iniziale nell'app. Dopodiché, possono impostare un'attività periodica per aggiornare le anteprime con la cadenza scelta. Alcuni esempi di questo tipo di widget possono essere un widget di foto, calendario, meteo o notizie.
- Fornitori che mostrano informazioni statiche in anteprime o widget di azione rapida che non mostrano dati. Questi fornitori possono impostare le anteprime una sola volta, al primo avvio dell'app. Alcuni esempi di questo tipo di widget sono il widget delle azioni rapide di Drive o il widget delle scorciatoie di Chrome.
Alcuni fornitori potrebbero mostrare anteprime statiche nel selettore della modalità Hub, ma informazioni reali nel selettore della schermata Home. Questi fornitori devono seguire le indicazioni per entrambi i casi d'uso per impostare le anteprime.
Picture in picture
Android 15 introduces new 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 a new state.
With this new UI state, apps targeting Android 15 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.
Regole Non disturbare migliorate
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.
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 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.
Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.
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.
![](https://developer.android.com/static/about/versions/15/images/satellite-notification.png?authuser=9&hl=it)
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 introduces a new Wallet role that allows tighter integration with the user's preferred wallet app. This role replaces the NFC default contactless payment setting. Users can manage the Wallet role holder by navigating to Settings > Apps > Default Apps.
The Wallet role is used when routing NFC taps for AIDs registered in the payment category. Taps always go to the Wallet role holder unless another app that is registered for the same AID is running in the foreground.
This role is also used to determine where the Wallet QuickAccess tile should go when activated. When the role is set to "None", the QuickAccess tile isn't available and payment category NFC taps are only delivered to the foreground app.
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 introduces a new set of APIs that perform permission checks on content URIs:
Context.checkContentUriPermissionFull
: This performs a full permission check on content URIs.Activity
manifest attributerequireContentUriPermissionFromCaller
: This enforces specified permissions on the provided content URIs at activity launch.ComponentCaller
class forActivity
callers: This represents the app that launched the activity.
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.
![](https://developer.android.com/static/about/versions/15/images/cjk-variable-font.png?authuser=9&hl=it)
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.
![](https://developer.android.com/static/about/versions/15/images/none-japanese.png?authuser=9&hl=it)
JUSTIFICATION_MODE_NONE
.![](https://developer.android.com/static/about/versions/15/images/none-english.png?authuser=9&hl=it)
JUSTIFICATION_MODE_NONE
.![](https://developer.android.com/static/about/versions/15/images/inter-word-japanese.png?authuser=9&hl=it)
JUSTIFICATION_MODE_INTER_WORD
.![](https://developer.android.com/static/about/versions/15/images/inter-word-english.png?authuser=9&hl=it)
JUSTIFICATION_MODE_INTER_WORD
.![](https://developer.android.com/static/about/versions/15/images/inter-character-japanese.png?authuser=9&hl=it)
JUSTIFICATION_MODE_INTER_CHARACTER
.![](https://developer.android.com/static/about/versions/15/images/inter-character-english.png?authuser=9&hl=it)
JUSTIFICATION_MODE_INTER_CHARACTER
.Configurazione automatica dell'interruzione di riga
Android started supporting phrase-based line breaks for Japanese and Korean in
Android 13 (API level 33). However, while phrase-based line breaks improve the
readability of short lines of text, they don't work well for long lines of text.
In Android 15, apps can now apply phrase-based line breaks only for short lines
of text, using the LINE_BREAK_WORD_STYLE_AUTO
option. This option selects the best word style option for the text.
For short lines of text, phrase-based line breaks are used, functioning the same
as LINE_BREAK_WORD_STYLE_PHRASE
, as shown in the
following image:
![](https://developer.android.com/static/about/versions/15/images/line-break-auto-short.png?authuser=9&hl=it)
LINE_BREAK_WORD_STYLE_AUTO
applies phrase-based line breaks to improve the readability of the text.
This is the same as applying
LINE_BREAK_WORD_STYLE_PHRASE
.For longer lines of text, LINE_BREAK_WORD_STYLE_AUTO
uses a no
line-break word style, functioning the same as
LINE_BREAK_WORD_STYLE_NONE
, as shown in the
following image:
![](https://developer.android.com/static/about/versions/15/images/line-break-auto-long.png?authuser=9&hl=it)
LINE_BREAK_WORD_STYLE_AUTO
applies no line-break word style to improve the readability of the text.
This is the same as applying
LINE_BREAK_WORD_STYLE_NONE
.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.
![](https://developer.android.com/static/about/versions/15/images/hentaigana-font.png?authuser=9&hl=it)
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.