Tổng quan về các tính năng và API

Android 15 mang đến cho nhà phát triển các tính năng và API tuyệt vời. Các phần sau đây tóm tắt những tính năng này để giúp bạn bắt đầu sử dụng các API có liên quan.

Để biết danh sách chi tiết về các API đã thêm, sửa đổi và xoá, hãy đọc báo cáo điểm khác biệt về API. Để biết thông tin chi tiết về các API đã thêm, hãy truy cập vào tài liệu tham khảo về API cho Android. Đối với Android 15, hãy tìm các API đã thêm trong API cấp 35. Để tìm hiểu những thay đổi của nền tảng có thể tác động đến ứng dụng của bạn, hãy nhớ tham khảo các thay đổi về hành vi của Android 15 đối với ứng dụng nhắm đến Android 15tất cả ứng dụng.

Máy ảnh và nội dung nghe nhìn

Android 15 có nhiều tính năng giúp cải thiện trải nghiệm máy ảnh và nội dung nghe nhìn, đồng thời cung cấp cho bạn quyền truy cập vào các công cụ và phần cứng để hỗ trợ nhà sáng tạo hiện thực hoá ý tưởng của họ trên Android.

Để biết thêm về các tính năng và giải pháp mới nhất dành cho nhà phát triển về nội dung nghe nhìn và máy ảnh trên Android, hãy xem bài nói chuyện Tạo trải nghiệm nội dung nghe nhìn và máy ảnh hiện đại trên Android tại Google I/O.

Tăng cường ánh sáng yếu

Android 15 introduces Low Light Boost, an auto-exposure mode available to both Camera 2 and the night mode camera extension. Low Light Boost adjusts the exposure of the Preview stream in low-light conditions. This is different from how the night mode camera extension creates still images, because night mode combines a burst of photos to create a single, enhanced image. While night mode works very well for creating a still image, it can't create a continuous stream of frames, but Low Light Boost can. Thus, Low Light Boost enables camera capabilities, such as:

  • Providing an enhanced image preview, so users are better able to frame their low-light pictures
  • Scanning QR codes in low light

If you enable Low Light Boost, it automatically turns on when there's a low light level, and turns off when there's more light.

Apps can record off the Preview stream in low-light conditions to save a brightened video.

For more information, see Low Light Boost.

Các chế độ điều khiển máy ảnh trong ứng dụng

Android 15 thêm một tiện ích mới để tăng cường kiểm soát phần cứng máy ảnh cũng như các thuật toán của phần cứng đó trên các thiết bị được hỗ trợ:

  • Điều chỉnh độ mạnh đèn flash nâng cao cho phép điều khiển chính xác cường độ đèn flash ở cả hai chế độ SINGLETORCH trong khi chụp ảnh.

Điều khiển khoảng đầu vào HDR

Android 15 chọn khoảng trần HDR phù hợp với các tính năng cơ bản của thiết bị và độ sâu bit của bảng điều khiển. Đối với các trang có nhiều nội dung SDR, chẳng hạn như ứng dụng nhắn tin hiển thị một hình thu nhỏ HDR, hành vi này có thể ảnh hưởng xấu đến độ sáng cảm nhận được của nội dung SDR. Android 15 cho phép bạn điều khiển khoảng trần HDR bằng setDesiredHdrHeadroom để cân bằng giữa nội dung SDR và HDR.

Độ sáng của các thành phần trên giao diện người dùng SDR trên màn hình bên trái có vẻ đồng nhất so với độ sáng trên màn hình bên phải. Điều này mô phỏng các vấn đề về khoảng trần có thể xảy ra khi nội dung HDR và SDR kết hợp với nhau. Bằng cách điều chỉnh khoảng trần HDR, bạn có thể cân bằng tốt hơn giữa nội dung SDR và HDR.

Điều khiển độ lớn âm thanh

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.

Thiết bị MIDI 2.0 ảo

Android 13 hỗ trợ thêm tính năng kết nối với Thiết bị MIDI 2.0 sử dụng USB, giao tiếp bằng Gói MIDI chung (UMP). Android 15 mở rộng tính năng hỗ trợ UMP cho các ứng dụng MIDI ảo, cho phép các ứng dụng sáng tác điều khiển các ứng dụng tổng hợp dưới dạng thiết bị MIDI 2.0 ảo giống như khi sử dụng thiết bị USB MIDI 2.0.

Giải mã phần mềm AV1 hiệu quả hơn

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.

Công cụ và năng suất của nhà phát triển

Mặc dù hầu hết công việc của chúng tôi để cải thiện năng suất của bạn đều xoay quanh các công cụ như Android Studio, Jetpack Compose và thư viện Android Jetpack, nhưng chúng tôi luôn tìm cách trong nền tảng này để giúp bạn dễ dàng hiện thực hoá tầm nhìn của mình hơn.

Nội dung cập nhật OpenJDK 17

Android 15 continues the work of refreshing Android's core libraries to align with the features in the latest OpenJDK LTS releases.

The following key features and improvements are included:

These APIs are updated on over a billion devices running Android 12 (API level 31) and higher through Google Play System updates, so you can target the latest programming features.

Cải tiến PDF

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

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

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

Các điểm tinh chỉnh về tính năng tự động chuyển đổi ngôn ngữ

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.

