Ringkasan Fitur dan API

Android 15 memperkenalkan fitur dan API baru yang hebat untuk para developer. Bagian berikut meringkas fitur-fitur ini untuk membantu Anda mulai menggunakan API terkait.

Untuk mengetahui daftar mendetail tentang API yang baru, diubah, dan dihapus, baca laporan perbedaan API. Untuk mengetahui detail tentang API baru, buka referensi API Android — API baru ditandai agar lebih mudah dilihat. Selain itu, untuk mempelajari area mana saja dalam aplikasi perubahan platform yang mungkin memengaruhi aplikasi Anda, pastikan untuk meninjau perubahan perilaku yang memengaruhi aplikasi saat menargetkan Android 15 dan perubahan perilaku yang memengaruhi semua aplikasi terlepas dari targetSdkVersion.

Kamera dan media

Android 15 menyertakan berbagai fitur yang meningkatkan pengalaman kamera dan media, serta memberi Anda akses ke alat dan hardware untuk mendukung kreator dalam mewujudkan visi mereka di Android.

Untuk informasi selengkapnya tentang fitur dan solusi developer terbaru untuk media dan kamera Android, lihat diskusi Membangun pengalaman media dan kamera Android modern dari Google I/O.

Booster Cahaya Rendah

Android 15 引入了低光增强,这是一种新的自动曝光模式,可供 Camera 2夜间模式相机扩展使用。“低光增强”功能可调整预览视频流在弱光条件下的曝光量。这与夜间模式相机扩展程序创建静态图片的方式不同,因为夜间模式会组合多张照片来制作单张增强图片。虽然夜间模式非常适合创建静态图片,但无法创建连续的帧流,但“低光增强”可以。因此,“低光增强”可以实现新的相机功能,例如:

  • 提供增强的图片预览,以便用户更好地为弱光环境取景
  • 在光线昏暗的环境下扫描二维码

如果您启用“弱光增强”,它会在光线较暗时自动开启,在光线较暗时关闭。

应用可以在光线昏暗的环境下录制预览流,以保存明亮的视频。

有关详情,请参阅弱光增强

Kontrol kamera dalam aplikasi

Android 15 添加了一个新扩展,用于在支持的设备上更好地控制相机硬件及其算法:

  • 高级闪光灯强度调整,可让您在拍摄照片时精确控制 SINGLETORCH 模式下的闪光强度。

Kontrol headroom HDR

Android 15 memilih headroom HDR yang sesuai untuk kemampuan perangkat dasar dan kedalaman bit panel. Untuk halaman yang memiliki banyak konten SDR, seperti aplikasi pesan yang menampilkan satu thumbnail HDR, perilaku ini dapat berpengaruh buruk pada kecerahan konten SDR yang dirasakan. Android 15 memungkinkan Anda mengontrol headroom HDR dengan setDesiredHdrHeadroom untuk mencapai keseimbangan antara konten SDR dan HDR.

Kecerahan elemen UI SDR di layar kiri tampak lebih seragam daripada kecerahan di layar kanan, yang menyimulasikan kemungkinan masalah headroom saat konten HDR dan SDR digabungkan. Dengan menyesuaikan headroom HDR, Anda dapat mencapai keseimbangan yang lebih baik antara konten SDR dan HDR.

Kontrol kenyaringan

Android 15 引入了对 CTA-2075 音量标准的支持,以帮助您避免音频音量不一致,并确保用户在切换内容时无需不断调整音量。系统利用输出设备(耳机和扬声器)的已知特征以及 AAC 音频内容中提供的音量元数据来智能地调整音频音量和动态范围压缩级别。

如需启用此功能,您需要确保 AAC 内容中有音量元数据,并在您的应用中启用平台功能。为此,您可以使用关联的 AudioTrack 中的音频会话 ID 调用其 create 工厂方法,从而实例化此对象;此方法会自动开始应用音频更新。LoudnessCodecController您可以传递 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 也将更新,以使用 LoudnessCodecController API 实现无缝应用集成。

