ภาพรวมฟีเจอร์และ API

Android 15 เปิดตัวฟีเจอร์และ API ที่ยอดเยี่ยมสำหรับนักพัฒนาแอป ส่วนต่อไปนี้จะสรุปฟีเจอร์เหล่านี้เพื่อช่วยให้คุณเริ่มต้นใช้งาน API ที่เกี่ยวข้องได้

ดูรายการ API ที่เพิ่ม แก้ไข และนําออกอย่างละเอียดได้ในรายงานความแตกต่างของ API ดูรายละเอียดเกี่ยวกับ API ที่เพิ่มได้ที่ข้อมูลอ้างอิง Android API สำหรับ Android 15 ให้มองหา API ที่เพิ่มใน API ระดับ 35 หากต้องการดูข้อมูลเกี่ยวกับด้านต่างๆ ที่การเปลี่ยนแปลงแพลตฟอร์มอาจส่งผลต่อแอปของคุณ โปรดดูการเปลี่ยนแปลงลักษณะการทํางานของ Android 15 สําหรับแอปที่กำหนดเป้าหมายเป็น Android 15 และสําหรับแอปทั้งหมด

กล้องและสื่อ

Android 15 มีฟีเจอร์มากมายที่ช่วยปรับปรุงประสบการณ์การใช้งานกล้องและสื่อ รวมถึงให้คุณเข้าถึงเครื่องมือและฮาร์ดแวร์เพื่อสนับสนุนครีเอเตอร์ในการสร้างสรรค์ผลงานใน Android

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ล่าสุดและโซลูชันสำหรับนักพัฒนาแอปสำหรับสื่อและกล้องของ Android ได้ที่การบรรยายเรื่องการสร้างประสบการณ์การใช้งานสื่อและกล้อง Android ที่ทันสมัยจาก Google I/O

การเพิ่มแสงในสภาวะแสงน้อย

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.

การควบคุมกล้องในแอป

Android 15 adds an extension for more control over the camera hardware and its algorithms on supported devices:

  • Advanced flash strength adjustments enabling precise control of flash intensity in both SINGLE and TORCH modes while capturing images.

การควบคุม Headroom ของ HDR

Android 15 chooses HDR headroom that is appropriate for the underlying device capabilities and bit-depth of the panel. For pages that have lots of SDR content, such as a messaging app displaying a single HDR thumbnail, this behavior can end up adversely influencing the perceived brightness of the SDR content. Android 15 lets you control the HDR headroom with setDesiredHdrHeadroom to strike a balance between SDR and HDR content.

The brightness of SDR UI elements on the left screen appears to be more uniform than the brightness on the right screen, which simulates possible headroom issues when HDR and SDR content are mixed. By adjusting the HDR headroom, you can achieve a better balance between the SDR and HDR content.

การควบคุมระดับเสียง

Android 15 เพิ่มการรองรับ มาตรฐานความดัง CTA-2075 เพื่อช่วยคุณ หลีกเลี่ยงความดังของเสียงที่ไม่สอดคล้องกัน และทำให้ผู้ใช้ไม่ต้องคอยฟัง ปรับระดับเสียงเมื่อสลับระหว่างเนื้อหา ระบบใช้ประโยชน์จากลักษณะที่ทราบของอุปกรณ์เอาต์พุต (หูฟังและลำโพง) พร้อมกับข้อมูลเมตาระดับเสียงที่มีอยู่ในเนื้อหาเสียง AAC เพื่อปรับระดับความดังของเสียงและการบีบอัดช่วงไดนามิกอย่างชาญฉลาด

หากต้องการเปิดใช้ฟีเจอร์นี้ คุณต้องตรวจสอบว่าข้อมูลเมตาระดับเสียงพร้อมใช้งานในเนื้อหา AAC และเปิดใช้ฟีเจอร์แพลตฟอร์มในแอป โดยคุณจะต้องสร้างอินสแตนซ์ออบเจ็กต์ LoudnessCodecController ด้วยการเรียกใช้เมธอด create ของฟีเจอร์ดังกล่าวพร้อมด้วยรหัสเซสชันเสียงจาก AudioTrack ที่เชื่อมโยง ซึ่งจะเริ่มใช้การอัปเดตเสียงโดยอัตโนมัติ คุณสามารถส่ง OnLoudnessCodecUpdateListener เพื่อแก้ไขหรือกรองพารามิเตอร์ระดับเสียงก่อนที่จะนำไปใช้กับ 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 จะได้รับการอัปเดตให้ใช้ LoudnessCodecControllerAPI เพื่อการผสานรวมแอปอย่างราบรื่น

อุปกรณ์ MIDI 2.0 เสมือนจริง

Android 13 เพิ่มการรองรับสำหรับการเชื่อมต่อกับ อุปกรณ์ MIDI 2.0 ที่ใช้ USB ซึ่งสื่อสารโดยใช้ Universal MIDI Packets (UMP) Android 15 ขยายการรองรับ UMP เป็น MIDI เสมือน apps การทำให้แอปองค์ประกอบสามารถควบคุมแอปสังเคราะห์ เป็นอุปกรณ์ MIDI 2.0 เสมือนเหมือนที่ทำกับอุปกรณ์ USB MIDI 2.0

การถอดรหัสด้วยซอฟต์แวร์ 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.

เครื่องมือและประสิทธิภาพการทำงานของนักพัฒนาซอฟต์แวร์

แม้ว่างานส่วนใหญ่ของเราเพื่อปรับปรุงประสิทธิภาพการทำงานจะมุ่งเน้นไปที่เครื่องมือต่างๆ เช่น Android Studio, Jetpack Compose และไลบรารี Android Jetpack แต่เราก็มองหาวิธีต่างๆ ในแพลตฟอร์มอยู่เสมอเพื่อช่วยให้คุณบรรลุเป้าหมายได้ง่ายขึ้น

การอัปเดต 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.

การปรับปรุง PDF

