Omówienie funkcji i interfejsów API

Android 15 wprowadza nowe, przydatne funkcje i interfejsy API dla deweloperów. W sekcjach poniżej znajdziesz podsumowanie tych funkcji, które pomogą Ci zacząć korzystać z powiązanych z nimi interfejsów API.

Szczegółową listę nowych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie Różnice między interfejsami API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji interfejsów API Androida. Nowe interfejsy API zostały wyróżnione. Aby dowiedzieć się, w jakich obszarach zmiany na platformie mogą wpływać na Twoje aplikacje, zapoznaj się ze zmianami w działaniu Androida 15, które wpływają na aplikacje kierowane na ten system, oraz o zmianach w zachowaniu, które dotyczą wszystkich aplikacji niezależnie od wersji targetSdkVersion.

Aparat i multimedia

Android 15 ma wiele funkcji, które usprawniają korzystanie z kamery i multimediów oraz dają dostęp do narzędzi i sprzętu, które pomagają twórcom w realizowaniu ich wizji na Androidzie.

Więcej informacji o najnowszych funkcjach i rozwiązaniach dla programistów dotyczących multimediów i aparatu na Androida znajdziesz w prezentacji Google I/O na temat tworzenia nowoczesnych multimediów i aparatów na Androida.

Wzmocnienie słabego oświetlenia

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 kamerą 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ęć.

Ustawienia HDR w ramach pola manewru

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 wprowadza obsługę standardu głośności CTA-2075, aby uniknąć niespójności w zakresie głośności dźwięku i uniknąć konieczności ciągłego dostosowywania głośności podczas przełączania się między treściami. System korzysta ze znanych cech urządzeń wyjściowych (słuchawek i głośników) wraz z metadanymi głośności dostępnymi 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 sprawdzić, czy metadane dotyczące głośności są dostępne w treściach AAC, i włączyć w niej funkcję platformy. W tym celu możesz uruchomić obiekt LoudnessCodecController, wywołując jego metodę create fabryki z identyfikatorem sesji audio z powiązanego elementu AudioTrack. Spowoduje to automatyczne rozpoczęcie aktualizacji dźwięku. Możesz przekazać OnLoudnessCodecUpdateListener, aby zmodyfikować lub filtrować parametry głośności, zanim zostaną one zastosowane w elemencie 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
}

Odtwarzacz ExoPlayer AndroidX zostanie też zaktualizowany, aby umożliwić płynną integrację aplikacji z interfejsami API LoudnessCodecController.

Urządzenia wirtualne 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.

Bardziej wydajne dekodowanie oprogramowania AV1

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.

Produktywność i narzędzia programistów

Większość naszych starań o ulepszenie produktywności koncentrujemy się na narzędziach takich jak Android Studio, Jetpack Compose i biblioteki Android Jetpack. Na naszej platformie zawsze poszukujemy sposobów, które pomogą Ci łatwiej zrealizować Twoją wizję.

Aktualizacje OpenJDK 17

Android 15 kontynuuje prace nad odświeżaniem podstawowych bibliotek Androida w celu zapewnienia zgodności z funkcjami w najnowszych wersjach OpenJDK LTS.

Wprowadzono następujące funkcje i usprawnienia:

Te interfejsy API są aktualizowane na ponad miliardzie urządzeń z Androidem 12 (poziom interfejsu API 31) lub nowszym w ramach aktualizacji systemu Google Play, dzięki czemu możesz ukierunkować się na najnowsze funkcje programistyczne.

Ulepszenia dotyczące plików PDF

Android 15 zawiera istotne ulepszenia interfejsów API PdfRenderer. Aplikacje mogą zawierać zaawansowane funkcje, takie jak renderowanie plików chronionych hasłem, adnotacje, edytowanie formularzy, wyszukiwanie i wybieranie plików razem z kopią. Optymalizacje linearnych plików PDF są obsługiwane w celu przyspieszenia wyświetlania lokalnych plików PDF i ograniczenia zużycia zasobów.

Najnowsze aktualizacje renderowania plików PDF obejmują m.in. wyszukiwanie umieszczonego pliku PDF.