Perangkat MIDI 2.0 virtual

Android 13 menambahkan dukungan untuk menghubungkan ke perangkat MIDI 2.0 menggunakan USB, yang berkomunikasi menggunakan Universal MIDI Packets (UMP). Android 15 memperluas dukungan UMP ke aplikasi MIDI virtual, sehingga aplikasi komposisi dapat mengontrol aplikasi synthesizer sebagai perangkat MIDI 2.0 virtual seperti yang dilakukan dengan perangkat USB MIDI 2.0.

Dekode software AV1 yang lebih efisien

Logo dav1d

dav1d, dekoder software AV1 yang populer dari VideoLAN kini tersedia untuk perangkat Android yang tidak mendukung dekode AV1 di hardware. dav1d berperforma hingga 3x lebih banyak dibandingkan dekoder software AV1 lama, sehingga memungkinkan pemutaran HD AV1 bagi lebih banyak pengguna, termasuk beberapa perangkat tingkat rendah dan menengah.

Untuk saat ini, aplikasi Anda harus memilih untuk menggunakan dav1d dengan memanggilnya berdasarkan nama "c2.android.av1-dav1d.decoder". dav1d akan dijadikan sebagai dekoder software AV1 default dalam update berikutnya. Dukungan ini distandardisasi dan di-backport ke perangkat Android 11 yang menerima update sistem Google Play.

Alat dan produktivitas developer

Meskipun sebagian besar upaya kami untuk meningkatkan produktivitas Anda berpusat pada alat seperti Android Studio, Jetpack Compose, dan library Android Jetpack, kami selalu mencari cara di platform ini untuk membantu Anda mewujudkan visi dengan lebih mudah.

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

Peningkatan PDF

Android 15 menyertakan peningkatan substansial pada PdfRenderer API. Aplikasi dapat menyertakan fitur lanjutan seperti rendering file yang dilindungi sandi, anotasi, pengeditan formulir, penelusuran, dan pemilihan dengan salinan. Pengoptimalan PDF terlinier didukung untuk mempercepat tampilan PDF lokal dan mengurangi penggunaan resource.

Update terbaru untuk rendering PDF mencakup fitur seperti penelusuran file PDF tersemat.

PdfRenderer telah dipindahkan ke modul yang dapat diupdate menggunakan update sistem Google Play terlepas dari rilis platformnya, dan kami mendukung perubahan ini kembali ke Android 11 (level API 30) dengan membuat platform API pra-Android 15 yang kompatibel, yang disebut PdfRendererPreV.

Kami menghargai masukan Anda tentang peningkatan yang telah kami lakukan pada platform API PdfRenderer, dan kami berencana untuk mempermudah penggabungan API ini ke dalam aplikasi Anda dengan library Android Jetpack mendatang.

Peningkatan kualitas pengalihan bahasa otomatis

Android 14 增加了设备端音频中的多语言识别功能,可在语言之间自动切换,但这可能会导致单词丢失,尤其是在语言切换时,两种话语之间的停顿较少时。Android 15 添加了额外的控件,可帮助应用根据其用例调整此切换。EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS 会将自动切换限制为仅在音频会话开始时进行,而 EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES 则会在指定次数的切换后停用语言切换。如果您希望自动检测到会话期间只讲一种语言,这些选项特别有用。

Peningkatan API Font Variabel OpenType

Android 15 meningkatkan kegunaan font variabel OpenType. Sekarang Anda dapat membuat instance FontFamily dari font variabel tanpa menentukan sumbu bobot dengan buildVariableFamily API. Perender teks mengganti nilai sumbu wght agar cocok dengan teks yang ditampilkan.

Dengan menggunakan API baru, hal ini sangat menyederhanakan kode untuk membuat 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();

Sebelumnya, untuk membuat Typeface yang sama, Anda memerlukan lebih banyak kode:

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