Android 15 มีการปรับปรุงที่สำคัญสำหรับ PdfRenderer API แอปสามารถรวมฟีเจอร์ขั้นสูง เช่น การแสดงผลไฟล์ที่มีการป้องกันด้วยรหัสผ่าน คําอธิบายประกอบ การแก้ไขแบบฟอร์ม การค้นหา และการเลือกพร้อมการคัดลอก PDF เชิงเส้น รองรับการเพิ่มประสิทธิภาพเพื่อให้ดู PDF ในเครื่องได้เร็วขึ้นและลดการใช้ทรัพยากร ไลบรารี PDF ของ Jetpack ใช้ API เหล่านี้เพื่อให้การเพิ่ม PDF เป็นเรื่องง่าย ความสามารถในการดูแอปของคุณ

การอัปเดตล่าสุดเกี่ยวกับการแสดงผล PDF มีฟีเจอร์ต่างๆ เช่น การค้นหาไฟล์ PDF ที่ฝัง

ย้าย PdfRenderer ไปยังโมดูลที่อัปเดตได้โดยใช้ Google แล้ว การอัปเดตระบบ Play โดยไม่ขึ้นอยู่กับการเปิดตัวแพลตฟอร์ม และเราให้การสนับสนุน การเปลี่ยนแปลงเหล่านี้กลับไปใช้ Android 11 (API ระดับ 30) โดยการสร้าง แพลตฟอร์ม API ก่อน Android 15 ที่เรียกว่า PdfRendererPreV

การปรับแต่งการสลับภาษาอัตโนมัติ

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.

OpenType Variable Font API ที่ปรับปรุงแล้ว

Android 15 ปรับปรุงความสามารถในการใช้งานแบบอักษรของตัวแปร OpenType ตอนนี้คุณสามารถ สร้างอินสแตนซ์ FontFamily จากแบบอักษรของตัวแปรโดยไม่ต้องระบุ แกนถ่วงน้ำหนักด้วย buildVariableFamily API ตัวแสดงผลข้อความจะลบล้าง ค่าของแกน wght เพื่อให้ตรงกับข้อความที่แสดง

การใช้ API ใหม่จะช่วยให้โค้ดในการสร้าง 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();

ก่อนหน้านี้ หากต้องการสร้าง Typeface เดียวกัน คุณจะต้องมีโค้ดเพิ่มเติมดังนี้

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

นี่คือตัวอย่างวิธีที่ Typeface สร้างด้วย API ทั้งเก่าและใหม่ แสดงผล:

ตัวอย่างความแตกต่างในการแสดงผลของแบบอักษรเมื่อใช้แบบใหม่และแบบเก่า
API

ในตัวอย่างนี้ Typeface ที่สร้างด้วย API เดิมไม่มีส่วน ความสามารถในการสร้างน้ำหนักแบบอักษรที่แม่นยำสำหรับตัวอักษร 350, 450, 550 และ 650 Font ดังนั้นตัวแสดงผลจะกลับไปอยู่ในน้ำหนักที่ใกล้เคียงที่สุด ดังนั้นใน ในกรณีนี้ แสดงผล 300 แทน 350, แสดงผล 400 แทน 450 และ เป็นต้น ในทางตรงกันข้าม Typeface ที่สร้างด้วย API ใหม่จะสร้าง อินสแตนซ์ Font สำหรับน้ำหนักที่ระบุ ดังนั้นระบบจะแสดงผลน้ำหนักที่ถูกต้องเป็น 350 450, 550 และ 650 ด้วย

การควบคุมตัวแบ่งบรรทัดแบบละเอียด

ตั้งแต่ Android 15 เป็นต้นไป TextView และตัวแบ่งบรรทัดที่สำคัญจะเก็บรักษาข้อความที่ระบุในบรรทัดเดียวกันไว้เพื่อให้อ่านง่ายขึ้น คุณใช้ประโยชน์จากการปรับเปลี่ยนการขึ้นบรรทัดใหม่นี้ได้โดยการใช้แท็ก <nobreak> ในทรัพยากรสตริงหรือ createNoBreakSpan ในทำนองเดียวกัน คุณสามารถคงคำไม่ให้มีการแบ่งวรรคโดยใช้แท็ก <nohyphen> หรือ createNoHyphenationSpan

ตัวอย่างเช่น ทรัพยากรสตริงต่อไปนี้ไม่มีการขึ้นบรรทัดใหม่ และแสดงผลโดยตัดข้อความ "Pixel 8 Pro" ตรงที่ไม่ต้องการ

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

ในทางตรงกันข้าม ทรัพยากรสตริงนี้จะมีแท็ก <nobreak> ซึ่งตัดวลี "Pixel 8 Pro" และป้องกันการขึ้นบรรทัดใหม่:

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

ความแตกต่างของวิธีแสดงผลสตริงเหล่านี้จะแสดงอยู่ในรูปภาพต่อไปนี้

เลย์เอาต์สำหรับบรรทัดข้อความที่ไม่ได้ตัดวลี "Pixel 8 Pro" โดยใช้แท็ก <nobreak>
เลย์เอาต์สำหรับบรรทัดข้อความเดียวกันที่ตัดวลี "Pixel 8 Pro" โดยใช้แท็ก <nobreak>

การเก็บแอป

Android และ Google Play ได้ประกาศรองรับการเก็บถาวรของแอปไปเมื่อปีที่ผ่านมา ซึ่งช่วยให้ผู้ใช้เพิ่มพื้นที่ว่างได้ด้วยการนําแอปที่ไม่ได้ใช้บ่อยออกจากอุปกรณ์บางส่วน ซึ่งเผยแพร่โดยใช้ Android App Bundle ใน Google Play Android 15 มีการรองรับการเก็บถาวรแอปในระดับระบบปฏิบัติการ และยกเลิกการเก็บ ซึ่งจะทำให้ App Store ทั้งหมดติดตั้งใช้งานได้ง่ายขึ้น

