Funkcje i interfejsy API – przegląd

Android 15 wprowadza świetne funkcje i interfejsy API dla deweloperów. W następnych sekcjach omówimy te funkcje, aby ułatwić Ci rozpoczęcie korzystania z powiązanych interfejsów API.

Szczegółową listę dodanych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie porównawczym interfejsów API. Szczegółowe informacje o dodanych interfejsach API znajdziesz w dokumentacji interfejsów API Androida. W przypadku Androida 15 poszukaj interfejsów API dodanych na poziomie API 35. Aby dowiedzieć się, w jakich obszarach zmiany w systemie mogą mieć wpływ na Twoje aplikacje, zapoznaj się ze zmianami w zachowaniu Androida 15 w przypadku aplikacji kierowanych na Androida 15wszystkich 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 ułatwiających twórcom realizację ich pomysłów na urządzeniach z Androidem.

Więcej informacji o najnowszych funkcjach i rozwiązaniach dla deweloperów dotyczących multimediów i aparatów na Androidzie znajdziesz w prezencie Tworzenie nowoczesnych funkcji multimediów i aparatów na Androidzie z Google I/O.

Słabe oświetlenie

W Androidzie 15 wprowadzamy Mocniejsze oświetlenie – nowy tryb automatycznej ekspozycji dostępny zarówno w Aparacie 2, jak i w rozszerzeniu do aparatu w trybie nocnym. Funkcja Wzmocnienie słabego oświetlenia reguluje ekspozycję strumienia podglądu przy słabym oświetleniu. Różni się to od sposobu, w jaki rozszerzenie do aparatu w trybie nocnym tworzy nieruchome obrazy, ponieważ tryb nocny łączy serię zdjęć, aby utworzyć pojedynczy, ulepszony obraz. Tryb nocny sprawdza się bardzo dobrze przy nagrywaniu nieruchomych obrazów, ale nie umożliwia generowania ciągłego strumienia klatek, ale funkcja słabego oświetlenia jest dostępna. Funkcja słabego oświetlenia umożliwia korzystanie z nowych możliwości kamery:

  • Dzięki ulepszonemu podglądowi obrazu użytkownicy mogą lepiej wykadrować zdjęcia w słabym oświetleniu
  • Skanowanie kodów QR przy słabym oświetleniu

Jeśli włączysz funkcję słabego oświetlenia, będzie się ona automatycznie włączać przy słabym oświetleniu i wyłączać, gdy jest więcej światła.

Aplikacje mogą nagrywać filmy w trybie „Podgląd” przy słabym oświetleniu.

Więcej informacji znajdziesz w artykule Wzmocnienie słabego oświetlenia.

Sterowanie aparatem w aplikacji

Android 15 dodaje nowe rozszerzenie, które zapewnia większą kontrolę nad sprzętem aparatu i jego algorytmami na obsługiwanych urządzeniach:

  • Zaawansowane korekty siły lampy błyskowej umożliwiające precyzyjną kontrolę intensywności lampy błyskowej w trybach SINGLE i TORCH podczas robienia zdjęć.

Kontrola headroomu HDR

Android 15 wybiera zagłówek HDR odpowiedni do możliwości danego urządzenia i głębokości bitowej panelu. W przypadku stron z dużą ilością treści SDR, np. aplikacji do obsługi wiadomości wyświetlających jedną miniaturę w formacie HDR, takie zachowanie może negatywnie wpłynąć na postrzeganą jasność treści SDR. Android 15 umożliwia sterowanie funkcjami HDR za pomocą setDesiredHdrHeadroom, aby uzyskać równowagę między treściami SDR a HDR.

Jasność elementów interfejsu SDR na ekranie po lewej stronie wydaje się bardziej jednolita niż jasność na prawym ekranie, co symuluje możliwe problemy z zapasem w momencie, gdy treści są wymieszane z HDR i SDR. Regulacja ustawienia zapasu HDR pozwala uzyskać lepszą równowagę między treściami SDR a HDR.

Regulacja głośności

Android 15 obsługuje standard głośności CTA-2075, który pomaga uniknąć niespójności głośności dźwięku i zapewnia, że użytkownicy nie muszą ciągle dostosowywać głośności podczas przełączania się między treściami. System wykorzystuje znane cechy urządzeń wyjściowych (słuchawek i głośników) oraz metadane dotyczące głośności dostępne w treściach audio AAC, aby inteligentnie dostosowywać głośność dźwięku i poziom kompresji zakresu dynamicznego.

Aby włączyć tę funkcję, musisz się upewnić, że metadane dotyczące głośności są dostępne w: swoich treści AAC i włącz tę funkcję w aplikacji. Do tego: utwórz instancję obiektu LoudnessCodecController według Wywołuje metodę fabryczną create z dźwiękiem. identyfikator sesji z powiązanego konta AudioTrack; w tym automatycznie rozpocznie stosowanie aktualizacji audio. Możesz przekazać parametr OnLoudnessCodecUpdateListener, aby zmodyfikować lub odfiltrować parametry głośności, zanim zostaną one zastosowane w 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
}