Berikut adalah contoh cara Typeface yang dibuat dengan rendering API lama dan baru:

Contoh perbedaan rendering Typeface saat menggunakan API
baru dan lama

Dalam contoh ini, Typeface yang dibuat dengan API lama tidak memiliki kemampuan membuat ketebalan font yang akurat untuk instance Font 350, 450, 550, dan 650, sehingga perender akan kembali ke bobot terdekat. Jadi, dalam kasus ini, 300 dirender, bukan 350, 400 dirender, bukan 450, dan seterusnya. Sebaliknya, Typeface yang dibuat dengan API baru secara dinamis membuat instance Font untuk bobot tertentu, sehingga bobot yang akurat juga dirender untuk 350, 450, 550, dan 650.

Kontrol pemisah baris terperinci

从 Android 15 开始,TextView 和底层换行符可以将文本的给定部分保留在同一行中,以提高可读性。您可以通过在字符串资源或 createNoBreakSpan 中使用 <nobreak> 标记来利用此换行符自定义功能。同样,您可以使用 <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> 标记封装。

Pengarsipan aplikasi

Android dan Google Play mengumumkan dukungan untuk pengarsipan aplikasi tahun lalu, yang memungkinkan pengguna mengosongkan ruang dengan menghapus sebagian aplikasi yang jarang digunakan dari perangkat yang dipublikasikan menggunakan Android App Bundle di Google Play. Android 15 kini menyertakan dukungan tingkat OS untuk pengarsipan dan pembatalan pengarsipan aplikasi sehingga memudahkan semua app store menerapkannya.

Aplikasi dengan izin REQUEST_DELETE_PACKAGES dapat memanggil metode PackageInstaller requestArchive untuk meminta pengarsipan paket aplikasi terinstal, yang menghapus APK dan file apa pun yang di-cache, tetapi mempertahankan data pengguna. Aplikasi yang diarsipkan ditampilkan sebagai aplikasi yang dapat ditampilkan melalui LauncherApps API; pengguna akan melihat perlakuan UI untuk menyoroti bahwa aplikasi tersebut telah diarsipkan. Jika pengguna mengetuk aplikasi yang diarsipkan, penginstal yang bertanggung jawab akan mendapatkan permintaan untuk membatalkan pengarsipan aplikasi tersebut, dan proses pemulihan dapat dipantau oleh siaran ACTION_PACKAGE_ADDED.

Grafis

Android 15 menghadirkan peningkatan grafis terbaru, termasuk ANGLE dan tambahan pada sistem grafis Canvas.

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

Peningkatan untuk Canvas

Android 15 继续对 Android 的 Canvas 图形系统进行现代化改造,并增添了新功能:

  • Matrix44 提供了一个用于转换坐标的 4x4 矩阵,当您想要处理 3D 画布时,应使用此矩阵。
  • clipShader 将当前裁剪与指定着色器相交,而 clipOutShader 会将裁剪设置为当前裁剪和着色器的差异,其中各自将着色器视为 Alpha 蒙版。这有助于高效绘制复杂形状。

Performa dan baterai

Android akan melanjutkan fokusnya untuk membantu Anda meningkatkan performa dan kualitas aplikasi. Android 15 memperkenalkan API baru yang membantu membuat tugas di aplikasi Anda lebih efisien untuk dijalankan, mengoptimalkan performa aplikasi, dan mengumpulkan insight tentang aplikasi Anda.

Untuk praktik terbaik yang hemat baterai, men-debug penggunaan jaringan dan daya, serta detail tentang cara kami meningkatkan efisiensi baterai pekerjaan latar belakang di Android 15 dan versi terbaru Android, lihat diskusi Meningkatkan efisiensi baterai pekerjaan latar belakang di Android dari Google I/O.

API ApplicationStartInfo

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.

Detail informasi ukuran aplikasi