Cải thiện API Phông chữ biến đổi OpenType

Android 15 improves the usability of the OpenType variable font. You can create a FontFamily instance from a variable font without specifying weight axes with the buildVariableFamily API. The text renderer overrides the value of wght axis to match the displaying text.

Using the API simplifies the code for creating a Typeface considerably:

Kotlin

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

Java

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

Previously, to create the same Typeface, you would need much more code:

Kotlin

val oldTypeface = Typeface.CustomFallbackBuilder(
            FontFamily.Builder(
                Font.Builder(assets, "RobotoFlex.ttf")
                    .setFontVariationSettings("'wght' 400")
                    .setWeight(400)
                    .build())
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 100")
                        .setWeight(100)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 200")
                        .setWeight(200)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 300")
                        .setWeight(300)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 500")
                        .setWeight(500)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 600")
                        .setWeight(600)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 700")
                        .setWeight(700)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 800")
                        .setWeight(800)
                        .build()
                )
                .addFont(
                    Font.Builder(assets, "RobotoFlex.ttf")
                        .setFontVariationSettings("'wght' 900")
                        .setWeight(900)
                        .build()
                ).build()
        ).build()

Java

Typeface oldTypeface = new Typeface.CustomFallbackBuilder(
    new FontFamily.Builder(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 400")
            .setWeight(400)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 100")
            .setWeight(100)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 200")
            .setWeight(200)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 300")
            .setWeight(300)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 500")
            .setWeight(500)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 600")
            .setWeight(600)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 700")
            .setWeight(700)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 800")
            .setWeight(800)
            .build()
    )
    .addFont(
        new Font.Builder(assets, "RobotoFlex.ttf")
            .setFontVariationSettings("'wght' 900")
            .setWeight(900)
            .build()
    )
    .build()
).build();

Here's an example of how a Typeface created with both the old and new APIs renders:

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

In this example, the Typeface created with the old API doesn't have the capability to create accurate font weights for the 350, 450, 550 and 650 Font instances, so the renderer falls back to the closest weight. So in this case, 300 is rendered instead of 350, 400 is rendered instead of 450, and so on. By contrast, the Typeface created with the new APIs dynamically creates a Font instance for a given weight, so accurate weights are rendered for 350, 450, 550, and 650 as well.

Các chế độ kiểm soát dấu ngắt dòng chi tiết

Kể từ Android 15, TextView và trình ngắt dòng cơ bản có thể giữ nguyên phần văn bản nhất định trong cùng một dòng để cải thiện khả năng đọc. Bạn có thể tận dụng tính năng tuỳ chỉnh ngắt dòng này bằng cách sử dụng thẻ <nobreak> trong tài nguyên chuỗi hoặc createNoBreakSpan. Tương tự, bạn có thể giữ nguyên các từ không bị xuống dòng bằng cách sử dụng thẻ <nohyphen> hoặc createNoHyphenationSpan.

Ví dụ: tài nguyên chuỗi sau đây không có dấu ngắt dòng và hiển thị với văn bản "Pixel 8 Pro" bị ngắt ở vị trí không mong muốn:

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

Ngược lại, tài nguyên chuỗi này bao gồm thẻ <nobreak>, thẻ này gói cụm từ "Pixel 8 Pro" và ngăn chặn dấu ngắt dòng:

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

Sự khác biệt trong cách hiển thị các chuỗi này được thể hiện trong các hình ảnh sau:

Bố cục cho một dòng văn bản mà cụm từ "Pixel 8 Pro" không được gói bằng thẻ <nobreak>.
Bố cục cho cùng một dòng văn bản, trong đó cụm từ "Pixel 8 Pro" được gói bằng thẻ <nobreak>.

Lưu trữ ứng dụng

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

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

Đồ hoạ

Android 15 mang đến các điểm cải tiến mới nhất về đồ hoạ, bao gồm cả ANGLE và các điểm bổ sung cho hệ thống đồ hoạ Canvas.

Hiện đại hoá quyền truy cập vào GPU của Android

Biểu trưng Vulkan

Phần cứng Android đã phát triển khá nhiều từ những ngày đầu, khi hệ điều hành cốt lõi chạy trên một CPU và GPU được truy cập bằng API dựa trên quy trình chức năng cố định. API đồ hoạ Vulkan® đã có trong NDK kể từ Android 7.0 (API cấp 24) với mô hình trừu tượng cấp thấp hơn giúp phản ánh tốt hơn phần cứng GPU hiện đại, mở rộng quy mô hiệu quả hơn để hỗ trợ nhiều lõi CPU và giảm mức hao tổn của trình điều khiển CPU — nhờ đó cải thiện hiệu suất của ứng dụng. Vulkan được mọi công cụ phát triển trò chơi hiện đại hỗ trợ.

Vulkan là giao diện ưu tiên của Android cho GPU. Do đó, Android 15 tích hợp ANGLE làm lớp không bắt buộc để chạy OpenGL® ES trên Vulkan. Việc chuyển sang ANGLE sẽ chuẩn hoá hoạt động triển khai Android OpenGL để cải thiện khả năng tương thích và trong một số trường hợp, sẽ cải thiện hiệu suất. Bạn có thể kiểm thử độ ổn định và hiệu suất của ứng dụng OpenGL ES bằng ANGLE bằng cách bật tuỳ chọn cho nhà phát triển trong phần Cài đặt -> Hệ thống -> Tuỳ chọn cho nhà phát triển -> Thử nghiệm: Bật ANGLE trên Android 15.

