Funkcje i interfejsy API – przegląd

Android 15 wprowadza świetne funkcje i interfejsy API dla deweloperów. W kolejnych sekcjach znajdziesz podsumowanie tych funkcji, które pomoże Ci rozpocząć korzystanie z powiązanych interfejsów API.

Szczegółową listę dodanych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie o różnicach w interfejsach API. Szczegółowe informacje o dodanych interfejsach API znajdziesz w dokumentacji interfejsu Android API. W przypadku Androida 15 poszukaj interfejsów API dodanych na poziomie 35. Aby dowiedzieć się więcej o obszarach, w których zmiany na platformie mogą mieć wpływ na Twoje aplikacje, zapoznaj się ze zmianami w Androidzie 15 w przypadku aplikacji kierowanych na Androida 15w przypadku wszystkich aplikacji.

Aparat i multimedia

Android 15 zawiera wiele funkcji, które poprawiają działanie aparatu i multimediów oraz zapewniają dostęp do narzędzi i sprzętu, które pomagają twórcom realizować ich wizje na Androidzie.

Więcej informacji o najnowszych funkcjach i rozwiązaniach dla deweloperów dotyczących multimediów i aparatu na Androida znajdziesz w prezentacji Tworzenie nowoczesnych aplikacji multimedialnych i do obsługi aparatu na Androida z Google I/O.

Doświetlanie w słabym oświetleniu

Android 15 引入了弱光增强功能,这是一种自动曝光模式,适用于 Camera 2夜间模式相机扩展。“弱光增强”功能可在光线昏暗的环境下调整预览画面的曝光度。这与夜间模式相机扩展程序创建静态图片的方式不同,因为夜间模式会将一系列照片组合起来,以创建一张经过增强的单张图片。虽然夜间模式非常适合拍摄静态图片,但无法创建连续的帧流,而“低光增强”功能可以。因此,弱光增强功能可启用相机功能,例如:

  • 提供增强型图片预览,以便用户更好地取景拍摄低光照片
  • 在光线不足的情况下扫描二维码

如果您启用“弱光增强”功能,该功能会在光线较弱时自动开启,在光线较强时关闭。

应用可以在光线昏暗的环境下录制预览画面,以保存经过亮度提升的视频。

如需了解详情,请参阅弱光增强

Sterowanie kamerą w aplikacji

Android 15 adds an 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 and TORCH modes while capturing images.

Kontrola zakresu dynamicznego HDR

Android 15 wybiera zakres HDR odpowiedni dla możliwości urządzenia i głębi bitowej panelu. W przypadku stron zawierających dużo treści SDR, takich jak aplikacja do obsługi wiadomości wyświetlająca pojedynczą miniaturę HDR, takie działanie może negatywnie wpływać na postrzeganą jasność treści SDR. Android 15 umożliwia kontrolowanie marginesu HDR za pomocą setDesiredHdrHeadroom, aby zachować równowagę między treściami SDR a HDR.

Wydaje się, że jasność elementów interfejsu SDR na lewym ekranie jest bardziej jednolita niż jasność na prawym ekranie, co symuluje możliwe problemy z marginesem dynamiki podczas łączenia treści HDR i SDR. Dostosowując margines HDR, możesz uzyskać lepszy balans między treściami SDR a HDR.

Regulacja głośności

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.

Wirtualne urządzenia MIDI 2.0

W Androidzie 13 dodano obsługę łączenia się z urządzeniami MIDI 2.0 przez USB, które komunikują się za pomocą pakietów Universal MIDI (UMP). Android 15 rozszerza obsługę UMP na wirtualne aplikacje MIDI, umożliwiając aplikacjom do komponowania sterowanie syntezatorami jako wirtualnym urządzeniem MIDI 2.0, tak jak w przypadku urządzenia USB MIDI 2.0.

wydajniejsze dekodowanie oprogramowania AV1,

dav1d logo

dav1d, the popular AV1 software decoder from VideoLAN is available for Android devices that don't support AV1 decode in hardware. dav1d is up to 3x more performant than the legacy AV1 software decoder, enabling HD AV1 playback for more users, including some low and mid tier devices.