自 Android 8.0(API 级别 26)起,Android 就一直包含 StorageStats.getAppBytes API,该 API 将应用的安装大小汇总为一个字节,这些字节是 APK 大小、从 APK 中提取的文件的大小以及设备上生成的文件(例如预先 (AOT) 编译代码)的总和。就应用的存储空间使用情况而言,此数字并不富有见解。

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

Pembuatan profil yang dikelola aplikasi

Android 15 包含全新的 ProfilingManager 类,可让您从应用内收集性能分析信息。我们计划使用 Android Jetpack API 封装该类,这将简化性能分析请求的构建过程,但核心 API 将允许收集堆转储、堆配置文件、堆栈采样等信息。它使用提供的标记为您的应用提供回调,用于标识输出文件,该文件将传递到应用的文件目录。该 API 会限制速率限制,以最大限度地降低对性能的影响。

Peningkatan database SQLite

Android 15 memperkenalkan SQLite API baru yang mengekspos fitur lanjutan dari mesin SQLite dasar yang menargetkan masalah performa tertentu yang dapat terjadi dalam aplikasi.

Developer harus mempelajari praktik terbaik untuk performa SQLite guna memaksimalkan database SQLite, terutama saat bekerja dengan database besar atau saat menjalankan kueri yang sensitif terhadap latensi.

  • Transaksi yang ditangguhkan dalam mode hanya baca: saat mengeluarkan transaksi yang bersifat hanya baca (jangan sertakan pernyataan tulis), gunakan beginTransactionReadOnly() dan beginTransactionWithListenerReadOnly(SQLiteTransactionListener) untuk menerbitkan transaksi DEFERRED hanya baca. Transaksi tersebut dapat berjalan bersamaan satu sama lain, dan jika database berada dalam mode WAL, transaksi dapat berjalan bersamaan dengan transaksi IMMEDIATE atau EXCLUSIVE.
  • Jumlah baris dan ID: API baru ditambahkan untuk mengambil jumlah baris yang diubah atau ID baris yang terakhir disisipkan tanpa mengeluarkan kueri tambahan. getLastChangedRowCount() menampilkan jumlah baris yang disisipkan, diperbarui, atau dihapus oleh pernyataan SQL terbaru dalam transaksi saat ini, sedangkan getTotalChangedRowCount() menampilkan jumlah pada koneksi saat ini. getLastInsertRowId() menampilkan rowid dari baris terakhir yang akan disisipkan pada koneksi saat ini.
  • Pernyataan mentah: mengeluarkan pernyataan SQlite mentah, dengan mengabaikan wrapper kemudahan dan overhead pemrosesan tambahan yang mungkin dikenakannya.

Update Android Dynamic Performance Framework

Android 15 继续投资开发 Android 动态性能框架 (ADPF),这是一组 API,可让游戏和性能密集型应用更直接地与 Android 设备的电源和散热系统进行互动。在受支持的设备上,Android 15 将添加新的 ADPF 功能:

  • 适用于提示会话的节能模式,用于指明其关联的线程应该优先考虑节能而非性能,非常适合长时间运行的后台工作负载。
  • 可以在提示会话中报告 GPU 和 CPU 的运行时长,从而使系统能够同时调整 CPU 和 GPU 频率,以便更好地满足工作负载需求。
  • 热余量阈值,用于根据余量预测来解释可能的热节流状态。

如需详细了解如何在应用和游戏中使用 ADPF,请参阅相关文档

Privasi

Android 15 menyertakan berbagai fitur yang membantu developer aplikasi melindungi privasi pengguna.

Deteksi perekaman layar

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

Kemampuan IntentFilter yang diperluas

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

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

Here's an example of the AndroidManifest syntax:

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

Ruang privasi

The private space can be unlocked and locked to show or hide sensitive apps on a device.

Private space lets users create a separate space on their device where they can keep sensitive apps away from prying eyes, under an additional layer of authentication. The private space uses a separate user profile. The user can choose to use the device lock or a separate lock factor for the private space.