Moduł PdfRenderer został przeniesiony do modułu, który można aktualizować przy użyciu aktualizacji systemu Google Play niezależnie od wersji platformy. Aby wspieramy te zmiany z powrotem na Androida 11 (poziom interfejsu API 30), tworzymy zgodną wersję platformy API o nazwie PdfRendererPreV zgodną z wersją API sprzed Androida 15.

Twoja opinia na temat ulepszeń interfejsu PdfRenderer API jest dla nas bardzo ważna. Planujemy jeszcze bardziej ułatwić wdrażanie tych interfejsów API w ramach nadchodzącej biblioteki Android Jetpack.

Doprecyzowania przy automatycznym przełączaniu 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.

Ulepszony interfejs OpenType Zmienna Font API

Android 15 ułatwia obsługę czcionki zmiennej OpenType. Teraz możesz utworzyć instancję FontFamily na podstawie zmiennej czcionki bez określania osi wagi za pomocą interfejsu API buildVariableFamily. Mechanizm renderowania tekstu zastępuje wartość osi wght, aby pasował do wyświetlanego tekstu.

Używanie nowego interfejsu API znacznie upraszcza kod do tworzenia Typeface:

Kotlin

val newTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build()

Java

Typeface newTypeface = Typeface.CustomFallbackBuilder(
            new FontFamily.Builder(
                new Font.Builder(assets, "RobotoFlex.ttf").build())
                    .buildVariableFamily())
    .build();

Wcześniej do utworzenia tego samego elementu Typeface potrzeba znacznie 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 renderowania utworzonego elementu Typeface z użyciem starego i nowego interfejsu API:

Przykład różnic w renderowaniu czcionek w przypadku nowych i starych interfejsów API

W tym przykładzie obiekt Typeface utworzony przy użyciu starego interfejsu API nie ma możliwości tworzenia dokładnych wag czcionek w przypadku instancji Font (350, 450, 550 i 650) i 650, dlatego mechanizm renderowania wraca do najbliższej wagi. W tym przypadku wynik 300 będzie renderowany zamiast 350, renderowany jest 400 zamiast 450 itd. Z kolei Typeface tworzony z nowymi interfejsami API dynamicznie tworzy instancję Font dla danej wagi, dzięki czemu renderowane są też dokładne wagi wartości 350, 450, 550 i 650.

Ustawienia podziału wiersza

Od Androida 15 TextView i błędny podział wiersza mogą zachowywać określony fragment tekstu w tym samym wierszu, aby poprawić czytelność. Możesz skorzystać z dostosowania podziału wiersza, używając tagu <nobreak> w zasobach w postaci ciągu znaków lub tagu createNoBreakSpan. Możesz też unikać łączników za pomocą tagu <nohyphen> lub createNoHyphenationSpan.

Na przykład ten zasób tekstowy nie zawiera podziału wiersza i renderuje tekst „Pixel 8 Pro” w nieodpowiednim miejscu:

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

W przeciwieństwie do tego zasobu w postaci ciągu znaków zawiera on tag <nobreak>, który opakowuje frazę „Pixel 8 Pro.” i zapobiega podziałowi wierszy:

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

Różnicę w sposobie renderowania tych ciągów widać na tych obrazach:

Układ wiersza tekstu, w którym hasło „Pixel 8 Pro” nie jest umieszczone za pomocą tagu <nobreak>.
Układ tego samego wiersza tekstu, w którym hasło „Pixel 8 Pro.” jest otoczone tagiem <nobreak>.

Archiwizowanie aplikacji

W zeszłym roku na Androidzie i w Google Play ogłoszono wprowadzenie obsługi archiwizowania aplikacji, która umożliwia użytkownikom zwolnienie miejsca przez częściowe usunięcie z urządzenia rzadko używanych aplikacji, które zostały opublikowane przy użyciu pakietu Android App Bundle w Google Play. Android 15 obejmuje teraz obsługę archiwizowania i przywracania z archiwum na poziomie systemu operacyjnego, co ułatwia wdrożenie tej funkcji we wszystkich sklepach z aplikacjami.