แอปที่มีสิทธิ์ REQUEST_DELETE_PACKAGES สามารถเรียกใช้เมธอด requestArchive ของ PackageInstaller เพื่อขอเก็บถาวรแพ็กเกจแอปที่ติดตั้ง ซึ่งจะนำ APK และไฟล์แคชทั้งหมดออก แต่จะเก็บข้อมูลผู้ใช้ไว้ แอปที่เก็บถาวรจะแสดงผลเป็นแอปที่แสดงได้ผ่าน LauncherApps API ผู้ใช้จะเห็นตัวเลือก UI เพื่อไฮไลต์ เก็บแอปพลิเคชันแล้ว หากผู้ใช้แตะแอปที่เก็บไว้ ผู้ติดตั้งที่รับผิดชอบจะได้รับคําขอให้ยกเลิกการเก็บ และสามารถตรวจสอบกระบวนการกู้คืนได้โดยการออกอากาศ ACTION_PACKAGE_ADDED

กราฟิก

Android 15 มีการปรับปรุงกราฟิกล่าสุด ซึ่งรวมถึง ANGLE และการเพิ่มลงในระบบกราฟิก Canvas

ปรับปรุงการเข้าถึง GPU ของ Android ให้ทันสมัย

Vulkan logo

Android hardware has evolved quite a bit from the early days where the core OS would run on a single CPU and GPUs were accessed using APIs based on fixed-function pipelines. The Vulkan® graphics API has been available in the NDK since Android 7.0 (API level 24) with a lower-level abstraction that better reflects modern GPU hardware, scales better to support multiple CPU cores, and offers reduced CPU driver overhead — leading to improved app performance. Vulkan is supported by all modern game engines.

Vulkan is Android's preferred interface to the GPU. Therefore, Android 15 includes ANGLE as an optional layer for running OpenGL® ES on top of Vulkan. Moving to ANGLE will standardize the Android OpenGL implementation for improved compatibility, and, in some cases, improved performance. You can test out your OpenGL ES app stability and performance with ANGLE by enabling the developer option in Settings -> System -> Developer Options -> Experimental: Enable ANGLE on Android 15.

The Android ANGLE on Vulkan roadmap

Roadmap of upcoming changes to the Android GPU APIs.

As part of streamlining our GPU stack, going forward we will be shipping ANGLE as the GL system driver on more new devices, with the future expectation that OpenGL/ES will be only available through ANGLE. That being said, we plan to continue support for OpenGL ES on all devices.

Recommended next steps

Use the developer options to select the ANGLE driver for OpenGL ES and test your app. For new projects, we strongly encourage using Vulkan for C/C++.

การปรับปรุงสำหรับ 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.

ประสิทธิภาพและแบตเตอรี่

Android ยังคงมุ่งเน้นที่การช่วยปรับปรุงประสิทธิภาพและคุณภาพของแอป Android 15 เปิดตัว API ที่ช่วยทําให้งานในแอปมีประสิทธิภาพมากขึ้น เพิ่มประสิทธิภาพแอป และรวบรวมข้อมูลเชิงลึกเกี่ยวกับแอป

ดูแนวทางปฏิบัติแนะนำเพื่อประหยัดแบตเตอรี่ การแก้ไขข้อบกพร่องเครือข่ายและการใช้พลังงาน รวมถึงรายละเอียดเกี่ยวกับวิธีที่เราปรับปรุงประสิทธิภาพแบตเตอรี่ของงานเบื้องหลังใน Android 15 และ Android เวอร์ชันล่าสุดได้ที่การบรรยายเรื่องการปรับปรุงประสิทธิภาพแบตเตอรี่ของงานเบื้องหลังใน Android จาก 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.

ข้อมูลขนาดแอปโดยละเอียด

Since Android 8.0 (API level 26), Android has included the StorageStats.getAppBytes API that summarizes the installed size of an app as a single number of bytes, which is a sum of the APK size, the size of files extracted from the APK, and files that were generated on the device such as ahead-of-time (AOT) compiled code. This number is not very insightful in terms of how your app is using storage.

Android 15 adds the StorageStats.getAppBytesByDataType([type]) API, which lets you get insight into how your app is using up all that space, including APK file splits, AOT and speedup related code, dex metadata, libraries, and guided profiles.

โปรไฟล์ที่จัดการโดยแอป

Android 15 มีคลาส ProfilingManager ซึ่งช่วยให้คุณรวบรวมข้อมูลการโปรไฟล์จากภายในแอปได้ เช่น การดัมพ์กอง โปรไฟล์กอง สุ่มตัวอย่างสแต็ก และอื่นๆ โดยจะทำการเรียกกลับไปยังแอปด้วยแท็กที่ระบุเพื่อระบุไฟล์เอาต์พุต ซึ่งระบบจะส่งไปยังไดเรกทอรีไฟล์ของแอป API จะจำกัดอัตราเพื่อลดผลกระทบด้านประสิทธิภาพ

เราขอแนะนําให้ใช้ Profiling AndroidX API ที่เกี่ยวข้องเพื่อลดความซับซ้อนในการสร้างคําขอโปรไฟล์ในแอป ซึ่งพร้อมใช้งานใน Core 1.15.0-rc01 ขึ้นไป

การปรับปรุงฐานข้อมูล SQLite

Android 15 เปิดตัว SQLite API ที่แสดงฟีเจอร์ขั้นสูงจากเครื่องมือ SQLite ที่อยู่เบื้องหลังซึ่งมุ่งเน้นปัญหาด้านประสิทธิภาพที่เฉพาะเจาะจงซึ่งอาจแสดงในแอป API เหล่านี้มาพร้อมกับการอัปเดต SQLite เป็นเวอร์ชัน 3.44.3