Zostanie też zaktualizowany odtwarzacz AndroidX media3 ExoPlayer, Interfejsy API LoudnessCodecController umożliwiające płynną integrację aplikacji.

Wirtualne urządzenia MIDI 2.0

W Androidzie 13 dodano obsługę łączenia z urządzeniami MIDI 2.0 przez USB, które komunikują się za pomocą pakietu Universal MIDI Packets (UMP). Android 15 rozszerza obsługę UMP na wirtualne aplikacje MIDI, umożliwiając aplikacjom do kompozycji sterowanie aplikacjami do syntezatora jako wirtualne urządzenie MIDI 2.0 tak samo jak w przypadku urządzenia ze złączem USB MIDI 2.0.

wydajniejsze dekodowanie AV1 w oprogramowaniu;

Logo dav1d

dav1d, popularny dekoder oprogramowania AV1 firmy VideoLAN, jest teraz dostępny na urządzeniach z Androidem, które nie obsługują dekodowania AV1 w sprzęcie. dav1d jest nawet trzykrotnie bardziej wydajny niż starsza wersja dekodera AV1, dzięki czemu odtwarzanie w jakości HD AV1 jest możliwe u większej liczby użytkowników, w tym na niektórych urządzeniach niskiej i średniej klasy.

Na razie aplikacja musi wyrazić zgodę na używanie dav1d przez wywołanie jej nazwy "c2.android.av1-dav1d.decoder". W kolejnej aktualizacji program dav1d zostanie ustawiony jako domyślny dekoder oprogramowania AV1. Obsługa jest ustandaryzowana i cofnięta do urządzeń z Androidem 11, które otrzymują aktualizacje systemowe Google Play.

Narzędzia i produktywność programistów

Chociaż większość naszych działań na rzecz zwiększenia produktywności dotyczy takich narzędzi jak Android Studio, Jetpack Compose i biblioteki Jetpacka na Androida, zawsze szukamy sposobów na ułatwienie Ci realizacji Twoich pomysłów.

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

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.

Ulepszenia dotyczące plików PDF

Android 15 zawiera znaczne ulepszenia interfejsów API PdfRenderer. Aplikacje mogą zawierać zaawansowane funkcje, takie jak renderowanie plików chronionych hasłem, adnotacje, edytowanie formularzy, wyszukiwaniewybieranie z kopiowaniem. Obsługiwane są optymalizacje linearyzowanych plików PDF, które przyspieszają wyświetlanie lokalnych plików PDF i zmniejszają wykorzystanie zasobów. Biblioteka PDF Jetpacka używa tych interfejsów API, aby ułatwić dodawanie do aplikacji możliwości wyświetlania plików PDF.

Najnowsze aktualizacje renderowania PDF obejmują funkcje takie jak wyszukiwanie wbudowanego pliku PDF.

Sekcja PdfRenderer została przeniesiona do modułu, który może być aktualizowany za pomocą Google Aktualizacje systemu Google Play niezależne od wersji platformy, a my aby wrócić do Androida 11 (poziom interfejsu API 30) przez utworzenie platformy API dostępnej w wersjach starszych niż Android 15 PdfRendererPreV

Ulepszenia automatycznego przełączania języka

Android 14 ma wbudowane, wielojęzyczne rozpoznawanie treści audio z automatycznym przełączaniem języków, ale może to powodować zapominanie słów, zwłaszcza gdy między językami jest przerywana krótsza przerwa. Android 15 zawiera dodatkowe elementy sterujące, które pomagają aplikacjom dostosować ten proces do swoich potrzeb. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS ogranicza automatyczne przełączanie się na początek sesji audio, a EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES wyłącza przełączanie języka po określonej liczbie przełączników. Te opcje są szczególnie przydatne, jeśli spodziewasz się, że podczas sesji będzie mówiony w jednym języku, który powinien być automatycznie wykrywany.

Ulepszona usługa OpenType Variable Font API

W Androidzie 15 łatwiejsza obsługa czcionki zmiennej OpenType. Teraz możesz utworzyć instancję FontFamily z czcionki zmiennej bez określania, osie wagowe za pomocą interfejsu API buildVariableFamily. Zastąpienia mechanizmu renderowania tekstu wartość osi wght, aby pasowała do wyświetlanego tekstu.

Dzięki nowemu interfejsowi API upraszcza to kod do tworzenia Typeface znacznie:

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();

Wcześniej, aby utworzyć ten sam element Typeface, potrzeba dużo więcej kodu:

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();

Oto przykład tworzenia obiektu Typeface za pomocą starego i nowego interfejsu API renderuje:

Przykład różnicy w renderowaniu kroju pisma w nowym i starym stylu
Interfejsy API

W tym przykładzie obiekt Typeface utworzony za pomocą starego interfejsu API nie zawiera możliwość tworzenia dokładnych grubości czcionek dla 350, 450, 550 i 650 Font, więc mechanizm renderowania wraca do najbliższej wagi. Zatem w: w tym przypadku renderowanych jest 300 zamiast 350, 400 zamiast 450 oraz i tak dalej. Natomiast interfejs Typeface utworzony przy użyciu nowych interfejsów API dynamicznie tworzy wystąpienie Font dla danej wagi, więc dokładne wagi są renderowane dla 350, 450, 550 i 650.

Szczegółowe opcje dotyczące podziału wiersza

Począwszy od Androida 15 TextView i powiązany z nimi podział wiersza mogą zachować daną część tekstu w tym samym wierszu, aby zwiększyć czytelność. Możesz skorzystać z tej opcji dostosowywania znaku końca wiersza, używając tagu <nobreak> w zasobach napisów lub w pliku createNoBreakSpan. Podobnie możesz zachować słowa przed dzieleniem na sylaby, używając tagu <nohyphen> lub createNoHyphenationSpan.

Na przykład ten zasób z ciągiem znaków nie zawiera podziału wiersza i renderuje się z tekstem „Pixel 8 Pro” w nieodpowiednim miejscu:

<resources>
    <string name="pixel8pro">The power and brains behind Pixel 8 Pro.</string>
</resources>

Ten zasób ciągu znaków zawiera natomiast tag <nobreak>, który otacza wyrażenie „Pixel 8 Pro” i zapobiega podziałom wiersza:

<resources>
    <string name="pixel8pro">The power and brains behind <nobreak>Pixel 8 Pro.</nobreak></string>
</resources>

Różnica w sposobie renderowania tych ciągów znaków jest widoczna na tych obrazach:

Układ wiersza tekstu, w którym wyrażenie „Pixel 8 Pro” nie jest zawijane za pomocą tagu <nobreak>.
Układ tego samego wiersza tekstu, w którym wyrażenie „Pixel 8 Pro” jest zawinięte za pomocą tagu <nobreak>.

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.

Grafika

Android 15 wprowadza najnowsze ulepszenia grafiki, w tym ANGLE i dodatkowe funkcje w systemie graficznym Canvas.

Modernizacja dostępu do GPU w Androidzie

Vulkan logo

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

Roadmap of upcoming changes to the Android GPU APIs.

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++.

Ulepszenia Canvas

Android 15 to kontynuacja modernizacji systemu graficznego Canvas na Androidzie za pomocą nowych funkcji:

  • Matrix44 udostępnia macierz 4 x 4 do przekształcania współrzędnych, które należy stosować do manipulowania obszarem roboczym w 3D.
  • clipShader przecina bieżący klip z określonym cieniem, a clipOutShader ustawia klip na różnicę między klipem bieżącym a cieniem, co oznacza, że program do cieniowania będzie traktowany jak maska alfa. Umożliwia to wydajne rysowanie złożonych kształtów.

Wydajność i bateria

Android nadal pomaga Ci poprawiać wydajność i jakość aplikacji. Android 15 wprowadza interfejsy API, które pomagają zwiększyć wydajność wykonywania zadań w aplikacji, zoptymalizować jej działanie i zbierać statystyki dotyczące aplikacji.

Aby dowiedzieć się więcej o sprawdzonym sposobie oszczędzania baterii, debugowaniu sieci i zużycia energii oraz o tym, jak zwiększamy wydajność baterii w procesach działających w tle w Androidzie 15 i nowszych wersjach, obejrzyj wykład Zwiększanie wydajności baterii w procesach działających w tle na Androidzie z Google I/O.

ApplicationStartInfo API

W poprzednich wersjach Androida uruchamianie aplikacji jest nieco tajemnicą. Ustalenie, czy działanie aplikacji było zimne, ciepłe czy gorące, było trudne. Trudno było też określić, ile czasu spędziła aplikacja na różnych etapach wprowadzania na rynek, takich jak rozwidlenie procesu, wywoływanie funkcji onCreate, rysowanie pierwszej klatki itd. Po utworzeniu instancji klasy Application nie można było stwierdzić, czy aplikacja została uruchomiona przez transmisję, dostawcę treści, zadanie, kopię zapasową, rozruch ukończony, alarm czy Activity.

Interfejs API ApplicationStartInfo w Androidzie 15 zapewnia wszystkie te i inne funkcje. Możesz nawet dodać do procesu własne sygnatury czasowe, aby ułatwić zbieranie danych o czasie w jednym miejscu. Oprócz zbierania danych możesz też wykorzystać właściwość ApplicationStartInfo do bezpośredniego optymalizowania uruchamiania aplikacji. Możesz na przykład wyeliminować kosztowne tworzenie w klasie Application kosztownych instancji bibliotek związanych z interfejsem podczas uruchamiania aplikacji z powodu transmisji.