Aplikacje z uprawnieniami REQUEST_DELETE_PACKAGES mogą wywołać metodę PackageInstaller requestArchive, aby poprosić o archiwizację zainstalowanego pakietu aplikacji. Spowoduje to usunięcie pliku APK i plików zapisanych w pamięci podręcznej, ale dane użytkownika pozostaną niezmienione. Zarchiwizowane aplikacje są zwracane przez interfejsy API LauncherApps jako aplikacje możliwe do wyświetlenia. Użytkownicy będą widzieli, że zostały zarchiwizowane. Jeśli użytkownik kliknie zarchiwizowaną aplikację, odpowiedzialny instalator otrzyma prośbę o przywrócenie jej z archiwum, a proces przywracania można monitorować dzięki transmisji ACTION_PACKAGE_ADDED.

Grafika

Android 15 zawiera najnowsze ulepszenia graficzne, w tym ANGLE i dodatkowe elementy do systemu graficznego Canvas.

Modernizowanie dostępu do GPU na Androidzie

Logo Vulkan

Sprzęt na Androida znacznie się rozwinął od pierwszych dni, w których podstawowy system operacyjny działał na 1 procesorze, a do układów GPU można było uzyskiwać dostęp za pomocą interfejsów API opartych na potokach o stałej funkcji. Interfejs Vulkan®graphic API jest dostępny w NDK od Androida w wersji 7.0 (poziom interfejsu API 24) w ramach abstrakcji niższego poziomu, który lepiej odzwierciedla nowoczesny sprzęt GPU, skaluje się lepiej pod kątem obsługi wielu rdzeni procesora i zapewnia mniejsze nakłady pracy ze sterownikami, co prowadzi do poprawy wydajności aplikacji. Interfejs Vulkan jest obsługiwany przez wszystkie nowoczesne silniki gier.

Interfejs Vulkan jest preferowanym w Androidzie interfejsem GPU. Dlatego Android 15 zawiera ANGLE jako opcjonalną warstwę do uruchamiania trybu OpenGL® ES na interfejsie Vulkan. Przejście na ANGLE spowoduje ustandaryzację implementacji biblioteki OpenGL na Androidzie w celu zwiększenia zgodności, a w niektórych przypadkach również zwiększenia wydajności. Możesz przetestować stabilność i wydajność aplikacji OpenGL ES za pomocą ANGLE. W tym celu włącz opcję programisty w Androidzie 15 w sekcji Ustawienia -> System -> Opcje programisty -> Eksperymentalne: włącz ANGLE.

Android ANGLE na planie Vulkan

Plan nadchodzących zmian w interfejsach API Android GPU.

W ramach usprawnienia stosu GPU będziemy wysyłać ANGLE jako sterowniki systemu GL na więcej nowych urządzeń. Spodziewamy się, że w przyszłości platforma OpenGL/ES będzie dostępna tylko na platformie ANGLE. Planujemy jednak nadal obsługiwać standard OpenGL ES na wszystkich urządzeniach.

Zalecane kolejne kroki

Użyj opcji programisty, aby wybrać sterownik ANGLE dla OpenGL ES i przetestować aplikację. W nowych projektach zdecydowanie zalecamy korzystanie z Vulkan dla 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 skupia się na pomaganiu w polepszaniu wydajności i jakości aplikacji. Android 15 wprowadza nowe interfejsy API, które ułatwiają wykonywanie zadań w aplikacji, optymalizują wydajność aplikacji i zbierają informacje o aplikacjach.

Sprawdzone metody dotyczące oszczędzania baterii, debugowanie wykorzystania sieci i energii oraz szczegółowe informacje o tym, jak zwiększamy wydajność baterii podczas pracy w tle na Androidzie 15 i najnowszych wersjach Androida znajdziesz w artykule Zwiększanie wydajności baterii podczas pracy w tle na Androidzie.