Android ANGLE trong lộ trình Vulkan

Lộ trình thay đổi sắp tới đối với API GPU của Android.

Để tinh giản ngăn xếp GPU, từ nay về sau, chúng tôi sẽ cung cấp ANGLE dưới dạng trình điều khiển hệ thống GL trên các thiết bị mới khác, với dự kiến trong tương lai rằng OpenGL/ES sẽ chỉ được cung cấp thông qua ANGLE. Tuy nhiên, chúng tôi dự định tiếp tục hỗ trợ OpenGL ES trên tất cả thiết bị.

Các bước nên làm tiếp theo

Sử dụng các tuỳ chọn cho nhà phát triển để chọn trình điều khiển ANGLE cho OpenGL ES và kiểm thử ứng dụng của bạn. Đối với các dự án mới, bạn nên sử dụng Vulkan cho C/C++.

Các điểm cải tiến cho Canvas

Android 15 tiếp tục hiện đại hoá hệ thống đồ hoạ Canvas của Android với các tính năng mới:

  • Matrix44 cung cấp ma trận 4x4 để biến đổi các toạ độ nên dùng khi bạn muốn điều khiển canvas ở chế độ 3D.
  • clipShader giao cắt đoạn video hiện tại với chương trình đổ bóng được chỉ định, trong khi clipOutShader đặt đối tượng cắt thành điểm khác biệt của đoạn video hiện tại và chương trình đổ bóng, mỗi chương trình coi chương trình đổ bóng là một mặt nạ alpha. Tính năng này hỗ trợ vẽ các hình dạng phức tạp một cách hiệu quả.

Hiệu suất và pin

Android tiếp tục tập trung vào việc giúp bạn cải thiện hiệu suất và chất lượng của ứng dụng. Android 15 ra mắt các API giúp thực thi các tác vụ trong ứng dụng hiệu quả hơn, tối ưu hoá hiệu suất ứng dụng và thu thập thông tin chi tiết về ứng dụng.

Để biết các phương pháp hay nhất giúp tiết kiệm pin, gỡ lỗi mạng và mức sử dụng pin, cũng như thông tin chi tiết về cách chúng tôi cải thiện hiệu quả pin của công việc ở chế độ nền trong Android 15 và các phiên bản Android gần đây, hãy xem bài phát biểu Cải thiện hiệu quả pin của công việc ở chế độ nền trên Android tại Google I/O.

ApplicationStartInfo API

In previous versions of Android, app startup has been a bit of a mystery. It was challenging to determine within your app whether it started from a cold, warm, or hot state. It was also difficult to know how long your app spent during the various launch phases: forking the process, calling onCreate, drawing the first frame, and more. When your Application class was instantiated, you had no way of knowing whether the app started from a broadcast, a content provider, a job, a backup, boot complete, an alarm, or an Activity.

The ApplicationStartInfo API on Android 15 provides all of this and more. You can even choose to add your own timestamps into the flow to help collect timing data in one place. In addition to collecting metrics, you can use ApplicationStartInfo to help directly optimize app startup; for example, you can eliminate the costly instantiation of UI-related libraries within your Application class when your app is starting up due to a broadcast.

Thông tin chi tiết về kích thước ứng dụng

Kể từ Android 8.0 (API cấp 26), Android đã bao gồm API StorageStats.getAppBytes nhằm tóm tắt kích thước cài đặt của một ứng dụng dưới dạng một số byte duy nhất, là tổng kích thước APK, kích thước của tệp được trích xuất từ APK và các tệp được tạo trên thiết bị như mã biên dịch trước khi chạy (AOT). Con số này chưa cho thấy nhiều thông tin chi tiết về cách ứng dụng của bạn đang sử dụng bộ nhớ.

Android 15 bổ sung API StorageStats.getAppBytesByDataType([type]), cho phép bạn nắm được thông tin chi tiết về cách ứng dụng đang sử dụng hết dung lượng đó, bao gồm cả việc phân tách tệp APK, mã AOT và tăng tốc, siêu dữ liệu dex, thư viện và hồ sơ có hướng dẫn.

Phân tích tài nguyên do ứng dụng quản lý

Android 15 bao gồm lớp ProfilingManager, cho phép bạn thu thập thông tin phân tích tài nguyên từ trong ứng dụng, chẳng hạn như tệp báo lỗi, hồ sơ vùng nhớ khối xếp, lấy mẫu ngăn xếp, v.v. Mã này cung cấp lệnh gọi lại cho ứng dụng kèm theo thẻ đã cung cấp để xác định tệp đầu ra. Tệp này được phân phối đến thư mục tệp của ứng dụng. API này giới hạn tốc độ để giảm thiểu tác động đến hiệu suất.

Để đơn giản hoá việc tạo các yêu cầu phân tích tài nguyên trong ứng dụng, bạn nên sử dụng API AndroidX Profiling tương ứng, có trong Core 1.15.0-rc01 trở lên.

Cải tiến cơ sở dữ liệu SQLite

