Funkcje i interfejsy API – przegląd

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

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

Aparat i multimedia

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

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

Słabe oświetlenie

Android 15 wprowadza wzmocnienie w słabym oświetleniu, czyli tryb automatycznej ekspozycji dostępny zarówno w aplikacji Aparat 2, jak i w rozszerzeniu aparatu w trybie nocnym. Tryb słabego oświetlenia dostosowuje ekspozycję strumienia podglądu w warunkach słabego oświetlenia. Jest to inne podejście niż w przypadku rozszerzenia aparatu w trybie nocnym, które łączy serię zdjęć w jedno ulepszone zdjęcie. Chociaż tryb nocny doskonale sprawdza się w przypadku zdjęć, nie umożliwia ciągłego przesyłania ujęć, czego nie można powiedzieć o trybie Boost w oświetleniu słabym. Dzięki temu tryb Low Light Boost umożliwia korzystanie z takich funkcji aparatu, jak:

  • Udostępnianie ulepszonej podglądu obrazu, aby użytkownicy mogli lepiej kadrować zdjęcia w warunkach słabego oświetlenia
  • Skanowanie kodów QR w warunkach słabego oświetlenia

Jeśli włączysz tryb słabego oświetlenia, włączy się on automatycznie, gdy poziom światła będzie niski, i wyłączy, gdy będzie jaśniej.

Aplikacje mogą nagrywać strumień podglądu w warunkach słabego oświetlenia, aby zapisać film z podwyższoną jasnością.

Więcej informacji znajdziesz w artykule Zwiększanie jasności w słabym oświetleniu.

Sterowanie kamerą w aplikacji

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

  • Zaawansowane ustawienia siły błysku umożliwiające precyzyjne sterowanie natężeniem błysku w trybach SINGLETORCH podczas fotografowania.

Kontrola zakresu dynamicznego HDR

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

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

Regulacja głośności

Android 15 introduces support for the CTA-2075 loudness standard to help you avoid audio loudness inconsistencies and ensure users don't have to constantly adjust volume when switching between content. The system leverages known characteristics of the output devices (headphones and speaker) along with loudness metadata available in AAC audio content to intelligently adjust the audio loudness and dynamic range compression levels.

To enable this feature, you need to ensure loudness metadata is available in your AAC content and enable the platform feature in your app. For this, you instantiate a LoudnessCodecController object by calling its create factory method with the audio session ID from the associated AudioTrack; this automatically starts applying audio updates. You can pass an OnLoudnessCodecUpdateListener to modify or filter loudness parameters before they are applied on the MediaCodec.

// Media contains metadata of type MPEG_4 OR MPEG_D
val mediaCodec = 
val audioTrack = AudioTrack.Builder()
                                .setSessionId(sessionId)
                                .build()
...
// Create new loudness controller that applies the parameters to the MediaCodec
try {
   val lcController = LoudnessCodecController.create(mSessionId)
   // Starts applying audio updates for each added MediaCodec
}

AndroidX media3 ExoPlayer will also be updated to use the LoudnessCodecController APIs for a seamless app integration.

Wirtualne urządzenia MIDI 2.0

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

wydajniejsze dekodowanie oprogramowania AV1,

dav1d logo

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

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

Wydajność i narzędzia dla programistów

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

Aktualizacje OpenJDK 17

Android 15 kontynuuje odświeżanie podstawowych bibliotek Androida, aby dostosować je do funkcji w najnowszych wersjach OpenJDK LTS.

Zawiera on te najważniejsze funkcje i ulepszenia:

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 kierować reklamy na najnowsze funkcje programistyczne.

Ulepszenia 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 added on-device, multi-language recognition in audio with automatic switching between languages, but this can cause words to get dropped, especially when languages switch with less of a pause between the two utterances. Android 15 adds additional controls to help apps tune this switching to their use case. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS confines the automatic switching to the beginning of the audio session, while EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES deactivates the language switching after a defined number of switches. These options are particularly useful if you expect that there will be a single language spoken during the session that should be autodetected.

Ulepszony interfejs OpenType Variable Font API