Apps in the private space show up in a separate container in the launcher, and are hidden from the recents view, notifications, settings, and from other apps when the private space is locked. User-generated and downloaded content (such as media or files) and accounts are separated between the private space and the main space. The system sharesheet and the photo picker can be used to give apps access to content across spaces when the private space is unlocked.

Users can't move existing apps and their data into the private space. Instead, users select an install option in the private space to install an app using whichever app store they prefer. Apps in the private space are installed as separate copies from any apps in the main space (new copies of the same app).

When a user locks the private space, the profile is stopped. While the profile is stopped, apps in the private space are no longer active and can't perform foreground or background activities, including showing notifications.

We recommend that you test your app with private space to make sure your app works as expected, especially if your app falls into one of the following categories:

Buat kueri pilihan pengguna terbaru untuk Akses Foto yang Dipilih

Sekarang, aplikasi dapat hanya menandai foto dan video yang baru dipilih saat akses sebagian ke izin media diberikan. Fitur ini dapat meningkatkan pengalaman pengguna untuk aplikasi yang sering meminta akses ke foto dan video. Untuk menggunakan fitur ini di aplikasi Anda, aktifkan argumen QUERY_ARG_LATEST_SELECTION_ONLY saat membuat kueri MediaStore melalui 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 di Android

Android 15 包含最新的 Android 广告服务扩展程序,以及最新版 Privacy Sandbox on Android。我们致力于开发新的技术,以便更好地保护用户隐私,并为移动应用打造有效的个性化广告体验。这项新功能是我们的工作的一部分。我们的隐私沙盒页面详细介绍了 Privacy Sandbox on Android 开发者预览版和 Beta 版计划,以帮助您开始使用。

Health Connect

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

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

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

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

Berbagi layar sebagian

Android 15 mendukung berbagi layar sebagian sehingga pengguna dapat membagikan atau merekam hanya jendela aplikasi, bukan seluruh layar perangkat. Fitur ini, pertama kali diaktifkan di Android 14 QPR2, mencakup callback MediaProjection yang memungkinkan aplikasi Anda menyesuaikan pengalaman berbagi layar sebagian. Perhatikan bahwa untuk aplikasi yang menargetkan Android 14 (level API 34) atau yang lebih tinggi, izin pengguna sekarang diperlukan untuk setiap sesi pengambilan MediaProjection.

Pengalaman pengguna dan UI sistem

Android 15 memberi developer aplikasi dan pengguna lebih banyak kontrol dan fleksibilitas untuk mengonfigurasi perangkat agar sesuai dengan kebutuhan mereka.

Untuk mempelajari lebih lanjut cara menggunakan peningkatan terbaru di Android 15 guna meningkatkan pengalaman pengguna aplikasi Anda, lihat artikel Meningkatkan pengalaman pengguna aplikasi Android dari Google I/O.

Pratinjau widget yang lebih beragam dengan Generated Previews API

Sebelum Android 15, satu-satunya cara untuk menyediakan pratinjau pemilih widget adalah dengan menentukan resource gambar atau tata letak statis. Pratinjau ini sering kali sangat berbeda dengan tampilan widget sebenarnya saat ditempatkan di layar utama. Selain itu, resource statis tidak dapat dibuat dengan Jetpack Glance, sehingga developer Sekilas harus mengambil screenshot widget mereka atau membuat tata letak XML agar dapat melakukan pratinjau widget.

Android 15 menambahkan dukungan untuk pratinjau yang dibuat. Hal ini berarti penyedia widget aplikasi dapat membuat RemoteViews untuk digunakan sebagai pratinjau alat pilih, bukan resource statis.

Aplikasi dapat memberikan Tampilan Jarak Jauh ke Alat Pilih Widget, sehingga dapat memperbarui konten pada alat pilih agar lebih mewakili tampilan yang akan dilihat pengguna.

API Push