Android 15 giới thiệu các API SQLite hiển thị các tính năng nâng cao từ công cụ SQLite cơ bản nhắm đến các vấn đề hiệu suất cụ thể có thể xuất hiện trong ứng dụng. Các API này đi kèm với bản cập nhật SQLite cho phiên bản 3.44.3.

Nhà phát triển nên tham khảo các phương pháp hay nhất về hiệu suất SQLite để khai thác tối đa cơ sở dữ liệu SQLite, đặc biệt là khi làm việc với các cơ sở dữ liệu lớn hoặc khi chạy các truy vấn nhạy cảm với độ trễ.

  • Giao dịch bị hoãn chỉ có thể đọc: khi thực hiện các giao dịch có chỉ đọc (không bao gồm câu lệnh ghi), hãy sử dụng beginTransactionReadOnly()beginTransactionWithListenerReadOnly(SQLiteTransactionListener) để phát hành giao dịch DEFERRED chỉ đọc. Các giao dịch như vậy có thể chạy đồng thời với nhau và nếu cơ sở dữ liệu ở chế độ WAL, chúng có thể chạy đồng thời với các giao dịch IMMEDIATE hoặc EXCLUSIVE.
  • Số lượng hàng và mã nhận dạng: Các API được thêm vào để truy xuất số lượng hàng đã thay đổi hàng hoặc mã hàng được chèn gần đây nhất mà không tạo thêm truy vấn. getLastChangedRowCount() trả về số lượng hàng được chèn, cập nhật hoặc xoá bởi câu lệnh SQL gần đây nhất trong giao dịch hiện tại, trong khi getTotalChangedRowCount() sẽ trả về số lượng trên kết nối hiện tại. getLastInsertRowId() trả về rowid của hàng cuối cùng cần chèn vào kết nối hiện tại.
  • Câu lệnh thô: phát hành một câu lệnh SQlite thô, bỏ qua các trình bao bọc thuận tiện và mọi chi phí xử lý bổ sung mà chúng có thể phát sinh.

Bản cập nhật Khung hiệu suất động Android

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

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

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

Quyền riêng tư

Android 15 có nhiều tính năng giúp nhà phát triển ứng dụng bảo vệ quyền riêng tư của người dùng.

Phát hiện tính năng ghi màn hình

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

Mở rộng chức năng IntentFilter

Android 15 tích hợp tính năng hỗ trợ độ phân giải Intent chính xác hơn thông qua UriRelativeFilterGroup. Tính năng này chứa một tập hợp các đối tượng UriRelativeFilter tạo thành một tập hợp các quy tắc so khớp Intent mà mỗi quy tắc phải được đáp ứng, bao gồm cả các tham số truy vấn URL, phân đoạn URL và các quy tắc chặn hoặc loại trừ.

Bạn có thể xác định các quy tắc này trong tệp XML AndroidManifest bằng thẻ <uri-relative-filter-group>. Thẻ này có thể bao gồm thẻ android:allow (không bắt buộc). Các thẻ này có thể chứa thẻ <data> sử dụng các thuộc tính thẻ dữ liệu hiện có cũng như thuộc tính android:queryandroid:fragment.

Sau đây là ví dụ về cú pháp AndroidManifest:

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

Không gian riêng tư

Bạn có thể mở khoá và khoá không gian riêng tư để hiện hoặc ẩn không gian này nhạy cảm trên một thiết bị.

Không gian riêng tư giúp người dùng tạo không gian riêng trên thiết bị của họ để họ có thể giữ các ứng dụng nhạy cảm tránh xa những cặp mắt tò mò, dưới một lớp bổ sung xác thực. Không gian riêng tư sử dụng một hồ sơ người dùng riêng biệt. Người dùng có thể hãy chọn sử dụng phương thức khoá thiết bị hoặc một hệ số khoá riêng cho không gian riêng tư.

Các ứng dụng trong không gian riêng tư sẽ xuất hiện trong một vùng chứa riêng trong trình chạy, và bị ẩn khỏi chế độ xem, thông báo, chế độ cài đặt gần đây và khỏi các ứng dụng khác khi không gian riêng tư bị khoá. Nội dung do người dùng tạo và nội dung tải xuống (chẳng hạn như tệp) và tài khoản được phân tách giữa không gian riêng tư và không gian chính. Trang chia sẻ nội dung của hệ thống và Bạn có thể dùng công cụ chọn ảnh để cấp cho các ứng dụng quyền truy cập vào nội dung trên các không gian khi không gian riêng tư mở khoá.

Người dùng không thể di chuyển các ứng dụng hiện có và dữ liệu của họ vào không gian riêng tư. Thay vào đó, người dùng chọn tuỳ chọn cài đặt trong không gian riêng tư để cài đặt ứng dụng bằng bất kỳ cửa hàng ứng dụng nào họ thích. Các ứng dụng trong không gian riêng tư được cài đặt dưới dạng tách riêng các bản sao khỏi mọi ứng dụng trong không gian chính (các bản sao mới của cùng một ứng dụng).

Khi người dùng khoá không gian riêng tư, hồ sơ sẽ dừng lại. Trong khi hồ sơ bị dừng, ứng dụng trong không gian riêng tư không còn hoạt động và không thể hoạt động các hoạt động ở nền trước hoặc nền sau, bao gồm cả việc hiển thị thông báo.