Szczegółowe informacje o rozmiarze aplikacji

Od Androida w wersji 8.0 (poziom interfejsu API 26) Android obejmuje interfejs API StorageStats.getAppBytes, który podsumowuje rozmiar zainstalowanej aplikacji w pojedynczej liczbie bajtów, czyli sumy rozmiaru pliku APK, rozmiaru plików wyodrębnionych z pliku APK i plików wygenerowanych na urządzeniu, np. kodu skompilowanego z wyprzedzeniem (AOT). Ta wartość nie jest zbyt przydatna, jeśli chodzi o to, jak aplikacja wykorzystuje miejsce na dane.

W Androidzie 15 dodajemy interfejs API StorageStats.getAppBytesByDataType([type]), który pozwala sprawdzić, jak aplikacja wykorzystuje całe to miejsce, w tym podział plików APK, kod AOT i kod przyspieszający, metadane .dex, biblioteki i profile z instrukcjami.

Profilowanie zarządzane przez aplikację

Android 15 includes the ProfilingManager class, which lets you collect profiling information from within your app such as heap dumps, heap profiles, stack sampling, and more. It provides a callback to your app with a supplied tag to identify the output file, which is delivered to your app's files directory. The API does rate limiting to minimize the performance impact.

To simplify constructing profiling requests in your app, we recommend using the corresponding Profiling AndroidX API, available in Core 1.15.0-rc01 or higher.

Ulepszenia bazy danych SQLite

Android 15 wprowadza interfejsy API SQLite, które udostępniają zaawansowane funkcje podstawowego mechanizmu SQLite, ukierunkowane na konkretne problemy z wydajnością, które mogą wystąpić w aplikacjach. Te interfejsy API są uwzględnione w aktualizacji SQLite do wersji 3.44.3.

Aby w pełni wykorzystać możliwości bazy danych SQLite, zwłaszcza w przypadku dużych baz danych lub wykonywania zapytań wrażliwych na opóźnienia, deweloperzy powinni zapoznać się z najlepszymi praktykami dotyczącymi wydajności SQLite.

  • Transakcje odroczone tylko do odczytu: w przypadku zawierania transakcji, które są tylko do odczytu (bez instrukcji zapisu), należy użyć funkcji beginTransactionReadOnly() i beginTransactionWithListenerReadOnly(SQLiteTransactionListener). do wystawiania transakcji DEFERRED tylko do odczytu. Takie transakcje mogą być realizowane jednocześnie, a jeśli baza danych jest w trybie WAL, można prowadzić równolegle z IMMEDIATE lub EXCLUSIVE transakcjami.
  • Liczba i identyfikatory wierszy: dodano interfejsy API, które umożliwiają pobieranie liczby zmienionych wierszy lub identyfikatora ostatniego wstawionego wiersza bez wysyłania dodatkowego zapytania. getLastChangedRowCount() zwraca liczbę wierszy, które zostały wstawione, zaktualizowane lub usunięte przez najnowszą instrukcję SQL w ciągu bieżącej transakcji, a getTotalChangedRowCount() zwraca liczbę dla bieżącego połączenia. getLastInsertRowId() zwraca rowid ostatniego wiersza, który ma zostać wstawiony w bieżącym połączeniu.
  • Instrukcje w postaci łańcucha znaków: instrukcje w postaci łańcucha znaków, które są wysyłane do bazy danych SQLite, omijając wrappery i dodatkowe obciążenia przetwarzania, które mogą one generować.

Aktualizacje dotyczące platformy Dynamic Performance Framework na Androida

Android 15 to kontynuacja inwestycji w Android Dynamic Performance Framework (ADPF) – zestaw interfejsów API, które umożliwiają grom i wymagającym wydajnym aplikacjom bardziej bezpośrednią interakcję z systemami zasilania i termii urządzeń z Androidem. Na obsługiwanych urządzeniach Android 15 doda nowe możliwości ADPF:

  • tryb energooszczędności używany w sesjach ze wskazówkami, który wskazuje, że powiązane z nimi wątki powinny korzystać z oszczędności energii, a nie większej wydajności. Jest to idealne rozwiązanie w przypadku długotrwałych zadań w tle.
  • Czasy pracy GPU i CPU mogą być raportowane w sesjach wskazówek, co umożliwia systemowi dostosowanie częstotliwości CPU i GPU razem, aby jak najlepiej sprostać wymaganiom zadań.
  • Progi dotyczące rezerwy cieplnej służące do interpretowania możliwego stanu ograniczania termicznego na podstawie prognozy dotyczącej pola manewru.