Aplikasi dapat memberikan pratinjau yang dihasilkan melalui push API. Aplikasi dapat menyediakan pratinjau kapan saja dalam siklus prosesnya, dan tidak menerima permintaan eksplisit dari host untuk menyediakan pratinjau. Pratinjau disimpan di AppWidgetService, dan host dapat memintanya sesuai permintaan. Contoh berikut memuat resource tata letak widget XML dan menetapkannya sebagai pratinjau:

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

Alur yang diharapkan adalah:

  1. Kapan pun, penyedia widget akan memanggil setWidgetPreview. Pratinjau yang diberikan dipertahankan di AppWidgetService dengan info penyedia lainnya.
  2. setWidgetPreview memberi tahu host tentang pratinjau yang telah diperbarui melalui callback AppWidgetHost.onProvidersChanged. Sebagai respons, host widget memuat ulang semua informasi penyedianya.
  3. Saat menampilkan pratinjau widget, host akan memeriksa AppWidgetProviderInfo.generatedPreviewCategories, dan jika kategori yang dipilih tersedia, memanggil AppWidgetManager.getWidgetPreview untuk menampilkan pratinjau tersimpan untuk penyedia ini.

Waktu menelepon setWidgetPreview

Karena tidak ada callback untuk memberikan pratinjau, aplikasi dapat memilih untuk mengirim pratinjau kapan saja saat aplikasi berjalan. Frekuensi update pratinjau bergantung pada kasus penggunaan widget.

Daftar berikut menjelaskan dua kategori utama kasus penggunaan pratinjau:

  • Penyedia yang menampilkan data nyata dalam pratinjau widget mereka, seperti informasi yang dipersonalisasi atau informasi terbaru. Penyedia ini dapat menyetel pratinjau setelah pengguna login atau melakukan konfigurasi awal di aplikasinya. Setelah ini, mereka dapat menyiapkan tugas berkala untuk mengupdate pratinjau sesuai ritme yang mereka pilih. Contoh jenis widget ini dapat berupa foto, kalender, cuaca, atau widget berita.
  • Penyedia yang menampilkan informasi statis dalam pratinjau atau widget tindakan cepat yang tidak menampilkan data apa pun. Penyedia ini dapat menyetel pratinjau satu kali, saat aplikasi pertama kali diluncurkan. Contoh jenis widget ini mencakup widget tindakan cepat drive atau widget pintasan Chrome.

Beberapa penyedia mungkin menampilkan pratinjau statis pada alat pilih mode hub, tetapi informasi nyata pada alat pilih layar utama. Penyedia ini harus mengikuti panduan untuk kedua kasus penggunaan tersebut guna menetapkan pratinjau.

Picture-in-Picture

Android 15 memperkenalkan perubahan baru di Picture-in-Picture (PiP) yang memastikan transisi yang lebih lancar saat masuk ke mode PiP. Hal ini akan bermanfaat untuk aplikasi yang memiliki elemen UI yang ditempatkan di atas UI utamanya, yang masuk ke dalam PiP.

Developer menggunakan callback onPictureInPictureModeChanged untuk menentukan logika yang mengalihkan visibilitas elemen UI overlay. Callback ini dipicu saat animasi masuk atau keluar PiP selesai. Mulai Android 15, class PictureInPictureUiState menyertakan status baru.

Dengan status UI baru ini, aplikasi yang menargetkan Android 15 akan mengamati callback Activity#onPictureInPictureUiStateChanged yang dipanggil dengan isTransitioningToPip() segera setelah animasi PiP dimulai. Ada banyak elemen UI yang tidak relevan untuk aplikasi saat berada dalam mode PiP, misalnya tampilan atau tata letak yang menyertakan informasi seperti saran, video yang akan datang, rating, dan judul. Saat aplikasi beralih ke mode PiP, gunakan callback onPictureInPictureUiStateChanged untuk menyembunyikan elemen UI ini. Saat aplikasi beralih ke mode layar penuh dari jendela PiP, gunakan callback onPictureInPictureModeChanged untuk memperlihatkan elemen ini, seperti yang ditunjukkan dalam contoh berikut:

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