นักพัฒนาแอปควรอ่านแนวทางปฏิบัติแนะนำสำหรับประสิทธิภาพของ SQLite เพื่อใช้ประโยชน์จากฐานข้อมูล SQLite ให้ได้สูงสุด โดยเฉพาะเมื่อทำงานกับ หรือเมื่อเรียกใช้การค้นหาที่คำนึงถึงเวลาในการตอบสนอง

  • ธุรกรรมที่รอดำเนินการแบบอ่านอย่างเดียว: เมื่อออกธุรกรรมแบบอ่านอย่างเดียว (ไม่มีคำสั่งเขียน) ให้ใช้ beginTransactionReadOnly() และ beginTransactionWithListenerReadOnly(SQLiteTransactionListener) เพื่อออกธุรกรรม DEFERRED แบบอ่านอย่างเดียว ธุรกรรมดังกล่าวทำงานได้ พร้อมๆ กัน และถ้าฐานข้อมูลอยู่ในโหมด WAL จะสามารถส่ง ทำงานพร้อมกันกับธุรกรรม IMMEDIATE หรือ EXCLUSIVE
  • จำนวนแถวและรหัส: มีการเพิ่ม API เพื่อเรียกข้อมูลจำนวนที่มีการเปลี่ยนแปลง หรือรหัสแถวที่แทรกล่าสุดโดยไม่ต้องส่งคำขอเพิ่มเติม getLastChangedRowCount() จะแสดงจํานวนแถวที่แทรก อัปเดต หรือลบโดยคำสั่ง SQL ล่าสุดภายในธุรกรรมปัจจุบัน ส่วน getTotalChangedRowCount() จะแสดงจํานวนการเชื่อมต่อปัจจุบัน getLastInsertRowId() แสดงผล rowid ของแถวสุดท้าย ที่จะแทรกลงในการเชื่อมต่อปัจจุบัน
  • ข้อความดิบ: ออกคำสั่ง SQlite ดิบโดยหลีกเลี่ยงความสะดวก Wrapper และค่าใช้จ่ายในการประมวลผลเพิ่มเติมอื่นๆ ที่อาจเกิดขึ้น

การอัปเดตเฟรมเวิร์กประสิทธิภาพแบบไดนามิกของ 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.

ความเป็นส่วนตัว

Android 15 มีฟีเจอร์มากมายที่จะช่วยนักพัฒนาแอปปกป้องความเป็นส่วนตัวของผู้ใช้

การตรวจจับการบันทึกหน้าจอ

Android 15 เพิ่มการรองรับแอปเพื่อตรวจจับว่ามีการบันทึกเสียง ระบบจะเรียกใช้การเรียกกลับทุกครั้งที่แอปเปลี่ยนสถานะระหว่างมองเห็นหรือไม่มองเห็นภายในการบันทึกหน้าจอ แอปคือ ถือว่ามองเห็นได้หากกิจกรรมที่เป็นของ UID ของกระบวนการลงทะเบียนนั้น มีการบันทึก วิธีนี้ช่วยให้คุณแจ้งให้ผู้ใช้ทราบว่ามีการบันทึกเสียงอยู่ได้ หากแอปของคุณดําเนินการที่มีความละเอียดอ่อน

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

ความสามารถที่ขยายการให้บริการของ IntentFilter

Android 15 รองรับความละเอียดของ Intent ที่แม่นยำยิ่งขึ้นผ่าน UriRelativeFilterGroup ซึ่งมีชุดออบเจ็กต์ UriRelativeFilter ที่ประกอบขึ้นเป็นชุดกฎการจับคู่ Intent ที่ต้องปฏิบัติตามแต่ละส่วน เช่น พารามิเตอร์การค้นหา URL, ส่วนย่อยของ URL และกฎการบล็อกหรือการยกเว้น

คุณกำหนดกฎเหล่านี้ในไฟล์ XML AndroidManifest ได้ด้วยแท็ก <uri-relative-filter-group> ซึ่งอาจรวมแท็ก android:allow หรือไม่ก็ได้ แท็กเหล่านี้อาจมีแท็ก <data> ที่ใช้แอตทริบิวต์แท็กที่มีอยู่ รวมถึงแอตทริบิวต์ android:query และ android:fragment

ตัวอย่างไวยากรณ์ 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>

พื้นที่ส่วนตัว

พื้นที่ส่วนตัวสามารถปลดล็อกและล็อกเพื่อแสดงหรือซ่อน แอปที่มีความละเอียดอ่อนในอุปกรณ์

พื้นที่ส่วนตัวช่วยให้ผู้ใช้สร้างพื้นที่แยกต่างหากในอุปกรณ์ได้ ป้องกันแอปที่ละเอียดอ่อนให้พ้นจากสายตาที่คอยสอดแนม การตรวจสอบสิทธิ์ พื้นที่ส่วนตัวจะใช้โปรไฟล์ผู้ใช้แยกต่างหาก ผู้ใช้สามารถ เลือกใช้การล็อกอุปกรณ์หรือเครื่องมือล็อกแยกต่างหากสำหรับพื้นที่ส่วนตัว

แอปในพื้นที่ส่วนตัวจะปรากฏในคอนเทนเนอร์แยกต่างหากใน Launcher และ ซ่อนจากมุมมองล่าสุด การแจ้งเตือน การตั้งค่า และจากแอปอื่นๆ เมื่อพื้นที่ส่วนตัวล็อกอยู่ เนื้อหาที่ผู้ใช้สร้างขึ้นและดาวน์โหลด (เช่น สื่อหรือไฟล์) และบัญชีจะแยกจากกันระหว่างพื้นที่ส่วนตัวและ พื้นที่หลัก Sharesheet ของระบบและ สามารถใช้เครื่องมือเลือกรูปภาพเพื่อให้แอปเข้าถึงเนื้อหา ข้ามพื้นที่ทำงานเมื่อปลดล็อกพื้นที่ส่วนตัวแล้ว

ผู้ใช้จะย้ายแอปที่มีอยู่และข้อมูลของแอปไปยังพื้นที่ส่วนตัวไม่ได้ แต่ ผู้ใช้เลือกตัวเลือกการติดตั้งในพื้นที่ส่วนตัวเพื่อติดตั้งแอปโดยใช้ ร้านแอปใดก็ได้ที่พวกเขาชื่นชอบ แอปในพื้นที่ส่วนตัวจะได้รับการติดตั้งเป็น แยกจากแอปใดก็ได้ในพื้นที่หลัก (สำเนาใหม่ของแอปเดียวกัน)