Your app needs to opt-in to using dav1d by invoking it by name "c2.android.av1-dav1d.decoder". dav1d will be made the default AV1 software decoder in a subsequent update. This support is standardized and backported to Android 11 devices that receive Google Play system updates.

Wydajność i narzędzia dla programistów

Większość naszych działań na rzecz zwiększenia produktywności koncentruje się na narzędziach takich jak Android Studio, Jetpack Compose i biblioteki Android Jetpack. Zawsze jednak szukamy sposobów, aby ułatwić Ci realizację Twojej wizji na platformie.

Aktualizacje OpenJDK 17

Android 15 将继续更新 Android 的核心库,以与最新 OpenJDK LTS 版本中的功能保持一致。

其中包含以下主要功能和改进:

这些 API 会通过 Google Play 系统更新在搭载 Android 12(API 级别 31)及更高版本的 10 亿多部设备上更新,以便您以最新的编程功能为目标平台。

Ulepszenia plików PDF

Android 15 includes substantial improvements to the PdfRenderer APIs. Apps can incorporate advanced features such as rendering password-protected files, annotations, form editing, searching, and selection with copy. Linearized PDF optimizations are supported to speed local PDF viewing and reduce resource use. The Jetpack PDF library uses these APIs to simplify adding PDF viewing capabilities to your app.

The latest updates to PDF rendering include features such as searching an embedded PDF file.

The PdfRenderer has been moved to a module that can be updated using Google Play system updates independent of the platform release, and we're supporting these changes back to Android 11 (API level 30) by creating a compatible pre-Android 15 version of the API surface, called PdfRendererPreV.

Ulepszenia automatycznego przełączania języka

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.

Ulepszony interfejs OpenType Variable Font API

Android 15 improves the usability of the OpenType variable font. You can 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 API 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:

An example of how Typeface rendering differs using new and old
APIs

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.

Szczegółowe ustawienia podziału wiersza

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:

Layout for a line of text where the phrase "Pixel 8 Pro." isn't wrapped using a <nobreak> tag.
Layout for the same line of text where the phrase "Pixel 8 Pro." is wrapped using a <nobreak> tag.

Archiwizacja aplikacji

Android and Google Play announced support for app archiving last year, allowing users to free up space by partially removing infrequently used apps from the device that were published using Android App Bundle on Google Play. Android 15 includes OS level support for app archiving and unarchiving, making it easier for all app stores to implement it.

Apps with the REQUEST_DELETE_PACKAGES permission can call the PackageInstaller requestArchive method to request archiving an installed app package, which removes the APK and any cached files, but persists user data. Archived apps are returned as displayable apps through the LauncherApps APIs; users will see a UI treatment to highlight that those apps are archived. If a user taps on an archived app, the responsible installer will get a request to unarchive it, and the restoration process can be monitored by the ACTION_PACKAGE_ADDED broadcast.

Włączanie trybu 16 KB na urządzeniu za pomocą opcji programisty

Włącz opcję programisty Uruchom ze stroną 16 KB, aby uruchomić urządzenie w trybie 16 KB.

Od Androida 15 QPR1 możesz użyć opcji programisty dostępnej na niektórych urządzeniach, aby uruchomić urządzenie w trybie 16 KB i przeprowadzić testowanie na urządzeniu. Zanim skorzystasz z opcji programisty, otwórz Ustawienia > System > Aktualizacje oprogramowania i zastosuj dostępne aktualizacje.

Ta opcja dla programistów jest dostępna na tych urządzeniach:

  • Pixel 8 i 8 Pro (z Androidem 15 QPR1 lub nowszym)

  • Pixel 8a (z Androidem 15 QPR1 lub nowszym)

  • Pixel 9, 9 Pro i 9 Pro XL (z Androidem 15 QPR2 Beta 2 lub nowszym)

Grafika

Android 15 wprowadza najnowsze ulepszenia grafiki, w tym ANGLE i dodatki do systemu graficznego Canvas.

Modernizacja dostępu do GPU w Androidzie

Logo Vulkan