Interfejs API ApplicationStartInfo

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 zawiera zupełnie nową klasę ProfilingManager, która umożliwia zbieranie danych dotyczących profilowania z poziomu aplikacji. Planujemy dodać do niej interfejs Android Jetpack API, który uprości tworzenie żądań profilowania. Podstawowy interfejs API umożliwi jednak gromadzenie danych stosu, profili sterty, próbkowanie stosu i nie tylko. Zapewnia wywołanie zwrotne do aplikacji z dostarczonym tagiem identyfikującym plik wyjściowy, który jest dostarczany do katalogu plików aplikacji. Interfejs API ogranicza liczbę żądań, aby zminimalizować wpływ na wydajność.

Ulepszenia bazy danych SQLite

Android 15 wprowadza nowe interfejsy API SQLite, które udostępniają zaawansowane funkcje bazowego mechanizmu SQLite i są kierowane na konkretne problemy z wydajnością, które mogą występować w aplikacjach.

Deweloperzy powinni zapoznać się ze sprawdzonymi metodami dotyczącymi wydajności SQLite, aby jak najlepiej wykorzystać możliwości bazy danych SQLite, zwłaszcza w przypadku pracy z dużymi bazami danych lub wykonywania zapytań wrażliwych na opóźnienia.

  • Odroczone transakcje tylko do odczytu: jeśli wystawiasz transakcje, które są tylko do odczytu (bez instrukcji zapisu), użyj beginTransactionReadOnly() i beginTransactionWithListenerReadOnly(SQLiteTransactionListener), aby wysłać transakcje DEFERRED tylko do odczytu. Takie transakcje mogą być prowadzone równolegle, a jeśli baza danych działa w trybie WAL, mogą być uruchamiane jednocześnie z transakcjami IMMEDIATE lub EXCLUSIVE.
  • Liczba i identyfikatory wierszy: dodano nowe interfejsy API, które pozwalają pobierać liczbę zmienionych wierszy lub ostatni wstawiony identyfikator wiersza bez wysyłania dodatkowego zapytania. getLastChangedRowCount() zwraca liczbę wierszy wstawionych, zaktualizowanych lub usuniętych przez najnowszą instrukcję SQL w bieżącej transakcji, a getTotalChangedRowCount() – liczbę w bieżącym połączeniu. getLastInsertRowId() zwraca rowid z ostatniego wiersza do wstawienia w bieżącym połączeniu.
  • Nieprzetworzone instrukcje: uruchamia nieprzetworzoną instrukcję SQlite, pomijając opcjonalne opakowania i wszelkie dodatkowe koszty przetwarzania, które mogą się wiązać.

Aktualizacje platformy Android Dynamic Performance Framework

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 oferuje wiele funkcji, które pomagają deweloperom aplikacji chronić prywatność użytkownika.

Wykrywanie nagrywania ekranu

Android 15 obsługuje aplikacje w celu wykrywania, że aplikacje są nagrywane. Wywołanie zwrotne jest wywoływane za każdym razem, gdy aplikacja przechodzi między widocznością lub niewidocznością w nagraniu ekranu. Aplikacja jest uznawana za widoczną, jeśli rejestrowane są działania należące do identyfikatora UID procesu rejestracji. Dzięki temu, jeśli aplikacja wykonuje operację związaną z poufnymi danymi, możesz poinformować użytkownika o jej rejestrowaniu.

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 filtra IntentFilter

Android 15 obsługuje bardziej precyzyjną rozdzielczość Intent za pomocą UriRelativeFilterGroup, który zawiera zbiór obiektów UriRelativeFilter tworzących zestaw Intent reguł dopasowania, które muszą być spełnione, w tym parametry zapytania URL, fragmenty adresu URL oraz reguły blokowania lub wykluczania.

Te reguły można definiować w pliku XML AndroidManifest za pomocą nowego tagu <uri-relative-filter-group>, który może opcjonalnie zawierać tag android:allow. Te tagi mogą zawierać tagi <data>, które korzystają z istniejących atrybutów tagów danych, a także nowych 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" />
  <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 wyświetlić lub ukryć poufne aplikacje na urządzeniu.

Obszar prywatny umożliwia użytkownikom utworzenie na urządzeniu osobnego obszaru, w którym dzięki dodatkowej warstwie uwierzytelniania użytkownicy nie mogą zobaczyć poufnych aplikacji. Przestrzeń prywatna korzysta z osobnego profilu użytkownika. Gdy użytkownik zablokuje obszar prywatny, profil zostaje wstrzymany, a aplikacje w obszarze prywatnym nie są już aktywne. Użytkownik może użyć blokady urządzenia lub osobnego współczynnika blokady w obszarze prywatnym.