W Androidzie 15 łatwiejsza obsługa czcionki zmiennej OpenType. Za pomocą interfejsu API buildVariableFamily możesz utworzyć instancję FontFamily z czcionki zmiennej bez określania osi wag. W celu dopasowania wyświetlanego tekstu render tekstu zastępuje wartość osi wght.

Korzystanie z interfejsu API znacznie upraszcza kod potrzebny do utworzenia 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, aby utworzyć ten sam Typeface, potrzeba więcej 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 Typeface utworzonego za pomocą starego i nowego interfejsu API:

Przykład różnicy renderowania kroju czcionki w przypadku nowych i starych wersji
Interfejsy API

W tym przykładzie Typeface utworzony za pomocą starego interfejsu API nie ma możliwości tworzenia dokładnych wartości wagi czcionki dla instancji 350, 450, 550 i 650Font, więc renderowanie wraca do wartości najbliższej. W tym przypadku zamiast 350 wyświetlana jest wartość 300, zamiast 450 – 400 itd. 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 ustawienia 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

W zeszłym roku Android i Google Play ogłosiły obsługę archiwizacji aplikacji, aby umożliwić użytkownikom zwolnienie miejsca na urządzeniu przez częściowe usunięcie rzadko używanych aplikacji opublikowanych w Google Play za pomocą pakietu aplikacji na Androida. Android 15 obejmuje archiwizację aplikacji na poziomie systemu operacyjnego i cofania archiwizacji, co ułatwia wdrożenie tej funkcji we wszystkich sklepach z aplikacjami.

Aplikacje z uprawnieniami REQUEST_DELETE_PACKAGES mogą wywoływać Metoda PackageInstaller requestArchive prośby o zarchiwizowanie zainstalowany pakiet aplikacji, który usuwa plik APK i wszelkie pliki z pamięci podręcznej, ale pozostaje bez zmian. danych użytkownika. Zarchiwizowane aplikacje są zwracane jako aplikacje, które można wyświetlić w interfejsy API LauncherApps; użytkownicy zobaczą w interfejsie podkreślenie, aplikacje są zarchiwizowane. Jeśli użytkownik kliknie zarchiwizowaną aplikację, odpowiedzialny instalator otrzyma prośbę o przywrócenie go z archiwum. Proces przywracania jest monitorowana przez transmisję ACTION_PACKAGE_ADDED.

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

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

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

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

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

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

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

Grafika

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

Modernizacja dostępu do GPU w Androidzie

Logo Vulkan

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

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

Plan rozwoju ANGLE na Androida na platformie Vulkan

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

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

Zalecane kolejne kroki

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

Ulepszenia Canvas

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

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

Wydajność i bateria

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

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

ApplicationStartInfo API

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

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

Szczegółowe informacje o rozmiarze aplikacji

从 Android 8.0(API 级别 26)开始,Android 包含 StorageStats.getAppBytes API,该 API 会将应用的安装大小总结为一个字节数,该数值是 APK 大小、从 APK 中提取的文件的大小以及在设备上生成的文件(例如提前编译 [AOT] 代码)的总和。此数字对于了解应用的存储空间使用情况而言,没有太大帮助。

Android 15 添加了 StorageStats.getAppBytesByDataType([type]) API,可让您深入了解应用如何使用所有这些空间,包括 APK 文件分块、AOT 和加速相关代码、DEX 元数据、库和引导式配置文件。

Profilowanie zarządzane przez aplikację

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

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

Ulepszenia bazy danych SQLite

Android 15 引入了 SQLite API,这些 API 可公开底层 SQLite 引擎的高级功能,以解决可能在应用中出现的特定性能问题。将 SQLite 更新到版本 3.44.3

开发者应参阅 SQLite 性能最佳实践 以便充分利用其 SQLite 数据库,尤其是在处理大型 或运行对延迟敏感的查询时

Aktualizacje Android Dynamic Performance Framework