Bạn nên kiểm thử không gian riêng tư trong ứng dụng để đảm bảo ứng dụng hoạt động như mong đợi, đặc biệt nếu ứng dụng của bạn rơi vào một trong những trường hợp sau danh mục:

Truy vấn lựa chọn gần đây nhất của người dùng đối với quyền truy cập vào ảnh đã chọn

Giờ đây, ứng dụng chỉ có thể làm nổi bật những ảnh và video được chọn gần đây nhất khi được cấp quyền truy cập một phần vào quyền truy cập nội dung nghe nhìn. Tính năng này có thể cải thiện trải nghiệm người dùng cho những ứng dụng thường xuyên yêu cầu quyền truy cập vào ảnh và video. Để sử dụng tính năng này trong ứng dụng, hãy bật đối số QUERY_ARG_LATEST_SELECTION_ONLY khi truy vấn MediaStore thông qua 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)
});

Hộp cát về quyền riêng tư trên Android

Android 15 includes the latest Android Ad Services extensions, incorporating the latest version of the Privacy Sandbox on Android. This addition is part of our work to develop technologies that improve user privacy and enable effective, personalized advertising experiences for mobile apps. Our privacy sandbox page has more information about the Privacy Sandbox on Android developer preview and beta programs to help you get started.

Health Connect

Android 15 tích hợp các tiện ích mới nhất Health Connect của Android, một ứng dụng bảo mật và tập trung để quản lý và chia sẻ dữ liệu sức khoẻ và thể chất do ứng dụng thu thập. Thông tin cập nhật này thêm tính năng hỗ trợ cho các loại dữ liệu khác về tính năng thể dục, dinh dưỡng, nhiệt độ trên da, kế hoạch tập luyện, v.v.

Tính năng theo dõi nhiệt độ trên da giúp người dùng lưu trữ và chia sẻ thông tin chính xác hơn dữ liệu về nhiệt độ từ thiết bị đeo hoặc thiết bị theo dõi khác.

Kế hoạch tập luyện là kế hoạch tập thể dục có cấu trúc để giúp người dùng đạt được mục tiêu về thể chất. Hỗ trợ kế hoạch tập luyện bao gồm nhiều mục tiêu về hiệu suất và hoàn thành:

Tìm hiểu thêm về các bản cập nhật mới nhất cho Health Connect trong Android trong bài nói chuyện Tạo trải nghiệm thích ứng bằng Android Health tại Google I/O.

Chia sẻ màn hình ứng dụng

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.

Trải nghiệm người dùng và giao diện người dùng hệ thống

Android 15 giúp nhà phát triển ứng dụng và người dùng có nhiều quyền kiểm soát và linh hoạt hơn khi định cấu hình thiết bị cho phù hợp với nhu cầu của họ.

Để tìm hiểu thêm về cách sử dụng các điểm cải tiến mới nhất trong Android 15 nhằm cải thiện trải nghiệm người dùng của ứng dụng, hãy xem bài nói chuyện Cải thiện trải nghiệm người dùng của ứng dụng Android tại Google I/O.

Bản xem trước tiện ích phong phú hơn với API Bản xem trước được tạo

Trước Android 15, cách duy nhất để cung cấp bản xem trước bộ chọn tiện ích là chỉ định một hình ảnh hoặc tài nguyên bố cục tĩnh. Các bản xem trước này thường khác biệt đáng kể với giao diện của tiện ích thực tế khi được đặt trên màn hình chính. Ngoài ra, không thể tạo tài nguyên tĩnh bằng Jetpack Glance, vì vậy tính năng Glance nhà phát triển phải chụp ảnh màn hình tiện ích của họ hoặc tạo bố cục XML để có một bản xem trước tiện ích.

Android 15 bổ sung tính năng hỗ trợ cho bản xem trước đã tạo. Điều này có nghĩa là trình cung cấp tiện ích ứng dụng có thể tạo RemoteViews để dùng làm bản xem trước bộ chọn, thay vì tài nguyên tĩnh.

Các ứng dụng có thể cung cấp Chế độ xem từ xa cho Bộ chọn tiện ích để có thể cập nhật nội dung trong bộ chọn cho phù hợp hơn với nội dung mà người dùng sẽ thấy.

API Đẩy

Ứng dụng có thể cung cấp bản xem trước đã tạo thông qua API đẩy. Ứng dụng có thể cung cấp bản xem trước tại bất kỳ thời điểm nào trong vòng đời và không nhận được yêu cầu rõ ràng từ máy chủ lưu trữ để cung cấp bản xem trước. Bản xem trước được lưu trữ trong AppWidgetService và máy chủ lưu trữ có thể yêu cầu bản xem trước theo yêu cầu. Ví dụ sau đây tải tài nguyên bố cục tiện ích XML và đặt tài nguyên đó làm bản xem trước:

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