Więcej informacji o używaniu ADPF w aplikacjach i grach znajdziesz w dokumentacji.

Prywatność

Android 15 zawiera wiele funkcji, które pomagają deweloperom aplikacji chronić prywatność użytkowników.

Wykrywanie nagrywania ekranu

Android 15 obsługuje aplikacje, aby wykrywać w trakcie nagrywania. Funkcja wywołania zwrotnego jest wywoływana, gdy aplikacja przechodzi z widocznego stanu do niewidocznego w nagraniu ekranu. Aplikacja jest są uznawane za widoczne, jeśli działania należące do identyfikatora UID procesu rejestracji są nie są zapisywane. Dzięki temu, jeśli aplikacja wykonuje działanie związane z poufnymi danymi, możesz poinformować użytkownika, że jest nagrywany.

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 obsługuje dokładniejsze Intent dzięki UriRelativeFilterGroup, który zawiera zestaw obiektów UriRelativeFilter tworzących zestaw zasad dopasowania Intent, które muszą być spełnione, w tym parametry zapytania URL, fragmenty adresów URL oraz reguły blokowania lub wykluczania.

Te reguły można zdefiniować w pliku XML AndroidManifest za pomocą tagu <uri-relative-filter-group>, który może opcjonalnie zawierać tag android:allow. Mogą one zawierać tagi <data>, które używają istniejących atrybutów tagów danych, a także atrybutów android:query i android:fragment.

Oto przykład składni AndroidManifest:

<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.BROWSABLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="http" />
  <data android:scheme="https" />
  <data android:domain="astore.com" />
  <uri-relative-filter-group>
    <data android:pathPrefix="/auth" />
    <data android:query="region=na" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:query="mobileoptout=true" />
  </uri-relative-filter-group>
  <uri-relative-filter-group android:allow="false">
    <data android:pathPrefix="/auth" />
    <data android:fragmentPrefix="faq" />
  </uri-relative-filter-group>
</intent-filter>

Przestrzeń prywatna

Obszar prywatny można odblokować i zablokować, aby pokazać lub ukryć poufnych aplikacji na urządzeniu.

Przestrzeń prywatna umożliwia użytkownikom utworzenie na urządzeniu osobnego obszaru, w którym izolować od wrażliwych aplikacji bez wścibskich osób pod dodatkową warstwą uwierzytelnianie. Obszar prywatny korzysta z osobnego profilu użytkownika. Użytkownik może wybrać, czy w przestrzeni prywatnej chcesz używać blokady urządzenia czy osobnego ustawienia blokady.

aplikacje w przestrzeni prywatnej wyświetlają się w osobnym kontenerze w Menu z aplikacjami, nie są widoczne w widoku ostatnich osób, w powiadomieniach, ustawieniach ani w innych aplikacjach gdy przestrzeń prywatna jest zablokowana. treści użytkowników i pobrane przez nich (np. multimedia lub pliki) i konta są oddzielone między przestrzenią prywatną a zasobami głównej przestrzeni. Arkusz udostępniania oraz selektor zdjęć może służyć do przyznawania aplikacjom dostępu do treści. między pokojami, gdy przestrzeń prywatna jest odblokowana.

Użytkownicy nie będą mogli przenosić istniejących aplikacji ani ich danych do obszaru prywatnego. Zamiast tego: użytkownicy wybierają opcję instalacji w przestrzeni prywatnej, aby zainstalować aplikację za pomocą w dowolnym sklepie z aplikacjami. Aplikacje w przestrzeni prywatnej są instalowane jako oddzielać kopie od aplikacji w obszarze głównym (nowe kopie tej samej aplikacji).

Gdy użytkownik zablokuje przestrzeń prywatną, profil zostanie zatrzymany. Profil jest zatrzymana, aplikacje w przestrzeni prywatnej nie są już aktywne i nie mogą działać aktywności na pierwszym planie lub w tle, w tym wyświetlania powiadomień.

Zalecamy przetestowanie aplikacji w przestrzeni prywatnej, aby upewnić się, działa zgodnie z oczekiwaniami, zwłaszcza jeśli aplikacja należy do jednej z tych kategorii: kategorie:

Zapytanie o najnowszy wybór użytkownika dotyczący dostępu do wybranych zdjęć

Apps can now highlight only the most-recently-selected photos and videos when partial access to media permissions is granted. This feature can improve the user experience for apps that frequently request access to photos and videos. To use this feature in your app, enable the QUERY_ARG_LATEST_SELECTION_ONLY argument when querying MediaStore through 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 oraz najnowszą wersję Piaskownicy prywatności na Androida. W ramach tych działań opracowujemy nowe technologie, które poprawią prywatność użytkowników i umożliwią wyświetlanie skutecznych, spersonalizowanych reklam w aplikacjach mobilnych. Na naszej stronie Piaskownicy prywatności znajdziesz więcej informacji o programach testowania i testów beta Piaskownicy prywatności na Androida, które pomogą Ci zacząć.