Sprzęt Androida zmienił się od czasów, gdy główne jądro systemu operacyjnego działało na jednym procesorze CPU, a do kart graficznych uzyskiwano dostęp za pomocą interfejsów API opartych na stałych ścieżkach funkcji. Interfejs Vulkan® API do obsługi grafiki jest dostępny w NDK od wersji Androida 7.0 (poziom interfejsu API 24) i zawiera abstrakcję na niższym poziomie, która lepiej odzwierciedla nowoczesne GPU, lepiej skaluje się do obsługi wielu rdzeni procesora i zapewnia mniejsze obciążenie procesora przez sterownik, co przekłada się na większą wydajność aplikacji. Vulkan jest obsługiwany przez wszystkie nowoczesne silniki gier.

Vulkan jest preferowanym interfejsem Androida do obsługi GPU. Dlatego Android 15 zawiera ANGLE jako opcjonalną warstwę do uruchamiania OpenGL® ES na platformie Vulkan. Przejście na ANGLE pozwoli ustandaryzować implementację OpenGL na Androidzie, co zwiększy zgodność i w niektórych przypadkach wydajność. Stabilność i wydajność aplikacji OpenGL ES możesz sprawdzić za pomocą ANGLE, włączając opcję dla programistów w Ustawienia -> System -> Opcje programisty -> Eksperymentalnie: włącz ANGLE w Androidzie 15.

Plan rozwoju ANGLE na Androida na platformie Vulkan

Plan wprowadzania nadchodzących zmian w interfejsach API procesora graficznego na Androida.

W ramach uproszczenia naszego pakietu GPU będziemy w przyszłości dostarczać ANGLE jako systemowy sterownik GL na kolejnych nowych urządzeniach. W przyszłości OpenGL/ES będzie dostępny tylko za pomocą ANGLE. Planujemy jednak nadal obsługiwać OpenGL ES na wszystkich urządzeniach.

Zalecane kolejne kroki

W opcjach deweloperskich wybierz sterownik ANGLE dla OpenGL ES i przetestuj aplikację. W przypadku nowych projektów zdecydowanie zalecamy używanie Vulkana w przypadku języków C/C++.

Ulepszenia Canvas

Android 15 continues our modernization of Android's Canvas graphics system with additional capabilities:

  • Matrix44 provides a 4x4 matrix for transforming coordinates that should be used when you want to manipulate the canvas in 3D.
  • clipShader intersects the current clip with the specified shader, while clipOutShader sets the clip to the difference of the current clip and the shader, each treating the shader as an alpha mask. This supports the drawing of complex shapes efficiently.

Wydajność i bateria

Android nadal koncentruje się na pomaganiu w poprawianiu wydajności i jakości aplikacji. Android 15 wprowadza interfejsy API, które pomagają wydajniej wykonywać zadania w aplikacji, optymalizować jej działanie i zbierać o niej statystyki.

Aby poznać sprawdzone metody oszczędzania baterii, debugowania sieci i zużycia energii oraz dowiedzieć się więcej o tym, jak zwiększamy wydajność baterii w przypadku pracy w tle w Androidzie 15 i nowszych wersjach Androida, obejrzyj prezentację Zwiększanie wydajności baterii w przypadku pracy w tle na Androidzie z konferencji Google I/O.

ApplicationStartInfo API

在以前的 Android 版本中,应用启动一直是个谜。在应用中确定应用是从冷启动、温启动还是热启动状态启动很困难。您还很难了解应用在各种启动阶段(分叉进程、调用 onCreate、绘制第一个帧等)所花的时间。在 Application 类被实例化时,您无法知道应用是通过广播、content provider、作业、备份、启动完成、闹钟还是 Activity 启动的。

Android 15 上的 ApplicationStartInfo API 提供了所有这些功能,以及更多功能。您甚至可以选择在流程中添加自己的时间戳,以便在一个位置收集时间数据。除了收集指标之外,您还可以使用 ApplicationStartInfo 直接优化应用启动;例如,您可以消除在应用因广播而启动时在 Application 类中实例化与界面相关的库所带来的高昂开销。