Quy trình dự kiến là:

  1. Nhà cung cấp tiện ích sẽ gọi setWidgetPreview bất cứ lúc nào. Các bản xem trước được cung cấp sẽ được lưu trữ trong AppWidgetService cùng với thông tin khác của nhà cung cấp.
  2. setWidgetPreview thông báo cho máy chủ lưu trữ về bản xem trước đã cập nhật thông qua lệnh gọi lại AppWidgetHost.onProvidersChanged. Để phản hồi, máy chủ của tiện ích sẽ tải lại tất cả thông tin của nhà cung cấp.
  3. Khi hiển thị bản xem trước của tiện ích, máy chủ lưu trữ sẽ kiểm tra AppWidgetProviderInfo.generatedPreviewCategories và nếu được chọn có sẵn danh mục, hãy gọi AppWidgetManager.getWidgetPreview tới trả về bản xem trước đã lưu cho ứng dụng nhà cung cấp này.

Thời điểm gọi setWidgetPreview

Do không có lệnh gọi lại để cung cấp bản xem trước, ứng dụng có thể chọn gửi bản xem trước bất kỳ lúc nào khi chúng đang chạy. Tần suất cập nhật bản xem trước phụ thuộc vào trường hợp sử dụng tiện ích.

Danh sách sau đây mô tả hai danh mục chính của trường hợp sử dụng bản xem trước:

  • Những nhà cung cấp cho thấy dữ liệu thực trong bản xem trước tiện ích, chẳng hạn như dữ liệu được cá nhân hoá hoặc thông tin gần đây. Các nhà cung cấp này có thể thiết lập bản xem trước sau khi người dùng đăng nhập hoặc đã định cấu hình ban đầu trong ứng dụng của họ. Sau đó, họ có thể thiết lập một tác vụ định kỳ để cập nhật bản xem trước theo tần suất mà họ chọn. Ví dụ về loại tiện ích này có thể là ảnh, lịch, thời tiết hoặc tin tức tiện ích.
  • Các trình cung cấp hiển thị thông tin tĩnh trong bản xem trước hoặc tiện ích thao tác nhanh mà không hiển thị bất kỳ dữ liệu nào. Các nhà cung cấp này có thể đặt bản xem trước một lần, khi khởi chạy ứng dụng lần đầu tiên. Ví dụ về loại tiện ích này bao gồm trình đơn nhanh tiện ích hành động hoặc tiện ích lối tắt Chrome.

Một số nhà cung cấp có thể hiển thị bản xem trước tĩnh trên bộ chọn chế độ thiết bị trung tâm, nhưng thực tế thông tin trên bộ chọn màn hình chính. Các nhà cung cấp này phải tuân theo hướng dẫn cho cả hai trường hợp sử dụng này để đặt bản xem trước.

Hình trong hình

Android 15 giới thiệu các thay đổi trong tính năng Hình trong hình (PiP) để đảm bảo quá trình chuyển đổi diễn ra suôn sẻ hơn khi chuyển sang chế độ PiP. Điều này sẽ có lợi cho các ứng dụng có các thành phần giao diện người dùng được phủ lên giao diện người dùng chính, chuyển sang chế độ PiP.

Nhà phát triển sử dụng lệnh gọi lại onPictureInPictureModeChanged để xác định logic bật/tắt chế độ hiển thị của các thành phần giao diện người dùng được phủ lên. Lệnh gọi lại này được kích hoạt khi ảnh động vào hoặc thoát PiP hoàn tất. Kể từ Android 15, lớp PictureInPictureUiState bao gồm một trạng thái khác.

Với trạng thái giao diện người dùng này, các ứng dụng nhắm đến Android 15 (API cấp 35) sẽ quan sát thấy lệnh gọi lại Activity#onPictureInPictureUiStateChanged được gọi bằng isTransitioningToPip() ngay khi ảnh động trong Hình trong hình bắt đầu. Có nhiều thành phần trên giao diện người dùng không liên quan đến ứng dụng khi ở chế độ PiP, chẳng hạn như thành phần hiển thị hoặc bố cục có chứa thông tin như đề xuất, video sắp ra mắt, điểm xếp hạng và tiêu đề. Khi ứng dụng chuyển sang chế độ Hình trong hình, hãy sử dụng lệnh gọi lại onPictureInPictureUiStateChanged để ẩn các thành phần này trên giao diện người dùng. Khi ứng dụng chuyển sang chế độ toàn màn hình từ cửa sổ Hình trong hình, hãy sử dụng lệnh gọi lại onPictureInPictureModeChanged để hiện các phần tử này, như trong các ví dụ sau:

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

Nút bật/tắt chế độ hiển thị nhanh các thành phần giao diện người dùng không liên quan (đối với cửa sổ PiP) giúp đảm bảo ảnh động chuyển vào PiP mượt mà và không nhấp nháy.

Cải tiến quy tắc Không làm phiền

AutomaticZenRule cho phép các ứng dụng tuỳ chỉnh các quy tắc Quản lý sự chú ý (Không làm phiền) và quyết định thời điểm kích hoạt hoặc huỷ kích hoạt các quy tắc đó. Android 15 cải thiện đáng kể các quy tắc này với mục tiêu cải thiện trải nghiệm người dùng. Các điểm cải tiến sau đây:

  • Thêm các loại vào AutomaticZenRule, cho phép hệ thống áp dụng các loại đặc biệt xử lý tín dụng đối với một số quy tắc.
  • Thêm một biểu tượng vào AutomaticZenRule, giúp cải thiện các chế độ có thể nhận ra.
  • Thêm một chuỗi triggerDescription vào AutomaticZenRule để mô tả các điều kiện mà quy tắc sẽ bắt đầu hoạt động cho người dùng.
  • Thêm ZenDeviceEffects vào AutomaticZenRule, cho phép các quy tắc kích hoạt những tính năng như hiển thị thang màu xám, chế độ ban đêm hoặc giảm độ sáng hình nền.