Aplikacje w obszarze prywatnym są wyświetlane w osobnym kontenerze w Menu z aplikacjami i są ukryte w widoku ostatnich, w powiadomieniach, ustawieniach i innych aplikacjach, gdy obszar prywatny jest zablokowany. Treści tworzone przez użytkowników i pobierane (np. multimedia lub pliki) oraz konta są rozdzielone między obszar prywatny a obszar główny. System udostępniania i selektor zdjęć mogą umożliwiać aplikacjom dostęp do treści w różnych przestrzeniach, gdy obszar prywatny jest odblokowany.

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

Zapytanie o najnowsze ustawienia użytkownika dotyczące dostępu do wybranych zdjęć

Teraz aplikacje mogą wyróżniać tylko ostatnio wybrane zdjęcia i filmy, gdy przyznano częściowy dostęp do uprawnień do multimediów. Ta funkcja może zwiększyć wygodę użytkowników aplikacji, które często proszą o dostęp do zdjęć i filmów. Aby użyć tej funkcji w swojej aplikacji, włącz argument QUERY_ARG_LATEST_SELECTION_ONLY w zapytaniach od MediaStore do 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 integruje najnowsze rozszerzenia związane z Health Connect na Androida – bezpiecznej i scentralizowanej platformy do zarządzania zbieranymi przez aplikacje danymi o zdrowiu i aktywności fizycznej oraz ich udostępniania. Ta aktualizacja dodaje obsługę nowych typów danych dotyczących fitnessu, odżywiania, temperatury skóry, planów treningowych i nie tylko.

Ś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 ustrukturyzowane plany treningowe, które pomagają użytkownikom osiągnąć cele treningowe. Wsparcie w zakresie planów treningowych obejmuje różne cele:

Więcej o najnowszych aktualizacjach Health Connect na Androida dowiesz się z omówienia Google I/O zatytułowanej Tworzenie elastycznych treści przy użyciu Android Health.

Częściowe udostępnianie ekranu

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

Wygoda użytkownika i interfejs systemu

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

Aby dowiedzieć się więcej o tym, jak korzystać z najnowszych ulepszeń Androida 15, które zwiększają wygodę użytkowników aplikacji, zapoznaj się z rozmową z Google I/O o zwiększaniu wygody użytkowników aplikacji na Androida.

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

Przed Androidem 15 jedynym sposobem na wyświetlanie podglądu selektora widżetów było wskazanie statycznego zasobu obrazu lub układu. Taki podgląd często znacznie różni się od wyglądu rzeczywistego widżetu umieszczonego na ekranie głównym. Za pomocą Jetpack Glance nie można tworzyć zasobów statycznych, więc deweloper aplikacji Glance musiał zrobić zrzut ekranu widżetu lub utworzyć układ XML, aby uzyskać podgląd widżetu.

Android 15 dodaje obsługę wygenerowanych podglądów. Oznacza to, że dostawcy widżetów aplikacji mogą wygenerować RemoteViews, aby używać ich jako podglądu selektora zamiast zasobu statycznego.

Aplikacje mogą udostępniać widoki zdalne do selektora widżetów, aby aktualizować jego zawartość, aby lepiej odzwierciedlała to, co zobaczy użytkownik.

Interfejs API funkcji push

Aplikacje mogą udostępniać wygenerowany podgląd za pomocą interfejsu API push. Aplikacje mogą udostępniać podgląd w dowolnym momencie cyklu życia i nie otrzymują od hosta wyraźnego żądania wyświetlenia podglądu. Podglądy są zapisywane w usłudze AppWidgetService, a hosty mogą ich żądać na żądanie. Poniższy przykład wczytuje zasób układu widżetu XML i ustawia 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 przepływ:

  1. W dowolnym momencie dostawca widżetu wywołuje metodę setWidgetPreview. Podane podglądy są przechowywane w pliku AppWidgetService z informacjami o innych dostawcach.
  2. setWidgetPreview powiadamia hosty o zaktualizowanym podglądzie, używając wywołania zwrotnego AppWidgetHost.onProvidersChanged. W odpowiedzi host widżetu ponownie wczytuje wszystkie informacje o dostawcy.
  3. Podczas wyświetlania podglądu widżetu host sprawdza AppWidgetProviderInfo.generatedPreviewCategories i jeśli wybrana kategoria jest dostępna, wywołuje metodę AppWidgetManager.getWidgetPreview, aby zwrócić zapisany podgląd dla tego dostawcy.