Szczegółowe informacje o rozmiarze aplikacji

Od Androida 8.0 (poziom interfejsu API 26) Android zawiera interfejs API StorageStats.getAppBytes, który podsumowuje rozmiar zainstalowanej aplikacji jako pojedynczą liczbę bajtów będącą sumą rozmiaru pliku APK, rozmiaru plików wyodrębnionych z pliku APK oraz plików wygenerowanych na urządzeniu, takich jak kod skompilowany z wyprzedzeniem (AOT). Ta liczba nie dostarcza zbyt wielu informacji o tym, jak aplikacja wykorzystuje miejsce na dane.

Android 15 dodaje interfejs API StorageStats.getAppBytesByDataType([type]), który pozwala uzyskać informacje o tym, jak aplikacja wykorzystuje całą dostępną przestrzeń, w tym podziały pliku APK, kod AOT i kod związany z przyspieszeniem, metadane dex, biblioteki i profilowanie kierunkowe.

Profilowanie zarządzane przez aplikację

Android 15 zawiera klasę ProfilingManager, która umożliwia zbieranie informacji o profilowaniu z aplikacji, takich jak zrzuty stosu, profile stosu, próbkowanie stosu itp. Wywołuje ona Twoją aplikację z dołączonym tagiem, aby zidentyfikować plik wyjściowy, który jest dostarczany do katalogu plików aplikacji. Interfejs API stosuje ograniczanie szybkości, aby zminimalizować wpływ na wydajność.

Aby uprościć tworzenie żądań profilowania w aplikacji, zalecamy użycie odpowiedniego interfejsu AndroidX API Profiling, dostępnego w wersji Core 1.15.0-rc01 lub nowszej.

Ulepszenia bazy danych SQLite

Android 15 introduces SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps. These APIs are included with the update of SQLite to version 3.44.3.

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() and beginTransactionWithListenerReadOnly(SQLiteTransactionListener) to issue read-only DEFERRED transactions. Such transactions can run concurrently with each other, and if the database is in WAL mode, they can run concurrently with IMMEDIATE or EXCLUSIVE transactions.
  • Row counts and IDs: 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, while getTotalChangedRowCount() returns the count on the current connection. getLastInsertRowId() returns the rowid 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.

Aktualizacje Android Dynamic Performance Framework

Android 15 continues our investment in the Android Dynamic Performance Framework (ADPF), a set of APIs that allow games and performance intensive apps to interact more directly with power and thermal systems of Android devices. On supported devices, Android 15 adds ADPF capabilities:

  • A power-efficiency mode for hint sessions to indicate that their associated threads should prefer power saving over performance, great for long-running background workloads.
  • GPU and CPU work durations can both be reported in hint sessions, allowing the system to adjust CPU and GPU frequencies together to best meet workload demands.
  • Thermal headroom thresholds to interpret possible thermal throttling status based on headroom prediction.

To learn more about how to use ADPF in your apps and games, head over to the documentation.

Prywatność

Android 15 zawiera różne funkcje, które pomagają programistom aplikacji chronić prywatność użytkowników.

Wykrywanie nagrywania ekranu

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)
}

Rozszerzone możliwości IntentFilter

Android 15 builds in support for more precise Intent resolution through UriRelativeFilterGroup, which contains a set of UriRelativeFilter objects that form a set of Intent matching rules that must each be satisfied, including URL query parameters, URL fragments, and blocking or exclusion rules.

These rules can be defined in the AndroidManifest XML file with the <uri-relative-filter-group> tag, which can optionally include an android:allow tag. These tags can contain <data> tags that use existing data tag attributes as well as the android:query and android:fragment attributes.

Here's an example of the AndroidManifest syntax:

<intent-filter android:autoVerify="true">
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:host="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>

Przestrzeń prywatna

Przestrzeń prywatną można odblokować i zablokować, aby wyświetlać lub ukrywać poufne aplikacje na urządzeniu.