Tombol visibilitas cepat elemen UI yang tidak relevan ini (untuk jendela PiP) membantu memastikan animasi masuk PiP yang lebih halus dan bebas kedipan.

Peningkatan aturan Jangan Ganggu

AutomaticZenRule 可让应用自定义注意力管理(勿扰)规则,并决定何时启用或停用这些规则。Android 15 大幅增强了这些规则,以改善用户体验。其中包含以下增强功能:

  • 将类型添加到 AutomaticZenRule,允许系统对某些规则应用特殊处理。
  • AutomaticZenRule 添加了图标,有助于使模式更易于识别。
  • AutomaticZenRule 添加 triggerDescription 字符串,用于描述应在哪些条件下为用户启用规则。
  • AutomaticZenRule 添加了 ZenDeviceEffects,以允许规则触发灰度显示、夜间模式或调暗壁纸等功能。

Menyetel VibrationEffect untuk saluran notifikasi

Android 15 mendukung penyetelan getaran yang kuat untuk notifikasi masuk melalui saluran menggunakan NotificationChannel.setVibrationEffect sehingga pengguna dapat membedakan berbagai jenis notifikasi tanpa harus melihat perangkatnya.

Perangkat layar besar dan faktor bentuk

Android 15 memberi aplikasi Anda dukungan untuk mengoptimalkan faktor bentuk Android, termasuk perangkat layar besar, perangkat foldable, dan perangkat foldable.

Peningkatan multitasking layar besar

Android 15 gives users better ways to multitask on large screen devices. For example, users can save their favorite split-screen app combinations for quick access and pin the taskbar on screen to quickly switch between apps. This means that making sure your app is adaptive is more important than ever.

Google I/O has sessions on Building adaptive Android apps and Building UI with the Material 3 adaptive library that can help, and our documentation has more to help you Design for large screens.

Dukungan layar sampul

您的应用可以声明一项属性,Android 15 会使用该属性将您的 ApplicationActivity 呈现在支持的可翻转设备的小封面屏幕上。这些屏幕太小,无法被视为 Android 应用的兼容目标,但您的应用可以选择支持这些屏幕,从而让您的应用可在更多位置使用。

Konektivitas

Android 15 mengupdate platform untuk memberi aplikasi Anda akses ke kemajuan terbaru dalam teknologi komunikasi dan nirkabel.

Dukungan satelit

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.

Pengalaman NFC yang lebih lancar

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

Peran Wallet

Android 15 introduces a new 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 QuickAccess tile should go when activated. When the role is set to "None", the QuickAccess tile isn't available and payment category NFC taps are only delivered to the foreground app.

Keamanan

Android 15 membantu Anda meningkatkan keamanan aplikasi, melindungi data aplikasi, dan memberi pengguna transparansi dan kontrol yang lebih besar atas data mereka. Baca pembahasan Mengamankan keamanan pengguna di Android dari Google I/O untuk mengetahui lebih banyak hal yang kami lakukan untuk meningkatkan perlindungan pengguna dan melindungi aplikasi Anda dari ancaman baru.

Mengintegrasikan Pengelola Kredensial dengan isi otomatis

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.

Integrasikan pendaftaran dan login sekali ketuk dengan perintah biometrik

Credential Manager integrates biometric prompts into the credential creation and sign-in processes, eliminating the need for providers to manage biometric prompts. As a result, credential providers only need to focus on the results of the create and get flows, augmented with the biometric flow result. This simplified process creates a more efficient and streamlined credential creation and retrieval process.

Pengelolaan kunci untuk enkripsi end-to-end

Kami memperkenalkan E2eeContactKeysManager di Android 15, yang memfasilitasi enkripsi menyeluruh (E2EE) di aplikasi Android Anda dengan menyediakan API level OS untuk penyimpanan kunci publik kriptografis.