เมื่อผู้ใช้ล็อกพื้นที่ส่วนตัว โปรไฟล์จะหยุดลง ขณะที่โปรไฟล์ หยุดทำงาน แอปในพื้นที่ส่วนตัวจะไม่ทำงานอีกต่อไปและไม่สามารถทำงานได้ กิจกรรมเบื้องหน้าหรือเบื้องหลัง ซึ่งรวมถึงการแสดงการแจ้งเตือน

เราขอแนะนำให้คุณทดสอบแอปกับพื้นที่ส่วนตัวเพื่อให้แอป ทำงานได้ตามที่คาดไว้ โดยเฉพาะเมื่อแอปของคุณจัดอยู่ในประเภทใดประเภทหนึ่งต่อไปนี้ หมวดหมู่:

ค้นหาการเลือกล่าสุดของผู้ใช้สำหรับการเข้าถึงรูปภาพที่เลือก

ตอนนี้แอปจะไฮไลต์ได้เฉพาะรูปภาพและวิดีโอที่เลือกล่าสุดเท่านั้นเมื่อได้รับสิทธิ์การเข้าถึงบางส่วนในสื่อ ฟีเจอร์นี้จะช่วยปรับปรุงประสบการณ์ของผู้ใช้สำหรับแอปที่ขอสิทธิ์เข้าถึงรูปภาพและวิดีโอบ่อยครั้ง หากต้องการใช้ฟีเจอร์นี้ในแอป ให้เปิดใช้อาร์กิวเมนต์ QUERY_ARG_LATEST_SELECTION_ONLY เมื่อค้นหา MediaStore ผ่าน 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)
});

Privacy Sandbox ใน 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 ผสานรวมส่วนขยายล่าสุดเกี่ยวกับ Health Connect โดย Android ซึ่งเป็นแพลตฟอร์มที่ปลอดภัยและเป็นศูนย์กลางสำหรับจัดการและแชร์ข้อมูลสุขภาพและการออกกำลังกายที่แอปรวบรวม การอัปเดตนี้ เพิ่มการรองรับประเภทข้อมูลเพิ่มเติมในฟิตเนส ข้อมูลโภชนาการ อุณหภูมิผิวหนัง แผนการออกกำลังกาย และอื่นๆ

การติดตามอุณหภูมิผิวหนังช่วยให้ผู้ใช้จัดเก็บและแชร์ได้แม่นยำยิ่งขึ้น ข้อมูลอุณหภูมิจากอุปกรณ์ที่สวมใส่ได้หรืออุปกรณ์ติดตามอื่นๆ

แผนการออกกำลังกายคือแผนการออกกำลังกายที่มีโครงสร้างเพื่อช่วยให้ผู้ใช้ออกกำลังกายได้เต็มที่ เป้าหมาย การรองรับแผนการฝึกอบรมจะรวมถึงการสำเร็จหลักสูตรและประสิทธิภาพที่หลากหลาย เป้าหมาย:

ดูข้อมูลเพิ่มเติมเกี่ยวกับการอัปเดตล่าสุดของ Health Connect ใน Android ใน การสร้างประสบการณ์การใช้งานแบบปรับเปลี่ยนได้ด้วย Android การพูดคุยด้านสุขภาพจาก Google I/O

การแชร์หน้าจอแอป

Android 15 รองรับการแชร์หน้าจอแอปเพื่อให้ผู้ใช้แชร์หรือบันทึกเฉพาะหน้าต่างแอปแทนทั้งหน้าจอของอุปกรณ์ได้ ฟีเจอร์นี้เปิดใช้ใน Android 14 QPR2 เป็นครั้งแรก โดยมีMediaProjectionการเรียกกลับที่ช่วยให้แอปของคุณปรับแต่งประสบการณ์การแชร์หน้าจอของแอปได้ โปรดทราบว่าแอปที่กําหนดเป้าหมายเป็น Android 14 (API ระดับ 34) ขึ้นไปต้องได้รับความยินยอมจากผู้ใช้สําหรับเซสชันการจับภาพ MediaProjection แต่ละเซสชัน

ประสบการณ์ของผู้ใช้และ UI ของระบบ

Android 15 ช่วยให้นักพัฒนาแอปและผู้ใช้ควบคุมและปรับเปลี่ยนการกำหนดค่าอุปกรณ์ให้เหมาะกับความต้องการของตนได้มากขึ้น

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้การปรับปรุงล่าสุดใน Android 15 เพื่อปรับปรุงประสบการณ์ของผู้ใช้แอปได้จากวิดีโอการบรรยายเรื่องปรับปรุงประสบการณ์ของผู้ใช้แอป Android จาก Google I/O

ตัวอย่างวิดเจ็ตที่สมบูรณ์ยิ่งขึ้นด้วย Generated Previews API

ก่อน Android 15 วิธีเดียวในการแสดงตัวอย่างเครื่องมือเลือกวิดเจ็ตคือต้องระบุทรัพยากรรูปภาพหรือเลย์เอาต์แบบคงที่ ตัวอย่างเหล่านี้มักจะแตกต่างจากลักษณะของวิดเจ็ตจริงเมื่อวางไว้ในหน้าจอหลักอย่างมาก นอกจากนี้ ทรัพยากรแบบคงที่ไม่อาจสร้างได้ด้วย Jetpack Glance ดังนั้นข้อมูลโดยย่อ นักพัฒนาซอฟต์แวร์ต้องจับภาพหน้าจอวิดเจ็ตของตน หรือสร้างเค้าโครง XML เพื่อให้ ตัวอย่างวิดเจ็ต

Android 15 เพิ่มการรองรับตัวอย่างที่สร้างขึ้น ซึ่งหมายความว่าผู้ให้บริการวิดเจ็ตแอปสามารถสร้าง RemoteViews เพื่อใช้เป็นตัวอย่างเครื่องมือเลือกแทนทรัพยากรแบบคงที่