Przestrzeń prywatna umożliwia użytkownikom utworzenie osobnego obszaru na urządzeniu, w którym mogą ukryć aplikacje poufne przed ciekawskimi spojrzeniami, korzystając z dodatkowego poziomu uwierzytelniania. Przestrzeń prywatna korzysta z osobnego profilu użytkownika. Użytkownik może wybrać blokadę urządzenia lub osobny czynnik blokady dla przestrzeni prywatnej.

Aplikacje w obszarze prywatnym są widoczne w oddzielnym kontenerze w wyszukiwarce i są ukryte w widoku Ostatnie, w powiadomieniach, ustawieniach i innych aplikacjach, gdy obszar prywatny jest zablokowany. Treści utworzone i pobrane przez użytkownika (np. multimedia lub pliki) oraz konta są rozdzielone między przestrzeń prywatną a przestrzeń główną. Arkusz udostępnianiaselektor zdjęć można używać do przyznawania aplikacjom dostępu do treści w różnych przestrzeniach, gdy przestrzeń prywatna jest odblokowana.

Użytkownicy nie mogą przenosić istniejących aplikacji i ich danych do przestrzeni prywatnej. Zamiast tego użytkownicy wybierają opcję instalacji w przestrzeni prywatnej, aby zainstalować aplikację w dowolnym sklepie z aplikacjami. Aplikacje w przestrzeni prywatnej są instalowane jako osobne kopie aplikacji w przestrzeni głównej (nowe kopie tej samej aplikacji).

Gdy użytkownik zablokuje przestrzeń prywatną, profil zostanie zatrzymany. Gdy profil jest zatrzymany, aplikacje w obszarze prywatnej nie są już aktywne i nie mogą wykonywać działań na pierwszym planie ani w tle, w tym wyświetlać powiadomień.

Zalecamy przetestowanie aplikacji w obszarze prywatnym, aby mieć pewność, że działa ona zgodnie z oczekiwaniami, zwłaszcza jeśli należy do jednej z tych kategorii:

Sprawdzanie najnowszych wyborów użytkownika w przypadku dostępu do wybranych zdjęć

Aplikacje mogą teraz wyróżniać tylko ostatnio wybrane zdjęcia i filmy, gdy użytkownik przyzna uprawnienia do multimediów w ramach dostępu częściowego. Ta funkcja może poprawić wyniki aplikacji, które często proszą o dostęp do zdjęć, filmy. Aby korzystać z tej funkcji w aplikacji, włącz argument QUERY_ARG_LATEST_SELECTION_ONLY podczas wysyłania zapytania MediaStore za pomocą interfejsu 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)
});

Piaskownica prywatności na Androida

Android 15 zawiera najnowsze rozszerzenia Usług reklamowych Androida, które obejmują najnowszą wersję Piaskownicy prywatności na Androidzie. Ta funkcja jest częścią naszych działań mających na celu opracowanie technologii, które poprawią prywatność użytkowników oraz umożliwią skuteczne, spersonalizowane reklamy w aplikacjach mobilnych. Na stronie Piaskownicy prywatności znajdziesz więcej informacji o Piaskownicy prywatności w wersji dla deweloperów i w programach beta na Androida, które pomogą Ci zacząć.

Health Connect

Android 15 łączy najnowsze rozszerzenia Health Connect by Android – bezpieczne i scentralizowane platforma, która pozwala zarządzać zbieranymi przez aplikacje danymi o zdrowiu i aktywności fizycznej oraz je udostępniać. Ta aktualizacja obsługa dodatkowych typów danych dotyczących fitnessu, odżywianie, temperatura skóry, plany treningów itp.

Śledzenie temperatury skóry umożliwia użytkownikom przechowywanie i udostępnianie dokładniejszych danych o temperaturze z urządzenia do noszenia lub innego urządzenia śledzącego.

Plany treningowe to usystematyzowane plany treningowe, które pomagają użytkownikom osiągnąć cele fitnessowe. Plany treningowe obejmują różne cele dotyczące ukończenia i wyników:

Więcej informacji o najnowszych aktualizacjach Health Connect na Androidzie znajdziesz w prezencie Tworzenie dostosowanych usług z Androidem Health z Google I/O.

Udostępnianie ekranu aplikacji