Đặt VibrationEffect cho các kênh thông báo

Android 15 hỗ trợ chế độ rung mạnh cho các thông báo đến bằng cách kênh của bạn bằng NotificationChannel.setVibrationEffect, vì vậy người dùng có thể phân biệt giữa các loại thông báo khác nhau mà không cần phải xem thiết bị của mình.

Khối thanh trạng thái của tính năng chiếu nội dung nghe nhìn và tính năng tự động dừng

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

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

Màn hình lớn và kiểu dáng

Android 15 hỗ trợ ứng dụng của bạn khai thác tối đa các kiểu dáng của Android, bao gồm màn hình lớn, thiết bị có thể xoay và thiết bị có thể gập lại.

Cải thiện khả năng đa nhiệm trên màn hình lớn

Android 15 mang đến cho người dùng nhiều cách tốt hơn để làm nhiều việc cùng lúc trên các thiết bị có màn hình lớn. Để Ví dụ: người dùng có thể lưu các kiểu kết hợp ứng dụng mà họ yêu thích ở chế độ chia đôi màn hình để hãy truy cập và ghim thanh tác vụ trên màn hình để chuyển đổi nhanh giữa các ứng dụng. Điều này có nghĩa là việc đảm bảo ứng dụng của bạn có khả năng thích ứng là quan trọng hơn bao giờ hết.

Google I/O có các phiên về chủ đề Xây dựng Android thích ứng ứng dụngXây dựng giao diện người dùng bằng Material 3 thư viện thích ứng có thể hữu ích, và tài liệu của chúng tôi có nhiều tài liệu hơn để giúp bạn Thiết kế cho màn hình.

Hỗ trợ màn hình bao phủ

Ứng dụng của bạn có thể khai báo một thuộc tính mà Android 15 dùng để cho phép Application hoặc Activity của bạn xuất hiện trên màn hình bìa nhỏ của thiết bị có thể gập lại được hỗ trợ. Những màn hình này quá nhỏ để được coi là mục tiêu tương thích để chạy ứng dụng Android. Tuy nhiên, ứng dụng của bạn có thể chọn hỗ trợ những màn hình này, giúp ứng dụng của bạn xuất hiện ở nhiều vị trí hơn.

Khả năng kết nối

Android 15 cập nhật nền tảng để cho phép ứng dụng của bạn sử dụng các tiến bộ mới nhất trong công nghệ không dây và giao tiếp.

Hỗ trợ vệ tinh

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

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

A notification appears when the device connects to a satellite.

Trải nghiệm NFC mượt mà hơn

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

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

Vai trò của Wallet

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.

Bảo mật

Android 15 giúp bạn tăng cường khả năng bảo mật của ứng dụng, bảo vệ dữ liệu của ứng dụng và mang đến cho người dùng nhiều thông tin minh bạch hơn cũng như quyền kiểm soát đối với dữ liệu của họ. Xem bài phát biểu Bảo vệ tính bảo mật của người dùng trên Android tại Google I/O để biết thêm về những việc chúng tôi đang làm để cải thiện biện pháp bảo vệ người dùng và bảo vệ ứng dụng của bạn khỏi các mối đe doạ mới.

Tích hợp Trình quản lý thông tin xác thực với tính năng tự động điền

Starting with Android 15, developers can link specific views like username or password fields with Credential Manager requests, making it easier to provide a tailored user experience during the sign-in process. When the user focuses on one of these views, a corresponding request is sent to Credential Manager. The resulting credentials are aggregated across providers and displayed in autofill fallback UIs, such as inline suggestions or drop-down suggestions. The Jetpack androidx.credentials library is the preferred endpoint for developers to use and will soon be available to further enhance this feature in Android 15 and higher.

Tích hợp tính năng đăng ký và đăng nhập bằng một lần chạm với lời nhắc sinh trắc học

Trình quản lý thông tin xác thực tích hợp lời nhắc sinh trắc học vào quy trình tạo thông tin xác thực và đăng nhập, giúp các nhà cung cấp không cần phải quản lý lời nhắc sinh trắc học. Do đó, trình cung cấp thông tin xác thực chỉ cần tập trung vào kết quả của quy trình tạo và nhận, được tăng cường bằng kết quả của quy trình sinh trắc học. Quy trình đơn giản này giúp tạo và truy xuất thông tin xác thực hiệu quả và đơn giản hơn.

Quản lý khoá cho phương thức mã hoá hai đầu

Chúng tôi sẽ ra mắt E2eeContactKeysManager trong Android 15, hỗ trợ phương thức mã hoá hai đầu (E2EE) trong các ứng dụng Android của bạn bằng cách cung cấp một API cấp hệ điều hành để lưu trữ khoá công khai mã hoá.

E2eeContactKeysManager được thiết kế để tích hợp với ứng dụng danh bạ trên nền tảng, giúp người dùng quản lý và xác minh khoá công khai của danh bạ một cách tập trung.

Kiểm tra quyền trên URI nội dung

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