แอปสามารถแสดงมุมมองจากระยะไกลต่อเครื่องมือเลือกวิดเจ็ต เพื่อให้เครื่องมือเลือกอัปเดตเนื้อหาในเครื่องมือเลือกให้แสดงสิ่งที่ผู้ใช้จะเห็นได้มากขึ้น

Push API

แอปสามารถแสดงตัวอย่างที่สร้างขึ้นผ่าน Push API แอปช่วยคุณได้ แสดงตัวอย่างได้ทุกเมื่อในวงจร และไม่ได้รับคำขอที่ชัดแจ้ง จากโฮสต์เพื่อแสดงตัวอย่าง ระบบจะเก็บตัวอย่างเพลงไว้ใน AppWidgetService และผู้จัดการประชุมจะขอตัวอย่างเพลงได้แบบออนดีมานด์ ตัวอย่างต่อไปนี้จะโหลดทรัพยากรเลย์เอาต์วิดเจ็ต XML และตั้งค่าเป็นตัวอย่าง

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

ขั้นตอนที่คาดไว้มีดังนี้

  1. ผู้ให้บริการวิดเจ็ตเรียก setWidgetPreview ได้ทุกเมื่อ ระบบจะเก็บตัวอย่างเพลงที่ระบุไว้ใน AppWidgetService ไว้พร้อมกับข้อมูลอื่นๆ ของผู้ให้บริการ
  2. setWidgetPreview จะแจ้งโฮสต์เกี่ยวกับตัวอย่างที่อัปเดตแล้วผ่าน การติดต่อกลับของ AppWidgetHost.onProvidersChanged ในการตอบสนอง วิดเจ็ต โฮสต์จะโหลดข้อมูลผู้ให้บริการทั้งหมดซ้ำ
  3. เมื่อแสดงตัวอย่างวิดเจ็ต โฮสต์จะตรวจสอบ AppWidgetProviderInfo.generatedPreviewCategories และหากเลือก มีหมวดหมู่ ติดต่อ AppWidgetManager.getWidgetPreview ไปยัง ให้แสดงตัวอย่างที่บันทึกไว้สำหรับผู้ให้บริการรายนี้

กรณีที่ควรโทรหา setWidgetPreview

เนื่องจากไม่มีคอลแบ็กให้แสดงตัวอย่าง แอปจึงเลือกส่งตัวอย่างได้ทุกเมื่อขณะที่ทำงานอยู่ ความถี่ในการอัปเดตตัวอย่างจะขึ้นอยู่กับกรณีการใช้งานวิดเจ็ต

รายการต่อไปนี้อธิบายกรณีการใช้งานตัวอย่างเพลงหลัก 2 หมวดหมู่

  • ผู้ให้บริการที่แสดงข้อมูลจริงในตัวอย่างวิดเจ็ต เช่น หรือข้อมูลล่าสุด ผู้ให้บริการเหล่านี้สามารถตั้งค่าตัวอย่างเพลงได้เมื่อผู้ใช้ลงชื่อเข้าใช้หรือทำการกําหนดค่าเริ่มต้นในแอปแล้ว หลังจากนั้น ผู้ให้บริการจะตั้งค่างานเป็นระยะเพื่ออัปเดตตัวอย่างเพลงตามช่วงเวลาที่เลือกได้ ตัวอย่างของวิดเจ็ตประเภทนี้อาจเป็นรูปภาพ ปฏิทิน สภาพอากาศ หรือข่าว วิดเจ็ต
  • ผู้ให้บริการที่แสดงข้อมูลแบบคงที่ในตัวอย่างหรือวิดเจ็ตการดำเนินการด่วนซึ่งไม่แสดงข้อมูลใดๆ ผู้ให้บริการเหล่านี้สามารถ ตั้งค่าการแสดงตัวอย่างได้ 1 ครั้งเมื่อ เปิดแอปครั้งแรก ตัวอย่างของวิดเจ็ตประเภทนี้ ได้แก่ ไดรฟ์ไวท์ วิดเจ็ตการดำเนินการ หรือวิดเจ็ตทางลัดของ Chrome

ผู้ให้บริการบางรายอาจแสดงตัวอย่างแบบคงที่ในเครื่องมือเลือกโหมดฮับ แต่แสดงจริง ในเครื่องมือเลือกหน้าจอหลัก ผู้ให้บริการเหล่านี้ควรปฏิบัติตามคำแนะนำ สำหรับกรณีการใช้งานทั้ง 2 อย่างนี้ในการตั้งค่าตัวอย่าง

การแสดงภาพซ้อนภาพ

Android 15 เปิดตัวการเปลี่ยนแปลงในฟีเจอร์การแสดงภาพซ้อนภาพ (PIP) เพื่อให้การเปลี่ยนผ่านเป็นไปอย่างราบรื่นยิ่งขึ้นเมื่อเข้าสู่โหมด PIP ซึ่งจะเป็นประโยชน์ต่อแอปที่มีองค์ประกอบ UI ซ้อนทับบน UI หลัก ซึ่งจะอยู่ในรูปแบบ PIP

นักพัฒนาแอปใช้การเรียกกลับ onPictureInPictureModeChanged เพื่อกำหนดตรรกะในการสลับการแสดงผลขององค์ประกอบ UI ที่วางซ้อน Callback นี้จะทริกเกอร์เมื่อภาพเคลื่อนไหวของ PiP เข้าหรือออกเสร็จสมบูรณ์ ตั้งแต่ Android 15 เป็นต้นไป คลาส PictureInPictureUiState จะมีสถานะอื่น