Android 15 支持应用屏幕共享,因此用户可以仅共享或录制应用窗口,而不是整个设备屏幕。此功能首次在 Android 14 QPR2 中启用,包含 MediaProjection 回调,可让您的应用自定义应用屏幕共享体验。请注意,对于以 Android 14(API 级别 34)或更高版本为目标平台的应用,每个 MediaProjection 捕获会话都需要征得用户同意

Interfejs użytkownika i systemu

Android 15 zapewnia deweloperom aplikacji i użytkownikom większą kontrolę i elastyczność w konfigurowaniu urządzenia pod kątem swoich potrzeb.

Więcej informacji o tym, jak wykorzystać najnowsze ulepszenia w Androidzie 15, aby zwiększyć wygodę korzystania z aplikacji, znajdziesz w prezentacji Ulepszanie wrażeń użytkowników aplikacji na Androida z Google I/O.

Bogatsze podglądy widżetów dzięki interfejsowi Generated Previews API

在 Android 15 之前,提供微件选择器预览的唯一方法是指定静态图片或布局资源。这些预览通常与放置在主屏幕上的实际 widget 的外观大不相同。此外,由于无法使用 Jetpack Glance 创建静态资源,因此“资讯一览” 开发者必须为其微件截屏或创建 XML 布局, 微件预览。

Android 15 添加了对生成的预览的支持。这意味着,应用微件提供程序可以生成 RemoteViews 以用作选择器预览,而不是静态资源。

应用可以向微件选择器提供远程视图, 更新选择器中的内容,使其更能代表用户的内容 看到的内容。

推送 API

应用可以通过推送 API 提供生成的预览。应用可以提供 预览,并且不会收到明确的请求, 以提供预览。预览会保留在 AppWidgetService 中,并且主持人可以按需请求预览。以下示例加载了一个 XML 微件 并将其设置为预览:

AppWidgetManager.getInstance(appContext).setWidgetPreview(
   ComponentName(
       appContext,
       SociaLiteAppWidgetReceiver::class.java
   ),
   AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN,
   RemoteViews("com.example", R.layout.widget_preview)
)

预期的流程如下:

  1. 任何时候,widget 提供程序都会调用 setWidgetPreview。提供的预览会与其他提供方信息一起保留在 AppWidgetService 中。
  2. setWidgetPreview 会通过 AppWidgetHost.onProvidersChanged 回调。作为回应,微件宿主会重新加载其所有提供方信息。
  3. 显示微件预览时,主机会检查 AppWidgetProviderInfo.generatedPreviewCategories,如果所选类别可用,则调用 AppWidgetManager.getWidgetPreview 以返回此提供程序的已保存预览。

何时调用 setWidgetPreview

由于没有用于提供预览的回调,因此应用可以选择在运行期间的任何时间发送预览。预览的更新频率取决于微件的用例。

以下列表介绍了两大类预览用例:

  • 在 widget 预览中显示真实数据(例如个性化数据)的提供程序 或最新信息。这些提供商可以设置预览 已登录 Google 账号或已在其应用中完成初始配置。之后 可以设置一项定期任务,按照所选的节奏更新预览。 此类 widget 的示例包括照片、日历、天气或新闻 widget。
  • 在预览中显示静态信息或不显示任何数据的快捷操作 widget 的提供程序。这些提供程序可以在应用首次启动时设置预览一次。例如,快速开车便是此类微件的示例 操作 widget 或 Chrome 快捷方式 widget。

某些提供商可能会在基座接入模式选择器上显示静态预览,但真实的 信息。这些提供商应遵循指南 设置预览

Obraz w obrazie

Android 15 introduces changes in Picture-in-Picture (PiP) ensuring an even smoother transition when entering into PiP mode. This will be beneficial for apps having UI elements overlaid on top of their main UI, which goes into PiP.

Developers use the onPictureInPictureModeChanged callback to define logic that toggles the visibility of the overlaid UI elements. This callback is triggered when the PiP enter or exit animation is completed. Beginning in Android 15, the PictureInPictureUiState class includes another state.