Hỗ trợ tiếp cận

Android 15 bổ sung các tính năng giúp cải thiện khả năng hỗ trợ tiếp cận cho người dùng.

Chữ nổi tốt hơn

Trên Android 15, chúng tôi đã tạo điều kiện để TalkBack có thể hỗ trợ màn hình chữ nổi đang sử dụng tiêu chuẩn HID qua cả USB và Bluetooth bảo mật.

Tiêu chuẩn này, cũng giống như tiêu chuẩn mà chuột và bàn phím sử dụng, sẽ giúp Android hỗ trợ nhiều loại màn hình chữ nổi hơn theo thời gian.

Quốc tế hoá

Android 15 bổ sung các tính năng và chức năng bổ sung cho trải nghiệm người dùng khi thiết bị được sử dụng bằng nhiều ngôn ngữ.

Phông chữ biến đổi CJK

Kể từ Android 15, tệp phông chữ cho tiếng Trung, tiếng Nhật và tiếng Hàn (CJK) (NotoSansCJK) nay là một phông chữ có thể thay đổi. Phông chữ thay đổi mở ra nhiều khả năng mới cho kiểu chữ sáng tạo bằng ngôn ngữ CJK. Nhà thiết kế có thể khám phá nhiều kiểu dáng và tạo ra những bố cục bắt mắt, ấn tượng mà trước đây khó hoặc không thể làm được.

Cách phông chữ có thể thay đổi cho tiếng Trung, tiếng Nhật và tiếng Hàn (CJK) xuất hiện với độ rộng phông chữ khác nhau.

Căn chỉnh giữa các ký tự

Kể từ Android 15, bạn có thể căn chỉnh văn bản bằng cách sử dụng khoảng cách chữ cái bằng cách đang sử dụng JUSTIFICATION_MODE_INTER_CHARACTER. Lý do giữa các từ cũ là được ra mắt lần đầu trong Android 8.0 (API cấp 26) và liên ký tự Dịch vụ này cung cấp các khả năng tương tự cho các ngôn ngữ sử dụng ký tự khoảng trắng để phân đoạn, chẳng hạn như tiếng Trung, tiếng Nhật và các loại khác.

Bố cục cho văn bản tiếng Nhật bằng JUSTIFICATION_MODE_NONE.
Bố cục cho văn bản tiếng Anh bằng cách sử dụng JUSTIFICATION_MODE_NONE.


Bố cục cho văn bản tiếng Nhật bằng cách sử dụng JUSTIFICATION_MODE_INTER_WORD.
Bố cục cho văn bản tiếng Anh bằng cách sử dụng JUSTIFICATION_MODE_INTER_WORD.


Bố cục cho văn bản tiếng Nhật bằng cách sử dụng JUSTIFICATION_MODE_INTER_CHARACTER.
Bố cục cho văn bản tiếng Anh bằng cách sử dụng JUSTIFICATION_MODE_INTER_CHARACTER.

Cấu hình ngắt dòng tự động

Android started supporting phrase-based line breaks for Japanese and Korean in Android 13 (API level 33). However, while phrase-based line breaks improve the readability of short lines of text, they don't work well for long lines of text. In Android 15, apps can apply phrase-based line breaks only for short lines of text, using the LINE_BREAK_WORD_STYLE_AUTO option. This option selects the best word style option for the text.

For short lines of text, phrase-based line breaks are used, functioning the same as LINE_BREAK_WORD_STYLE_PHRASE, as shown in the following image:

For short lines of text, LINE_BREAK_WORD_STYLE_AUTO applies phrase-based line breaks to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_PHRASE.

For longer lines of text, LINE_BREAK_WORD_STYLE_AUTO uses a no line-break word style, functioning the same as LINE_BREAK_WORD_STYLE_NONE, as shown in the following image:

For long lines of text, LINE_BREAK_WORD_STYLE_AUTO applies no line-break word style to improve the readability of the text. This is the same as applying LINE_BREAK_WORD_STYLE_NONE.

Phông chữ Hentaigana tiếng Nhật bổ sung

Trong Android 15, một tệp phông chữ dành cho chữ Hiragana tiếng Nhật cũ (còn gọi là Hentaigana) được nhóm theo mặc định. Hình dạng độc đáo của các nhân vật trong Hentaigana có thể khiến nét đặc trưng riêng cho hình minh hoạ hoặc thiết kế, đồng thời vẫn giúp đảm bảo tính chính xác sự truyền tải và hiểu biết của các tài liệu cổ của Nhật Bản.

Kiểu ký tự và văn bản của Hentaigana tiếng Nhật phông chữ.

VideoLAN nón Bản quyền (c) 1996-2010 VideoLAN. Biểu trưng này hoặc phiên bản đã sửa đổi có thể được bất kỳ ai sử dụng hoặc sửa đổi để tham chiếu đến dự án VideoLAN hoặc bất kỳ sản phẩm nào do nhóm VideoLAN phát triển, nhưng không thể hiện sự chứng thực của dự án.

Vulkan và biểu trưng Vulkan là nhãn hiệu đã đăng ký của Khronos Group Inc.

OpenGL là một nhãn hiệu đã đăng ký và biểu trưng OpenGL ES là nhãn hiệu của Hewlett Packard Enterprise do Khronos sử dụng.