Android 15 to kontynuacja naszych działań związanych z ramami pracy Android Dynamic Performance Framework (ADPF), czyli zestawu interfejsów API, które umożliwiają grze lub aplikacji o wysokich wymaganiach dotyczących wydajności bezpośrednią interakcję z systemami zasilania i termicznymi urządzeń z Androidem. Na obsługiwanych urządzeniach Android 15 dodaje funkcje ADPF:

  • Tryb oszczędzania energii w przypadku sesji podpowiedzi, aby wskazać, że powiązane wątki powinny preferować oszczędzanie energii zamiast wydajności, co jest przydatne w przypadku długotrwałych zadań wykonywanych w tle.
  • Czas pracy GPU i procesora może być zgłaszany w sesjach podpowiedzi, co pozwala systemowi dostosowywać częstotliwości procesora i karty graficznej, aby jak najlepiej spełniać wymagania dotyczące obciążenia.
  • Próg temperatury, aby interpretować możliwy stan ograniczania temperatury na podstawie prognozy dotyczącej temperatury.

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

Prywatność

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

Wykrywanie nagrywania ekranu

Android 15 adds support for apps to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. An app is considered visible if activities owned by the registering process's UID are being recorded. This way, if your app is performing a sensitive operation, you can inform the user that they're being recorded.

val mCallback = Consumer<Int> { state ->
  if (state == SCREEN_RECORDING_STATE_VISIBLE) {
    // We're being recorded
  } else {
    // We're not being recorded
  }
}

override fun onStart() {
   super.onStart()
   val initialState =
      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)
   mCallback.accept(initialState)
}

override fun onStop() {
    super.onStop()
    windowManager.removeScreenRecordingCallback(mCallback)
}

Rozszerzone możliwości IntentFilter

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

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

Here's an example of the AndroidManifest syntax:

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

Przestrzeń prywatna

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

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

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

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

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

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

Wysyłanie zapytania o najnowszy wybór użytkownika w przypadku 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, które obejmują najnowszą wersję Piaskownicy prywatności na Androidzie. Ta funkcja jest częścią naszych działań mających na celu opracowanie technologii, które poprawią prywatność użytkowników oraz umożliwią skuteczne, spersonalizowane reklamy w aplikacjach mobilnych. Na stronie Piaskownicy prywatności znajdziesz więcej informacji o Piaskownicy prywatności w wersji dla deweloperów i w programach beta na Androida, które pomogą Ci zacząć.

Health Connect

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

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

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

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

Udostępnianie ekranu aplikacji

Android 15 supports app screen sharing so users can share or record just an app window rather than the entire device screen. This feature, first enabled in Android 14 QPR2, includes MediaProjection callbacks that allow your app to customize the app screen sharing experience. Note that for apps targeting Android 14 (API level 34) or higher, user consent is required for each MediaProjection capture session.

Interfejs użytkownika i systemu

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

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

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

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 wprowadza zmiany w trybie obrazu w obrazie (PIP), które zapewniają jeszcze płynniejsze przejście do tego trybu. Jest to korzystne w przypadku aplikacji, które mają elementy UI nałożone na główny interfejs użytkownika i przechodzą do trybu PiP.

Deweloperzy używają wywołania zwrotnego onPictureInPictureModeChanged do definiowania logiki który przełącza widoczność nakładanych elementów interfejsu. Ten wywołanie zwrotne jest wywoływane po zakończeniu animacji otwierania lub zamykania okna PiP. Początek za Androida 15, klasa PictureInPictureUiState zawiera kolejny stan.

W takim stanie interfejsu aplikacje kierowane na Androida 15 (poziom interfejsu API 35) odnotowują Wywołanie zwrotne Activity#onPictureInPictureUiStateChanged z isTransitioningToPip() od razu po rozpoczęciu animacji funkcji obraz w obrazie. Istnieją wiele elementów interfejsu, które nie są istotne dla aplikacji w trybie Obraz w obrazie, przykładowe widoki lub układ strony z informacjami, takimi jak sugestie, filmów, ocen i tytułów. Gdy aplikacja przejdzie do trybu Picture-in-Picture, użyj wywołania zwrotnego onPictureInPictureUiStateChanged, aby ukryć te elementy interfejsu. Gdy przejdzie do trybu pełnoekranowego z okna funkcji obraz w obrazie, użyj Wywołanie zwrotne onPictureInPictureModeChanged do odkrycia tych elementów, jak w tym przykładzie 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 PIP) pomaga aby uzyskać płynniejszą i wolną od migotania animacja PIP.