With this UI state, apps targeting Android 15 (API level 35) will observe the Activity#onPictureInPictureUiStateChanged callback being invoked with isTransitioningToPip() as soon as the PiP animation starts. There are many UI elements that are not relevant for the app when it is in PiP mode, for example views or layout that include information such as suggestions, upcoming video, ratings, and titles. When the app goes to PiP mode, use the onPictureInPictureUiStateChanged callback to hide these UI elements. When the app goes to full screen mode from the PiP window, use onPictureInPictureModeChanged callback to unhide these elements, as shown in the following examples:

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements
        }
    }
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements
        }
    }

This quick visibility toggle of irrelevant UI elements (for a PiP window) helps ensure a smoother and flicker-free PiP enter animation.

Ulepszone reguły trybu Nie przeszkadzać

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 to AutomaticZenRule that describes the conditions on which the rule should become active for the user.
  • Added ZenDeviceEffects to AutomaticZenRule, allowing rules to trigger things like grayscale display, night mode, or dimming the wallpaper.

Ustawianie VibrationEffect dla kanałów powiadomień

Android 15 supports setting rich vibrations for incoming notifications by channel using NotificationChannel.setVibrationEffect, so your users can distinguish between different types of notifications without having to look at their device.

Element na pasku stanu wyświetlania multimediów i automatyczne zatrzymywanie

媒体投放可能会泄露用户的私密信息。一个醒目的新状态栏条状标签可让用户了解任何正在进行的屏幕投影。用户可以点按该条状标签停止投屏、共享或录制屏幕。此外,为了提供更直观的用户体验,当设备屏幕锁定后,所有正在进行的屏幕投影都会自动停止。

用于屏幕共享、投屏和录制的状态栏条状标签。

Duże ekrany i formaty

Android 15 zapewnia aplikacjom obsługę, która pozwala w pełni wykorzystać możliwości różnych form urządzeń z Androidem, w tym dużych ekranów, urządzeń składanych i z klapką.

Ulepszona wielozadaniowość na dużym ekranie

Android 15 为用户提供了在大屏设备上更好地进行多任务处理的方式。对于 例如,用户可以保存自己喜爱的分屏应用组合, 访问并固定屏幕上的任务栏,以便在应用之间快速切换。这意味着 让应用具备自适应能力比以往任何时候都更加重要。

Google I/O 大会上有一些关于构建自适应 Android 的会议 应用使用 Material 3 构建界面 自适应库 我们的文档中提供了更多帮助信息,帮助您针对大型语言 。

Obsługa ekranu zewnętrznego

您的应用可以声明一个属性,Android 15 会使用该属性来允许您的 ApplicationActivity 显示在受支持的可翻转设备的小封面屏幕上。这些屏幕太小,无法被视为适合运行 Android 应用的兼容目标平台,但您的应用可以选择支持它们,从而让您的应用在更多平台上可用。

Łączność

Android 15 aktualizuje platformę, aby zapewnić Twojej aplikacji dostęp do najnowszych osiągnięć w zakresie technologii komunikacyjnych i bezprzewodowych.

Obsługa satelitarna

Android 15 continues to extend platform support for satellite connectivity and includes some UI elements to ensure a consistent user experience across the satellite connectivity landscape.

Apps can use ServiceState.isUsingNonTerrestrialNetwork() to detect when a device is connected to a satellite, giving them more awareness of why full network services might be unavailable. Additionally, Android 15 provides support for SMS and MMS apps as well as preloaded RCS apps to use satellite connectivity for sending and receiving messages.

A notification appears when the device connects to a satellite.

Płynniejsze działanie NFC

Android 15 正在努力打造更顺畅、更可靠的感应式付款体验,同时继续支持 Android 强大的 NFC 应用生态系统。在受支持的设备上,应用可以请求 NfcAdapter 进入观察模式,在该模式下,设备会监听但不会响应 NFC 读卡器,并将应用的 NFC 服务 PollingFrame 对象发送以进行处理。PollingFrame 对象可用于在与 NFC 读卡器进行首次通信之前进行身份验证,在许多情况下,这支持一触式交易。