Health Connect

Android 15 integrates the latest extensions around Health Connect by Android, a secure and centralized platform to manage and share app-collected health and fitness data. This update adds support for additional data types across fitness, nutrition, skin temperature, training plans, and more.

Skin temperature tracking allows users to store and share more accurate temperature data from a wearable or other tracking device.

Training plans are structured workout plans to help a user achieve their fitness goals. Training plans support includes a variety of completion and performance goals:

Learn more about the latest updates to Health Connect in Android in the Building adaptable experiences with Android Health talk from Google I/O.

Udostępnianie ekranu aplikacji

Android 15 obsługuje udostępnianie ekranu aplikacji, dzięki czemu użytkownicy mogą udostępniać lub nagrywać tylko okno aplikacji, a nie cały ekran urządzenia. Ta funkcja, która została po raz pierwszy włączona w Androidzie 14 QPR2, obejmuje wywołania MediaProjection, które umożliwiają aplikacji dostosowywanie udostępniania ekranu. Pamiętaj, że w przypadku aplikacji kierowanych na Androida 14 (poziom API 34) lub nowszego wymagana jest zgoda użytkownika na każdą sesję rejestrowania MediaProjection.

Wrażenia użytkownika i interfejs systemu

Android 15 daje deweloperom i użytkownikom aplikacji większą kontrolę oraz elastyczność w konfigurowaniu urządzenia zgodnie z ich potrzebami.

Aby dowiedzieć się więcej o tym, jak korzystać z najnowszych ulepszeń w Androidzie 15, aby poprawić wrażenia użytkowników aplikacji, obejrzyj prezentację Ulepszenie wrażeń użytkowników aplikacji na Androidzie z Google I/O.

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

Przed Androidem 15 jedynym sposobem wyświetlania podglądów selektora widżetów było określenie statycznych zasobów obrazów lub układu. Te podglądy często znacznie różnią się od wyglądu widżetu na ekranie głównym. Ponadto za pomocą Jetpack Glance nie można tworzyć zasobów statycznych, więc deweloper Glance musiał zrobić zrzut ekranu z widżetem lub utworzyć układ XML, aby wyświetlić jego podgląd.

Android 15 obsługuje wygenerowane podglądy. Oznacza to, że dostawcy widżetów aplikacji mogą generować RemoteViews, aby używać go jako podglądu selektora zamiast zasobu statycznego.

Aplikacje mogą udostępniać widoki zdalne do selektora widżetów, co pozwala aktualizować zawartość selektora w taki sposób, aby lepiej reprezentował to, co zobaczy użytkownik.

Interfejs API usługi Push

Aplikacje mogą udostępniać wygenerowane podglądy za pomocą interfejsu API push. Aplikacje mogą udostępniać podglądy w dowolnym momencie ich cyklu życia i nie muszą otrzymać wyraźnej prośby od gospodarza. Podglądy są przechowywane w AppWidgetService, a gospodarze mogą je żądać na żądanie. W tym przykładzie wczytujemy zasób układu widżetu XML i ustawiamy go jako podgląd:

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

Oczekiwany przebieg:

  1. W dowolnym momencie dostawca widżetu może wywołać funkcję setWidgetPreview. Udostępnione podglądy są przechowywane w AppWidgetService wraz z innymi informacjami o dostawcy.
  2. setWidgetPreview informuje hostów o zaktualizowanym podglądzie za pomocą wywołania zwrotnego AppWidgetHost.onProvidersChanged. W odpowiedzi host widżetu ponownie wczytuje wszystkie informacje dostawcy.
  3. Podczas wyświetlania podglądu widżetu host sprawdza, czy AppWidgetProviderInfo.generatedPreviewCategories jest dostępna, a jeśli tak, wywołuje funkcję AppWidgetManager.getWidgetPreview, aby zwrócić zapisany podgląd dla tego dostawcy.

Kiedy zadzwonić do: setWidgetPreview

Ponieważ nie ma wywołania zwrotnego, które umożliwia wyświetlanie podglądów, aplikacje mogą wysyłać podglądy w dowolnym momencie, gdy są uruchomione. Częstotliwość aktualizacji podglądu zależy od przypadku użycia widżetu.