Kiedy zadzwonić do: setWidgetPreview

Nie ma wywołania zwrotnego do wyświetlenia podglądu, więc aplikacje mogą wysyłać podgląd w dowolnym momencie, gdy są uruchomione. Częstotliwość aktualizowania podglądu zależy od konkretnego przypadku użycia widżetu.

Na tej liście opisujemy 2 główne kategorie przypadków użycia podglądu:

  • Dostawcy, którzy wyświetlają w podglądzie widżetów prawdziwe dane, na przykład spersonalizowane lub najnowsze informacje. Ci dostawcy mogą ustawić podgląd, gdy użytkownik się zaloguje lub przeprowadzi wstępną konfigurację w aplikacji. Po zakończeniu tego procesu mogą skonfigurować zadanie okresowe aktualizujące podglądy w wybranym przez siebie cyklu. Przykładem widżetu tego typu może być zdjęcie, kalendarz, prognoza pogody lub widżet wiadomości.
  • Dostawcy, którzy wyświetlają informacje statyczne w podglądach lub widżetach szybkich działań, które nie wyświetlają żadnych danych. Dostawcy mogą ustawić podgląd raz, przy pierwszym uruchomieniu aplikacji. Przykładami widżetów tego typu są widżety skrótów Dysku i skrótów w Chrome.

Niektórzy dostawcy mogą wyświetlać podglądy statyczne w selektorze w trybie centrali, a w selektorze ekranu głównego prawdziwe informacje. Aby skonfigurować podgląd, ci dostawcy powinni stosować się do wskazówek dotyczących obu tych przypadków użycia.

Obraz w obrazie

W Androidzie 15 wprowadzono nowe zmiany w obrazie w obrazie, które zapewniają jeszcze płynniejsze przejście w tym trybie. Przydaje się to w przypadku aplikacji, których elementy interfejsu są nałożone na główny interfejs, co pozwala korzystać z obrazu w obrazie.

Programiści używają wywołania zwrotnego onPictureInPictureModeChanged do definiowania logiki, która przełącza widoczność nakładających się elementów interfejsu. To wywołanie zwrotne jest wyzwalane po zakończeniu animacji wejścia lub zakończenia działania PIP. Od wersji Androida 15 klasa PictureInPictureUiState zawiera nowy stan.

W nowym stanie interfejsu aplikacje kierowane na Androida 15 będą od razu obserwować wywołanie zwrotne Activity#onPictureInPictureUiStateChanged za pomocą metody isTransitioningToPip(). Istnieje wiele elementów interfejsu, które nie są istotne w przypadku aplikacji w trybie „obraz w obrazie”, np. przykładowe widoki lub układ, które zawierają informacje takie jak sugestie, nadchodzące filmy, oceny i tytuły. Gdy aplikacja przejdzie w tryb obrazu w obrazie, użyj wywołania zwrotnego onPictureInPictureUiStateChanged, aby ukryć te elementy interfejsu. Gdy aplikacja przejdzie w tryb pełnoekranowy z okna obrazu w obrazie, użyj wywołania zwrotnego onPictureInPictureModeChanged, aby odkryć te elementy, jak pokazano w tych przykładach:

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

Ten szybki przełącznik widoczności nieistotnych elementów interfejsu (dla okna obrazu w obrazie) zapewnia płynniejszą i płynną animację wprowadzania PiP.

Ulepszone reguły Nie przeszkadzać