此外,应用可以在受支持的设备上注册过滤器,以便在有轮询循环活动时收到通知,从而能够与多个感知 NFC 的应用顺畅运行。

Rola w portfelu

Android 15 introduces a 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 Quick Access tile should go when activated. When the role is set to "None", the Quick Access tile isn't available and payment category NFC taps are only delivered to the foreground app.

Bezpieczeństwo

Android 15 pomaga zwiększyć bezpieczeństwo aplikacji, chronić jej dane oraz zapewnia użytkownikom większą przejrzystość i kontrolę nad ich danymi. Więcej informacji o tym, co robimy, aby ulepszać zabezpieczenia użytkowników i chronić Twoją aplikację przed nowymi zagrożeniami, znajdziesz w prezentacji Safeguarding user security on Android (Zapewnianie bezpieczeństwa użytkowników na Androidzie) z konferencji Google I/O.

Integracja Credential Managera z autouzupełnianiem

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.

Integracja rejestracji i logowania jednym dotknięciem z prośbami o uwierzytelnianie biometryczne

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.

Zarządzanie kluczami w przypadku pełnego szyfrowania

We are introducing the E2eeContactKeysManager in Android 15, which facilitates end-to-end encryption (E2EE) in your Android apps by providing an OS-level API for the storage of cryptographic public keys.

The E2eeContactKeysManager is designed to integrate with the platform contacts app to give users a centralized way to manage and verify their contacts' public keys.

Sprawdzanie uprawnień dotyczących identyfikatorów URI treści

Android 15 introduces a set of APIs that perform permission checks on content URIs:

Ułatwienia dostępu

Android 15 zawiera funkcje, które zwiększają dostępność dla użytkowników.

Better Braille

In Android 15, we've made it possible for TalkBack to support Braille displays that are using the HID standard over both USB and secure Bluetooth.

This standard, much like the one used by mice and keyboards, will help Android support a wider range of Braille displays over time.

Internacjonalizacja

Android 15 zawiera funkcje i możliwości, które uzupełniają wygodę korzystania z urządzenia w różnych językach.

Czcionka zmienna CJK

从 Android 15 开始,面向中文、日文和韩文 (CJK) 语言的字体文件 NotoSansCJK 现在是可变字体。可变字体为中日韩语言的创意排版提供了更多可能性。设计师可以探索更多样式的排版,并制作出以前难以实现或根本无法实现的视觉效果出色的布局。

面向中文、日文和韩文 (CJK) 的可变字体在不同字体宽度下的显示效果。

Justowanie między znakami

Starting with Android 15, text can be justified utilizing letter spacing by using JUSTIFICATION_MODE_INTER_CHARACTER. Inter-word justification was first introduced in Android 8.0 (API level 26), and inter-character justification provides similar capabilities for languages that use the whitespace character for segmentation, such as Chinese, Japanese, and others.

Layout for Japanese text using JUSTIFICATION_MODE_NONE.
Layout for English text using JUSTIFICATION_MODE_NONE.


Layout for Japanese text using JUSTIFICATION_MODE_INTER_WORD.
Layout for English text using JUSTIFICATION_MODE_INTER_WORD.


Layout for Japanese text using the JUSTIFICATION_MODE_INTER_CHARACTER.
Layout for English text using the JUSTIFICATION_MODE_INTER_CHARACTER.

Konfiguracja automatycznego podziału wiersza

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 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:

For short lines of text, 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:

For long lines of text, 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.

Dodatkowa czcionka japońska Hentaigana

In Android 15, a font file for old Japanese Hiragana (known as Hentaigana) is bundled by default. The unique shapes of Hentaigana characters can add a distinctive flair to artwork or design while also helping to preserve accurate transmission and understanding of ancient Japanese documents.

Character and text style for the Japanese Hentaigana font.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. This logo or a modified version may be used or modified by anyone to refer to the VideoLAN project or any product developed by the VideoLAN team, but does not indicate endorsement by the project.

Vulkan and the Vulkan logo are registered trademarks of the Khronos Group Inc.

OpenGL is a registered trademark and the OpenGL ES logo is a trademark of Hewlett Packard Enterprise used by permission by Khronos.