เมื่อใช้สถานะ UI นี้ แอปที่กำหนดเป้าหมายเป็น Android 15 (API ระดับ 35) จะสังเกตเห็นว่ามีการเรียกใช้การเรียกกลับ Activity#onPictureInPictureUiStateChanged ด้วย isTransitioningToPip() ทันทีที่ภาพ PiP เริ่มแสดงภาพเคลื่อนไหว มีองค์ประกอบ UI จำนวนมากที่ไม่เกี่ยวข้องกับแอปเมื่ออยู่ในโหมด PIP เช่น มุมมองหรือเลย์เอาต์ที่มีข้อมูลอย่างเช่นคำแนะนำ วิดีโอที่กำลังจะเผยแพร่ การจัดประเภท และชื่อ เมื่อแอปไปยังโหมด PIP ให้ใช้ Callback onPictureInPictureUiStateChanged เพื่อซ่อนองค์ประกอบ UI เหล่านี้ เมื่อแอปเปลี่ยนไปใช้โหมดเต็มหน้าจอจากหน้าต่าง PiP ให้ใช้การเรียกกลับ onPictureInPictureModeChanged เพื่อเลิกซ่อนองค์ประกอบเหล่านี้ ดังที่แสดงในตัวอย่างต่อไปนี้

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

การเปิด/ปิดการแสดงผลองค์ประกอบ UI ที่ไม่เกี่ยวข้องอย่างรวดเร็ว (สำหรับหน้าต่าง PiP) นี้จะช่วยให้ภาพเคลื่อนไหวของ PiP ปรากฏขึ้นอย่างราบรื่นและไม่มีภาพกะพริบ

กฎโหมดห้ามรบกวนที่ได้รับการปรับปรุง

AutomaticZenRule อนุญาตให้แอปปรับแต่งความสนใจได้ การจัดการกฎ (ห้ามรบกวน) และเลือกว่าจะเปิดหรือปิดใช้งานเมื่อใด ให้พวกเขา Android 15 ช่วยเพิ่มประสิทธิภาพให้กฎเหล่านี้อย่างมาก โดยมีเป้าหมายเพื่อปรับปรุง ประสบการณ์ของผู้ใช้ การปรับปรุงเหล่านี้มีดังนี้

  • กำลังเพิ่มประเภทลงใน AutomaticZenRule เพื่อให้ระบบใช้แบบพิเศษได้ กับกฎบางอย่าง
  • การเพิ่มไอคอนลงใน AutomaticZenRule ช่วยให้โหมดต่างๆ เป็นที่รู้จักมากขึ้น
  • การเพิ่มสตริง triggerDescription ใน AutomaticZenRule ที่อธิบาย เงื่อนไขที่กฎควรทำงานสำหรับผู้ใช้
  • เพิ่มเมื่อ ZenDeviceEffects เป็น AutomaticZenRule เพื่อให้กฎเรียกใช้สิ่งต่างๆ เช่น โทนสีเทา จอแสดงผล โหมดกลางคืน หรือการหรี่แสงวอลเปเปอร์

ตั้งค่า VibrationEffect สำหรับช่องทางการแจ้งเตือน

Android 15 รองรับการตั้งค่าการสั่นแบบริชมีเดียสำหรับการแจ้งเตือนขาเข้าตามแชแนลโดยใช้ NotificationChannel.setVibrationEffect เพื่อให้ผู้ใช้แยกแยะการแจ้งเตือนประเภทต่างๆ ได้โดยไม่ต้องมองที่อุปกรณ์

ชิปแถบสถานะการฉายภาพสื่อและการหยุดอัตโนมัติ

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.

หน้าจอขนาดใหญ่และรูปแบบของอุปกรณ์

Android 15 รองรับแอปของคุณเพื่อให้ได้รับประโยชน์สูงสุดจากรูปแบบของ Android ซึ่งรวมถึงหน้าจอขนาดใหญ่ อุปกรณ์แบบพลิก และอุปกรณ์แบบพับได้

การทํางานหลายอย่างพร้อมกันบนหน้าจอขนาดใหญ่ที่ปรับปรุงใหม่

Android 15 ช่วยให้ผู้ใช้ทำงานหลายอย่างพร้อมกันในอุปกรณ์หน้าจอขนาดใหญ่ได้ดียิ่งขึ้น สำหรับ เช่น ผู้ใช้สามารถบันทึกชุดแอปที่ใช้ร่วมกันที่ชอบเพื่อใช้โหมดแยกหน้าจอได้อย่างรวดเร็ว เข้าถึงและปักหมุดแถบงานบนหน้าจอเพื่อสลับไปมาระหว่างแอปต่างๆ ได้อย่างรวดเร็ว ซึ่งหมายความว่า การทำให้แอปของคุณปรับเปลี่ยนได้นั้นสำคัญกว่าที่เคย

Google I/O มีเซสชันเกี่ยวกับการสร้าง Android แบบปรับอัตโนมัติ แอปและการสร้าง UI ด้วย Material 3 ไลบรารีแบบปรับอัตโนมัติ ที่ช่วยได้ และเอกสารของเรายังมีสิ่งอื่นๆ ที่ช่วยคุณออกแบบ

การรองรับหน้าจอปก

Your app can declare a property that Android 15 uses to allow your Application or Activity to be presented on the small cover screens of supported flippable devices. These screens are too small to be considered as compatible targets for Android apps to run on, but your app can opt in to supporting them, making your app available in more places.

การเชื่อมต่อ

Android 15 อัปเดตแพลตฟอร์มเพื่อให้แอปของคุณเข้าถึงเทคโนโลยีการสื่อสารและไร้สายที่ทันสมัยที่สุด

การสนับสนุนผ่านดาวเทียม

Android 15 ยังคงขยายการรองรับแพลตฟอร์มสำหรับการเชื่อมต่อผ่านดาวเทียมต่อไป และ มีองค์ประกอบ UI บางอย่างเพื่อให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์ที่สอดคล้องกันทั่วทั้ง การเชื่อมต่อผ่านดาวเทียม