Ulepszone reguły trybu Nie przeszkadzać

AutomaticZenRule umożliwia aplikacjom dostosowywanie uwagi Reguły zarządzania (Nie przeszkadzać) i określanie, kiedy mają być aktywowane lub dezaktywowane . Android 15 znacznie ulepsza te reguły, aby poprawić komfort użytkowników. Wprowadzono te ulepszenia:

  • Dodaję typy do AutomaticZenRule, aby umożliwić systemowi zastosowanie specjalnych traktowanie pewnych zasad.
  • Dodaję ikonę do interfejsu AutomaticZenRule, aby pomóc w ulepszaniu trybów i rozpoznawalna.
  • Dodawanie do AutomaticZenRule ciągu triggerDescription, który opisuje warunki, po spełnieniu których reguła powinna zostać aktywowana dla użytkownika.
  • Dodane ZenDeviceEffects do AutomaticZenRule, co umożliwia regułom wywoływanie takich funkcji jak skali szarości wyświetlacza, tryb nocny lub przyciemnienie tapety.

Ustawianie VibrationEffect 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.

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

Projekcja multimediów może ujawnić prywatne informacje o użytkowniku. Nowy, dobrze widoczny element na pasku stanu informuje użytkowników o działającej projekcji ekranu. Użytkownicy mogą kliknąć chip, aby zatrzymać udostępnianie, przesyłanie lub nagrywanie ekranu. Aby zapewnić użytkownikom bardziej intuicyjną obsługę, wyświetlanie na ekranie w trakcie jest teraz automatycznie wstrzymywane, gdy ekran urządzenia jest zablokowany.

Przycisk na pasku stanu do udostępniania ekranu, przesyłania treści i nagrywania.

Duże ekrany i formaty

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

Ulepszona wielozadaniowość na dużym ekranie

Android 15 daje użytkownikom więcej możliwości wykonywania wielu zadań jednocześnie na urządzeniach z dużym ekranem. Dla: Na przykład użytkownicy mogą zapisać ulubione kombinacje aplikacji podzielone na podzielony ekran, dostęp do paska aplikacji na ekranie i przypinanie go, aby szybko przełączać się między aplikacjami. Oznacza to, że że zapewnienie adaptacji aplikacji jest teraz ważniejsze niż kiedykolwiek.

W ramach Google I/O odbywają się sesje poświęcone tworzeniu adaptacyjnego Androida Apps i Building UI with the Material 3 biblioteka adaptacyjna może pomóc, a nasza dokumentacja jest pomocna w zaprojektowaniu .

Obsługa ekranu zewnętrznego

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

Łączność

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

Obsługa satelitarna

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 działanie NFC

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

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

Rola w portfelu

Android 15 introduces a Wallet role that allows tighter integration with the user's preferred wallet app. This role replaces the NFC default contactless payment setting. Users can manage the Wallet role holder by navigating to Settings > Apps > Default Apps.

The Wallet role is used when routing NFC taps for AIDs registered in the payment category. Taps always go to the Wallet role holder unless another app that is registered for the same AID is running in the foreground.

This role is also used to determine where the Wallet Quick Access tile should go when activated. When the role is set to "None", the Quick Access tile isn't available and payment category NFC taps are only delivered to the foreground app.

Bezpieczeństwo

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

Integracja Credential Managera z autouzupełnianiem