Na liście poniżej znajdziesz 2 główne kategorie przypadków użycia podglądu:

  • Dostawcy, którzy wyświetlają prawdziwe dane w podglądzie widżetów, np. informacje spersonalizowane lub najnowsze informacje. Ci dostawcy mogą ustawić podgląd po zalogowaniu się użytkownika lub po wykonaniu wstępnej konfiguracji w aplikacji. Następnie mogą skonfigurować zadanie okresowe, aby aktualizować podgląd w wybranym interwale. Przykładami tego typu widżetów są widżety ze zdjęciami, kalendarza, pogody lub wiadomościami.
  • Dostawcy, którzy wyświetlają w podglądach informacje statyczne lub widżety szybkich działań, które nie wyświetlają żadnych danych. Ci dostawcy mogą ustawić podgląd tylko raz przy pierwszym uruchomieniu aplikacji. Przykładami tego typu widżetów są widżet Szybkie działania na Dysku lub widżet skrótów w Chrome.

Niektórzy dostawcy mogą wyświetlać podgląd statyczny w selektorze trybu centrali, ale w selektorze na ekranie głównym mogą wyświetlać prawdziwe informacje. Podczas ustawiania podglądów dostawcy ci powinni postępować zgodnie ze wskazówkami dotyczącymi obu tych przypadków użycia.

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 efektu wibracji dla kanałów powiadomień

Android 15 obsługuje ustawienia silnych wibracji dla przychodzących powiadomień przez za pomocą NotificationChannel.setVibrationEffect, więc użytkownicy mogą odróżniać różne typy powiadomień bez patrząc na urządzenie.

Pasek stanu wyświetlania multimediów i automatyczne zatrzymywanie

Media projection can expose private user information. A new, prominent status bar chip makes users aware of any ongoing screen projection. Users can tap the chip to stop screen casting, sharing, or recording. Also, for a more intuitive user experience, any in‑progress screen projection now automatically stops when the device screen is locked.

Status bar chip for screen sharing, casting, and recording.

Duże ekrany i formaty

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

Ulepszona wielozadaniowość na dużym ekranie

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.

Obsługa ekranu zakrywającego

Aplikacja może zadeklarować usługę, której używa Android 15, aby umożliwić wyświetlanie elementów Application i Activity na niewielkich ekranach okładkowych obsługiwanych urządzeń z obracanym ekranem. Te ekrany są za małe, aby można je było uznać za zgodne z aplikacjami na Androida cele. Możesz jednak włączyć ich obsługę w aplikacji, dzięki czemu będzie ona dostępna w większej liczbie miejsc.

Łączność

Android 15 aktualizuje platformę, aby umożliwić Twojej aplikacji dostęp do najnowszych osiągnięć w zakresie komunikacji i technologii bezprzewodowych.

Obsługa satelity

Android 15 rozszerza obsługę platformy w zakresie łączności satelitarnej, zawiera kilka elementów UI, by zapewnić spójność połączenia satelitarnego.

Aplikacje mogą używać ServiceState.isUsingNonTerrestrialNetwork() do wykrywania, kiedy urządzenie jest połączone z satelitą, dzięki czemu użytkownicy lepiej rozumieją, dlaczego pełne usługi sieciowe mogą być niedostępne. Android 15 obsługuje też aplikacje SMS i MMS oraz wstępnie zainstalowane aplikacje RCS, które umożliwiają korzystanie z łączności satelitarnej do wysyłania i odbierania wiadomości.

Powiadomienie pojawi się, gdy urządzenie połączy się z satelitą.

płynniejsze korzystanie z NFC,

Android 15 is working to make the tap to pay experience more seamless and reliable while continuing to support Android's robust NFC app ecosystem. On supported devices, apps can request the NfcAdapter to enter observe mode, where the device listens but doesn't respond to NFC readers, sending the app's NFC service PollingFrame objects to process. The PollingFrame objects can be used to auth ahead of the first communication to the NFC reader, allowing for a one tap transaction in many cases.

In addition, apps can register a filter on supported devices so they can be notified of polling loop activity, which allows for smooth operation with multiple NFC-aware applications.

Rola portfela

Android 15 wprowadza nową rolę Portfela, która umożliwia ściślejszą integrację z preferowaną przez użytkownika aplikacją portfela. Ta rola zastępuje domyślne ustawienie płatności zbliżeniowych NFC. Użytkownicy mogą zarządzać właścicielem roli Portfela, wybierając kolejno Ustawienia > Aplikacje > Aplikacje domyślne.

Rola w Portfelu jest używana do kierowania kliknięć NFC w przypadku identyfikatorów AID zarejestrowanych w kategorii płatności. Kliknięcie zawsze powoduje przejście do właściciela roli Portfela, chyba że na pierwszym planie działa inna aplikacja zarejestrowana w przypadku tego samego identyfikatora AID.

Ta rola służy też do określania, gdzie powinien znaleźć się kafelek Szybki dostęp Portfela po aktywowaniu. Gdy rola ma wartość „Brak”, kafelek Szybki dostęp jest niedostępny, a kliknięcia NFC według kategorii płatności są wyświetlane tylko w aplikacji na pierwszym planie.

Bezpieczeństwo