AutomaticZenRule pozwala aplikacjom dostosowywać reguły Zarządzania aktywnością (Nie przeszkadzać) i decydować, kiedy je aktywować, a kiedy dezaktywować. Android 15 znacznie ulepsza te reguły, aby zwiększyć wygodę użytkowników. Obejmuje te ulepszenia:

  • Dodanie typów do funkcji AutomaticZenRule, co umożliwia systemowi zastosowanie specjalnego traktowania niektórych reguł.
  • Dodano ikonę do interfejsu AutomaticZenRule, aby ułatwić rozpoznawanie trybów.
  • Dodaj do elementu AutomaticZenRule ciąg znaków triggerDescription opisujący warunki, po spełnieniu których reguła powinna zostać aktywowana dla użytkownika.
  • Do AutomaticZenRule dodano parametr ZenDeviceEffects, który umożliwia regułom uruchamianie takich funkcji jak wyświetlacz w skali szarości, tryb nocny czy przyciemnianie tapety.

Ustaw VibrationEffect dla kanałów powiadomień

Android 15 obsługuje ustawienia silnych wibracji dla powiadomień przychodzących według kanału za pomocą NotificationChannel.setVibrationEffect. Dzięki temu użytkownicy mogą rozróżniać różne typy powiadomień bez konieczności patrzenia na urządzenie.

Duże ekrany i różne formaty

Android 15 umożliwia aplikacjom maksymalne wykorzystanie możliwości urządzeń z Androidem, takich jak duże ekrany oraz urządzenia składane i składane.

Ulepszona wielozadaniowość na dużym ekranie

Android 15 zapewnia użytkownikom lepsze możliwości wykonywania wielu zadań jednocześnie na urządzeniach z dużymi ekranami. Na przykład użytkownicy mogą zapisać ulubione kombinacje aplikacji podzielonej ekranu, aby mieć do nich szybki dostęp, oraz przypiąć pasek zadań na ekranie, aby szybko przełączać się między nimi. Oznacza to, że dbanie o możliwość dostosowania aplikacji jest obecnie ważniejsze niż kiedykolwiek wcześniej.

Google I/O prowadzi sesje na temat tworzenia adaptacyjnych aplikacji na Androida i tworzenia interfejsu budynku za pomocą biblioteki adaptacyjnej Material 3. Więcej informacji na ten temat znajdziesz w dokumentacji dotyczącej projektowania na duże ekrany.

Obsługa ekranu głównego

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.

Połączenia

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

Obsługa satelitarna

Android 15 stale rozszerza obsługę połączeń satelitarnych przez platformę i zawiera pewne elementy interfejsu, aby zapewnić spójne wrażenia użytkownika w przypadku połączeń satelitarnych.

Aplikacje mogą używać ServiceState.isUsingNonTerrestrialNetwork() do wykrywania, czy urządzenie jest połączone z satelitą, co pomaga im zorientować się, dlaczego pełne usługi sieciowe mogą być niedostępne. Dodatkowo Android 15 zapewnia obsługę aplikacji do obsługi SMS-ów i MMS-ów oraz wstępnie zainstalowanych aplikacji RCS do wysyłania i odbierania wiadomości przez satelitę.

Gdy urządzenie połączy się z satelitą, pojawi się powiadomienie.

Płynniejsza komunikacja NFC

Staramy się, aby płatności zbliżeniowe były bardziej płynne i niezawodne, a jednocześnie były zgodne z ekosystemem aplikacji NFC. Na obsługiwanych urządzeniach aplikacje mogą prosić NfcAdapter o przejście do trybu obserwacji, w którym urządzenie nasłuchuje, ale nie reaguje na czytniki NFC, wysyłając do przetwarzania przez usługę NFC PollingFrame obiekty. Obiekty PollingFrame mogą być używane do uwierzytelniania przed pierwszą komunikacją z czytnikiem NFC, co w wielu przypadkach pozwala na transakcje zbliżeniowe.

Dodatkowo aplikacje mogą teraz rejestrować odciski palców na obsługiwanych urządzeniach, aby otrzymywać powiadomienia o aktywności pętli odpytywania. Pozwala to na płynne działanie wielu aplikacji obsługujących komunikację NFC.

Rola w Portfelu

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.

Zabezpieczenia