Począwszy od Androida 15 deweloperzy mogą połączyć określone widoki, takie jak pola nazwy użytkownika lub hasła, z żądaniami menedżera danych uwierzytelniających, co ułatwia dostosowanie interfejsu do potrzeb użytkownika podczas procesu logowania. Gdy użytkownik skupi się na jednym z tych widoków, do Menedżera danych logowania zostanie wysłane odpowiednie żądanie. Uzyskane dane są agregowane w ramach dostawców i wyświetlane w interfejsach autouzupełniania, takich jak sugestie w polu tekstowym lub sugestie w menu. Biblioteka Jetpack androidx.credentials to preferowany punkt końcowy dla deweloperów. Wkrótce będzie ona dostępna w celu dalszego ulepszania tej funkcji w Androidzie 15 i nowszych.

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

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

W Androidzie 15 wprowadzamy interfejs E2eeContactKeysManager, który ułatwia szyfrowanie end-to-end (E2EE) w aplikacjach na Androida dzięki interfejsowi API na poziomie systemu operacyjnego do przechowywania kluczy publicznych kryptograficznych.

E2eeContactKeysManager jest przeznaczony do integracji z aplikacją Kontakty na platformie, aby zapewnić użytkownikom scentralizowany sposób zarządzania i weryfikowania kluczy publicznych kontaktów.

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

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

Ułatwienia dostępu

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

Ulepszenia dotyczące brajla

W Androidzie 15 umożliwiliśmy TalkBackowi obsługę monitorów brajlowskich, które korzystają ze standardu HID przez USB i bezpieczny Bluetooth.

Ten standard, podobnie jak standardy używane przez myszy i klawiatury, pomoże Androidowi z czasem obsługiwać szerszą gamę monitorów brajlowskich.

Internacjonalizacja

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

Czcionka zmienna CJK

Od wersji 15 Androida plik czcionki dla języków chińskiego, japońskiego i koreańskiego (CJK) NotoSansCJK jest teraz czcionką zmienną. Czcionki zmienne otwierają nowe możliwości kreatywnej typografii w językach CJK. Projektanci mogą odkrywać szerszy zakres stylów i tworzyć atrakcyjne wizualnie układy, które wcześniej były trudne lub niemożliwe do osiągnięcia.

Jak zmienna czcionka w przypadku języków chińskiego, japońskiego i koreańskiego (CJK) wygląda w różnych szerokościach.

Justowanie między znakami

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 zaczął obsługiwać podziały wierszy oparte na wyrażenia w języku japońskim i koreańskim od Android 13 (poziom API 33). Mimo że podziały wierszy oparte na wyrażeniach poprawiają czytelność krótkich wierszy tekstu, dlatego nie sprawdzają się w przypadku długich wierszy. Na Androidzie 15 aplikacje mogą stosować podziały wierszy oparte na wyrażeniach tylko w przypadku krótkich wierszy tekstu, za pomocą funkcji LINE_BREAK_WORD_STYLE_AUTO . Ta opcja powoduje wybranie najlepszej opcji stylu tekstu dla tekstu.

W przypadku krótkich wierszy tekstu stosuje się znaki końca wiersza oparte na frazie, które działają tak samo jak LINE_BREAK_WORD_STYLE_PHRASE, jak pokazano na poniższym obrazie:

W przypadku krótkich wierszy tekstu LINE_BREAK_WORD_STYLE_AUTO stosuje podziały wierszy oparte na wyrażeniach, aby poprawić czytelność tekstu. Ta metoda działa tak samo jak stosowana LINE_BREAK_WORD_STYLE_PHRASE.

W przypadku dłuższych wierszy tekstu LINE_BREAK_WORD_STYLE_AUTO używa operatora nie stylu słów podziału wiersza, który działa tak samo jak LINE_BREAK_WORD_STYLE_NONE, jak widać w tabeli ten obraz:

W przypadku długich wierszy tekstu LINE_BREAK_WORD_STYLE_AUTO nie stosuje się stylu łamania wiersza, aby poprawić czytelność tekstu. Ta metoda działa tak samo jak stosowana 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.

VideoLAN cone Copyright (c) 1996-2010 VideoLAN. To logo lub jego zmodyfikowana wersja może być używane lub modyfikowane przez dowolną osobę w odniesieniu do projektu VideoLAN lub dowolnego produktu opracowanego przez zespół VideoLAN, ale nie oznacza poparcia przez projekt.

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

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