Android 15 pomaga zwiększyć bezpieczeństwo aplikacji i chronić jej dane. Zapewnia też użytkownikom większą przejrzystość i kontrolę nad ich danymi. Więcej informacji o tym, co robimy, aby zwiększać bezpieczeństwo użytkowników i chronić ich aplikacje przed nowymi zagrożeniami, znajdziesz w prezentacji Ochrona bezpieczeństwa użytkowników Androida z Google I/O.

Integracja Menedżera danych logowania 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 kliknięciem z prośbami biometrycznymi

Menedżer danych uwierzytelniających integruje prompty biometryczne z procesami tworzenia danych uwierzytelniających i logowania, dzięki czemu dostawcy nie muszą zarządzać promptami biometrycznymi. Dlatego dostawcy danych uwierzytelniających mogą się skupić jedynie na wyników tworzenia i odbierania przepływów, wzbogaconych o wynik przepływu biometrycznego. Ten uproszczony proces umożliwia bardziej wydajne i prostsze tworzenie oraz pobieranie danych logowania.

Zarządzanie kluczami w przypadku pełnego szyfrowania

Wprowadzamy na Androidzie 15 funkcję E2eeContactKeysManager, która ułatwia pełne szyfrowanie (E2EE) w aplikacjach na Androida dzięki interfejsowi API na poziomie systemu operacyjnego do przechowywania kryptograficznych kluczy publicznych.

E2eeContactKeysManager został opracowany z myślą o integracji z aplikacją do obsługi kontaktów na platformie. Dzięki temu użytkownicy mogą w scentralizowany sposób zarządzać kluczami publicznymi kontaktów i je weryfikować.

Sprawdzanie uprawnień w przypadku 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 poprawiają dostępność dla użytkowników.

Lepszy brajl

W Androidzie 15 umożliwiliśmy TalkBack obsługę monitorów brajlowskich korzystających ze standardu HID zarówno przez USB, jak i bezpiecznego Bluetootha.

Ten standard, podobnie jak używany przez myszy i klawiatury, ułatwi Androidowi obsługę szerszej gamy monitorów brajlowskich.

Internacjonalizacja

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

CJK czcionka zmienna

Począwszy od Androida 15 plik czcionki NotoSansCJK dla języka chińskiego, japońskiego i koreańskiego (CJK) jest teraz czcionką zmienną. Zmienne czcionki otwierają nowe możliwości dla typografii kreacji w językach CJK. Projektanci mogą odkrywać szerszą gamę stylów i tworzyć efektowne układy, które wcześniej były trudne lub niewykonalne.

Sposób wyświetlania czcionki zmiennej w językach chińskim, japońskim i koreańskim (CJK) w przypadku różnych szerokości czcionki.

Uzasadnienie dotyczące znaków pośrednich

Od Androida 15 tekst można wyrównać do lewej, korzystając z odstępów między literami za pomocą znaku JUSTIFICATION_MODE_INTER_CHARACTER. Poprzednie uzasadnienie między słowami: po raz pierwszy wprowadzona w Androidzie 8.0 (poziom interfejsu API 26) daje podobne możliwości w językach korzystających z funkcji znak odstępu na potrzeby segmentacji, np. w języku chińskim, japońskim itp.

Układ tekstu japońskiego za pomocą JUSTIFICATION_MODE_NONE.
Układ tekstu w języku angielskim za pomocą: JUSTIFICATION_MODE_NONE.


Układ tekstu w języku japońskim za pomocą JUSTIFICATION_MODE_INTER_WORD.
Układ tekstu angielskiego z użyciem JUSTIFICATION_MODE_INTER_WORD.


Układ tekstu w języku japońskim za pomocą: JUSTIFICATION_MODE_INTER_CHARACTER.
Układ tekstu w języku angielskim za pomocą: 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

W Androidzie 15 domyślnie jest dołączony plik czcionki starej japońskiej Hiragana (zwanej Hentaigana). Dzięki wyjątkowym kształtom postaci hentaigana charakterystyczne dla dzieła sztuki lub wzornictwa, a także pomagają zachować wierność przekazywanie i rozumienie starożytnych japońskich dokumentów.

Styl znaków i tekstu dla japońskiego hentaigany czcionki.

Krzyżówka VideoLAN Copyright (c) 1996–2010 VideoLAN. To logo oraz jego zmodyfikowana wersja mogą być używane lub modyfikowane przez dowolną osobę w celu odwoływania się do projektu VideoLAN lub dowolnego produktu opracowanego przez zespół VideoLAN, ale nie wskazuje, że projekt pochodzi z rekomendacji.

Vulkan i logo Vulkan są zastrzeżonymi znakami towarowymi firmy Khronos Group Inc.

OpenGL jest zastrzeżonym znakiem towarowym, a logo OpenGL ES jest znakiem towarowym firmy Hewlett Packard Enterprise i używa go za zgodą Khronos.