E2eeContactKeysManager dirancang untuk berintegrasi dengan aplikasi kontak platform guna memberi pengguna cara terpusat untuk mengelola dan memverifikasi kunci publik kontak mereka.

Pemeriksaan izin di URI konten

Android 15 引入了一组可对内容 URI 执行权限检查的新 API:

Aksesibilitas

Android 15 menambahkan fitur yang meningkatkan aksesibilitas bagi pengguna.

Braille yang Lebih Baik

Di Android 15, kami telah memungkinkan TalkBack mendukung layar Braille yang menggunakan standar HID melalui USB dan Bluetooth yang aman.

Standar ini, seperti yang digunakan oleh mouse dan keyboard, akan membantu Android mendukung lebih banyak layar Braille dari waktu ke waktu.

Internasionalisasi

Android 15 menambahkan fitur dan kemampuan yang melengkapi pengalaman pengguna saat perangkat digunakan dalam berbagai bahasa.

Font variabel CJK

从 Android 15 开始,中文、日语和韩语 (CJK) 语言的字体文件 NotoSansCJK 现已成为可变字体。可变字体为 CJK 语言的广告素材排版开辟了新的可能性。设计师可以探索更广泛的样式,并创建以前难以或无法实现的具有视觉冲击力的布局。

中文、日语和韩语 (CJK) 语言的可变字体在不同字体宽度下的显示效果。

Justifikasi antarkarakter

从 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 的英语文本布局。

Konfigurasi pemisah baris otomatis

Android mulai mendukung jeda baris berbasis frasa untuk bahasa Jepang dan Korea di Android 13 (API level 33). Meskipun jeda baris berbasis frasa meningkatkan keterbacaan baris teks pendek, jeda baris tidak berfungsi dengan baik untuk baris teks yang panjang. Di Android 15, aplikasi kini dapat menerapkan jeda baris berbasis frasa hanya untuk baris teks pendek, menggunakan opsi LINE_BREAK_WORD_STYLE_AUTO. Opsi ini memilih opsi gaya kata terbaik untuk teks.

Untuk baris teks pendek, jeda baris berbasis frasa akan digunakan, dan berfungsi sama seperti LINE_BREAK_WORD_STYLE_PHRASE, seperti ditunjukkan dalam gambar berikut:

Untuk baris teks pendek, LINE_BREAK_WORD_STYLE_AUTO menerapkan jeda baris berbasis frasa untuk meningkatkan keterbacaan teks. Ini sama dengan menerapkan LINE_BREAK_WORD_STYLE_PHRASE.

Untuk baris teks yang lebih panjang, LINE_BREAK_WORD_STYLE_AUTO menggunakan gaya kata tanpa jeda baris, yang berfungsi sama seperti LINE_BREAK_WORD_STYLE_NONE, seperti yang ditunjukkan pada gambar berikut:

Untuk baris teks yang panjang, LINE_BREAK_WORD_STYLE_AUTO tidak menerapkan gaya kata jeda baris untuk meningkatkan keterbacaan teks. Ini sama dengan menerapkan LINE_BREAK_WORD_STYLE_NONE.

Font Hentaigana Jepang Baru

在 Android 15 中,默认情况下捆绑了旧版日语平假名(称为 Hentaigana)的新字体文件。形态独特的 Hentaigana 角色可为艺术作品或设计增添独特的风格,同时有助于准确传达和理解古代日本文献。

日语 Hentaigana 字体的字符和文字样式。

VideoLAN 锥形版权所有 (c) 1996-2010 VideoLAN。任何人都可以使用或修改此徽标或修改版本来指代 VideoLAN 项目或 VideoLAN 团队开发的任何产品,但不表示该项目的认可。

Vulkan 和 Vulkan 徽标是 Khronos Group Inc.的注册商标。

OpenGL 是注册商标,OpenGL ES 徽标是 Khronos 许可使用的 Hewlett Packard Enterprise 商标。