แอปสามารถใช้ ServiceState.isUsingNonTerrestrialNetwork() เพื่อ ตรวจจับเมื่ออุปกรณ์เชื่อมต่อกับดาวเทียม ทำให้อุปกรณ์รับรู้ถึง สาเหตุที่บริการเครือข่ายเต็มรูปแบบอาจใช้ไม่ได้ นอกจากนี้ Android 15 ยังรองรับแอป SMS และ MMS รวมถึงแอป RCS ที่โหลดไว้ล่วงหน้าเพื่อใช้การเชื่อมต่อผ่านดาวเทียมสำหรับส่งและรับข้อความ

การแจ้งเตือนจะปรากฏขึ้นเมื่ออุปกรณ์เชื่อมต่อกับดาวเทียม

ประสบการณ์การใช้งาน NFC ที่ราบรื่นยิ่งขึ้น

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

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

บทบาทใน 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.

ความปลอดภัย

Android 15 ช่วยเพิ่มความปลอดภัยของแอป ปกป้องข้อมูลของแอป และช่วยให้ผู้ใช้ได้รับความโปร่งใสและควบคุมข้อมูลของตนเองได้มากขึ้น ดูการบรรยายเรื่องการปกป้องผู้ใช้จาก Google I/O เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เราทําเพื่อปรับปรุงมาตรการป้องกันผู้ใช้และปกป้องแอปของคุณจากภัยคุกคามใหม่ๆ

ผสานรวมเครื่องมือจัดการข้อมูลเข้าสู่ระบบกับการป้อนข้อความอัตโนมัติ

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.

ผสานรวมการลงชื่อสมัครใช้และการลงชื่อเข้าใช้ด้วยการแตะเพียงครั้งเดียวกับข้อความแจ้งข้อมูลไบโอเมตริก

เครื่องมือจัดการข้อมูลเข้าสู่ระบบผสานรวมพรอมต์ข้อมูลไบโอเมตริกเข้ากับการสร้างข้อมูลเข้าสู่ระบบ และลงชื่อเข้าใช้ ทำให้ผู้ให้บริการไม่ต้องจัดการ พรอมต์ข้อมูลไบโอเมตริก ด้วยเหตุนี้ ผู้ให้บริการข้อมูลเข้าสู่ระบบจึงต้องมุ่งเน้นที่ ผลลัพธ์ของการสร้างและรับโฟลว์ ซึ่งเสริมด้วยผลลัพธ์โฟลว์ข้อมูลไบโอเมตริก กระบวนการที่ง่ายขึ้นนี้จะช่วยให้การสร้างและการเรียกข้อมูลเข้าสู่ระบบมีประสิทธิภาพและสะดวกยิ่งขึ้น

การจัดการคีย์สําหรับการเข้ารหัสจากต้นทางถึงปลายทาง

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

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

การตรวจสอบสิทธิ์ใน URI ของเนื้อหา

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

การช่วยเหลือพิเศษ

Android 15 เพิ่มฟีเจอร์ที่ปรับปรุงการช่วยเหลือพิเศษสำหรับผู้ใช้

Better Braille

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

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

การทำให้เป็นสากล

Android 15 เพิ่มฟีเจอร์และความสามารถที่เสริมประสบการณ์ของผู้ใช้เมื่อใช้อุปกรณ์ในภาษาต่างๆ

แบบอักษร CJK ที่ปรับแต่งได้

Starting with Android 15, the font file for Chinese, Japanese, and Korean (CJK) languages, NotoSansCJK, is now a variable font. Variable fonts open up possibilities for creative typography in CJK languages. Designers can explore a broader range of styles and create visually striking layouts that were previously difficult or impossible to achieve.

How the variable font for Chinese, Japanese, and Korean (CJK) languages appears with different font widths.

การยกตัวอักขระ

ใน Android 15 เป็นต้นไป คุณสามารถปรับข้อความให้ชิดขอบโดยใช้ระยะห่างของตัวอักษรได้โดย ด้วย JUSTIFICATION_MODE_INTER_CHARACTER การให้เหตุผลระหว่างคำเดิมคือ เปิดตัวครั้งแรกใน Android 8.0 (API ระดับ 26) และระหว่างอักขระ เหตุผลรองรับมีความสามารถที่คล้ายกันสำหรับภาษาที่ใช้ อักขระช่องว่างในการแบ่งกลุ่ม เช่น ภาษาจีน ภาษาญี่ปุ่น และอื่นๆ

เลย์เอาต์สำหรับข้อความภาษาญี่ปุ่นโดยใช้ JUSTIFICATION_MODE_NONE
เลย์เอาต์ข้อความภาษาอังกฤษโดยใช้ JUSTIFICATION_MODE_NONE


เลย์เอาต์ข้อความภาษาญี่ปุ่นโดยใช้ JUSTIFICATION_MODE_INTER_WORD
เลย์เอาต์ข้อความภาษาอังกฤษโดยใช้ JUSTIFICATION_MODE_INTER_WORD


เลย์เอาต์สำหรับข้อความภาษาญี่ปุ่นโดยใช้ JUSTIFICATION_MODE_INTER_CHARACTER
เลย์เอาต์สำหรับข้อความภาษาอังกฤษโดยใช้ JUSTIFICATION_MODE_INTER_CHARACTER

การกำหนดค่าตัวแบ่งบรรทัดอัตโนมัติ

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.

แบบอักษรภาษาญี่ปุ่นแบบเฮนไตกานะเพิ่มเติม

ใน Android 15 ไฟล์แบบอักษรของฮิรางานะญี่ปุ่นรุ่นเก่า (หรือที่เรียกว่า Hentaigana) จะได้รับการรวมกลุ่มไว้โดยค่าเริ่มต้น รูปทรงที่เป็นเอกลักษณ์ของตัวละคร Hentaigana สามารถเพิ่ม สำนวนของงานศิลปะหรือการออกแบบที่โดดเด่น ในขณะเดียวกันก็ช่วยให้คงความถูกต้องแม่นยำ การถ่ายทอดและความเข้าใจเกี่ยวกับเอกสารโบราณของญี่ปุ่น

อักขระและรูปแบบข้อความสำหรับเฮนไตงานาภาษาญี่ปุ่น แบบอักษร

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

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

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