Android 15 pomaga zwiększyć bezpieczeństwo aplikacji, chronić dane aplikacji oraz zapewnić użytkownikom większą przejrzystość i kontrolę nad danymi. Przeczytaj prezentację Google I/O Bezpieczeństwo użytkowników na Androidzie, aby dowiedzieć się więcej o tym, co robimy, aby ulepszyć zabezpieczenia użytkowników i chronić Twoją aplikację przed nowymi zagrożeniami.

Zarządzanie kluczami do 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ń dotyczących identyfikatorów URI treści

Android 15 wprowadza nowy zestaw interfejsów API, które sprawdzają uprawnienia dotyczące identyfikatorów URI treści:

Ułatwienia dostępu

W Androidzie 15 pojawiły się 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 dodaje funkcje i możliwości, które zwiększają wygodę użytkowników korzystających z urządzenia w różnych językach.

Czcionka zmiennej CJK

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 użycia między znakami

Począwszy od Androida 15 tekst można uzasadniać, dodając odstępy między literami za pomocą funkcji JUSTIFICATION_MODE_INTER_CHARACTER. Funkcja uzasadniania między słowami po raz pierwszy została wprowadzona w Androidzie 8.0 (poziom interfejsu API 26). Funkcja uzasadnienia między znakami zapewnia podobne możliwości w językach, które korzystają ze znaku odstępu do podziału na segmenty, takich jak chiński, japoński i innych.

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


Układ tekstu w języku japońskim za pomocą funkcji JUSTIFICATION_MODE_INTER_WORD.
Układ tekstu w języku angielskim za pomocą funkcji JUSTIFICATION_MODE_INTER_WORD.


Układ tekstu w języku japońskim za pomocą nowego interfejsu JUSTIFICATION_MODE_INTER_CHARACTER.
Układ tekstu w języku angielskim za pomocą nowego interfejsu JUSTIFICATION_MODE_INTER_CHARACTER.

Automatyczna konfiguracja podziału wiersza

W Androidzie 13 (poziom API 33) Android zaczął obsługiwać podziały wierszy w języku japońskim i koreańskim. Chociaż podziały na wyrażenia poprawiają czytelność krótkich wierszy tekstu, nie sprawdzają się w przypadku długich wierszy. Na Androidzie 15 aplikacje mogą teraz stosować podziały wierszy w postaci wyrażenia tylko w przypadku krótkich wierszy tekstu. Służy do tego opcja LINE_BREAK_WORD_STYLE_AUTO. Ta opcja powoduje wybranie najlepszej opcji stylu słowa dla tekstu.

W przypadku krótkich wierszy tekstu stosuje się podziały wiersza oparte na wyrażeniach działające tak samo jak w przypadku funkcji LINE_BREAK_WORD_STYLE_PHRASE, jak na tym obrazie:

W przypadku krótkich wierszy tekstu LINE_BREAK_WORD_STYLE_AUTO stosuje podziały wierszy na wyrażenia, aby poprawić czytelność tekstu. Działa to tak samo jak w przypadku zastosowania właściwości LINE_BREAK_WORD_STYLE_PHRASE.

W przypadku dłuższych wierszy tekstu LINE_BREAK_WORD_STYLE_AUTO używa stylu słów bez podziału wiersza, działając tak samo jak LINE_BREAK_WORD_STYLE_NONE, jak na tym obrazie:

W przypadku długich wierszy tekstu LINE_BREAK_WORD_STYLE_AUTO nie stosuje stylu słów podziału wiersza, aby zwiększyć czytelność tekstu. Działa to tak samo jak w przypadku zastosowania właściwości LINE_BREAK_WORD_STYLE_NONE.

Nowa japońska czcionka hentaigana

W Androidzie 15 nowy plik czcionki starej japońskiej hiragany (znanej jako Hentaigana) jest domyślnie w pakiecie. Unikalne kształty postaci Hentaigany nadają dziełom sztuki lub projektowi charakterystycznego charakteru, pomagając jednocześnie zachować odpowiedni przekaz i zrozumienie starożytnych japońskich dokumentów.

Styl znaków i tekstu dla japońskiej czcionki hentaigana.

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.