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 memperkenalkan Low Light Boost, mode eksposur otomatis baru yang tersedia untuk Kamera 2 dan ekstensi kamera mode malam. Peningkatan Cahaya Rendah menyesuaikan eksposur streaming Pratinjau dalam kondisi cahaya redup. Cara ini berbeda dengan cara ekstensi kamera mode malam membuat gambar diam, karena mode malam menggabungkan burst foto untuk membuat satu gambar yang disempurnakan. Meskipun mode malam berfungsi sangat baik untuk membuat gambar diam, mode ini tidak dapat membuat streaming frame secara berkelanjutan, tetapi Peningkatan Cahaya Rendah dapat melakukannya. Dengan demikian, Boost Cahaya Rendah memungkinkan kemampuan kamera baru, seperti:

  • Memberikan pratinjau gambar yang disempurnakan, sehingga pengguna lebih dapat membingkai gambar dengan cahaya redup
  • Memindai kode QR dalam kondisi cahaya redup

Jika Anda mengaktifkan Peningkatan Cahaya Rendah, fitur akan otomatis menyala saat level cahaya rendah, dan dinonaktifkan saat ada lebih banyak cahaya.

Aplikasi dapat merekam streaming Pratinjau dalam kondisi cahaya redup untuk menyimpan video yang terang.

Untuk informasi selengkapnya, lihat Peningkatan Cahaya Rendah.

Kontrol kamera dalam aplikasi

Android 15 menambahkan ekstensi baru untuk kontrol yang lebih besar atas hardware kamera dan algoritmanya di perangkat yang didukung:

  • Penyesuaian kekuatan flash lanjutan memungkinkan kontrol intensitas flash yang akurat dalam mode SINGLE dan TORCH saat mengambil gambar.

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

Perangkat MIDI 2.0 virtual

Android 13 menambahkan dukungan untuk terhubung ke Perangkat MIDI 2.0 yang menggunakan USB, yang berkomunikasi menggunakan Paket MIDI Universal (UMP). Android 15 memperluas dukungan UMP ke MIDI virtual aplikasi, yang memungkinkan aplikasi komposisi mengontrol aplikasi synthesizer perangkat MIDI 2.0 virtual sama seperti 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 melanjutkan pekerjaan memuat ulang library inti Android agar selaras dengan fitur dalam rilis OpenJDK LTS terbaru.

Fitur dan peningkatan utama berikut disertakan:

API ini diupdate di lebih dari satu miliar perangkat yang menjalankan Android 12 (API level 31) dan yang lebih baru melalui update Sistem Google Play, sehingga Anda dapat menargetkan fitur pemrograman terbaru.

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

Peningkatan kualitas pengalihan bahasa otomatis

Android 14 menambahkan pengenalan multibahasa di perangkat dengan peralihan otomatis antar-bahasa, tetapi hal ini dapat menyebabkan kata dihapus, terutama saat bahasa beralih dengan lebih sedikit jeda di antara kedua ucapan. Android 15 menambahkan kontrol tambahan untuk membantu aplikasi menyesuaikan peralihan ini ke kasus penggunaannya. EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS membatasi pengalihan otomatis ke awal sesi audio, sedangkan EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES menonaktifkan pengalihan bahasa setelah sejumlah tombol yang ditentukan. Opsi ini sangat berguna jika Anda mengharapkan bahwa akan ada satu bahasa yang diucapkan selama sesi yang harus terdeteksi otomatis.

Peningkatan API Font Variabel 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.

Kontrol pemisah baris terperinci

Starting in Android 15, a TextView and the underlying line breaker can preserve the given portion of text in the same line to improve readability. You can take advantage of this line break customization by using the <nobreak> tag in string resources or createNoBreakSpan. Similarly, you can preserve words from hyphenation by using the <nohyphen> tag or createNoHyphenationSpan.

For example, the following string resource doesn't include a line break, and renders with the text "Pixel 8 Pro." breaking in an undesirable place:

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

In contrast, this string resource includes the <nobreak> tag, which wraps the phrase "Pixel 8 Pro." and prevents line breaks:

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

The difference in how these strings are rendered is shown in the following images:

Layout for a line of text where the phrase "Pixel 8 Pro." isn't wrapped using a <nobreak> tag.
Layout for the same line of text where the phrase "Pixel 8 Pro." is wrapped using a <nobreak> tag.

Pengarsipan aplikasi

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.

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 melanjutkan modernisasi sistem grafis Canvas Android dengan kemampuan baru:

  • Matrix44 menyediakan matriks 4x4 untuk mengubah koordinat yang harus digunakan saat Anda ingin memanipulasi kanvas dalam 3D.
  • clipShader memotong klip saat ini dengan shader yang ditentukan, sementara clipOutShader menetapkan klip ke perbedaan klip saat ini dan shader, masing-masing memperlakukan shader sebagai masker alfa. Hal ini mendukung penggambaran bentuk yang kompleks secara efisien.

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

Di versi Android sebelumnya, startup aplikasi menjadi sedikit misteri. Terkadang sulit untuk menentukan dalam aplikasi Anda apakah dimulai dari kondisi dingin, hangat, atau panas. Selain itu, sulit untuk mengetahui berapa lama waktu yang dihabiskan aplikasi Anda selama berbagai fase peluncuran: melakukan fork proses, memanggil onCreate, menggambar frame pertama, dan banyak lagi. Saat class Application dibuat instance, Anda tidak dapat mengetahui apakah aplikasi dimulai dari siaran, penyedia konten, tugas, pencadangan, booting selesai, alarm, atau Activity.

ApplicationStartInfo API di Android 15 menyediakan semua ini dan banyak lagi. Anda bahkan dapat memilih untuk menambahkan stempel waktu Anda sendiri ke dalam alur untuk membantu mengumpulkan data pengaturan waktu di satu tempat. Selain mengumpulkan metrik, Anda dapat menggunakan ApplicationStartInfo untuk langsung mengoptimalkan startup aplikasi; misalnya, Anda dapat menghilangkan pembuatan instance library terkait UI yang mahal dalam class Application saat aplikasi dimulai karena siaran.

Detail informasi ukuran aplikasi

Sejak Android 8.0 (level API 26), Android telah menyertakan StorageStats.getAppBytes API yang merangkum ukuran aplikasi yang diinstal sebagai satu jumlah byte, yang merupakan jumlah ukuran APK, ukuran file yang diekstrak dari APK, dan file yang dihasilkan di perangkat seperti kode yang dikompilasi di awal (AOT). Jumlah ini tidak terlalu memiliki gambaran terkait cara aplikasi Anda menggunakan penyimpanan.

Android 15 menambahkan StorageStats.getAppBytesByDataType([type]) API, yang memungkinkan Anda mendapatkan insight tentang bagaimana aplikasi menggunakan semua ruang penyimpanan tersebut, termasuk pemisahan file APK, AOT dan kode terkait percepatan, metadata dex, library, serta profil yang dipandu.

Pembuatan profil yang dikelola aplikasi

Android 15 menyertakan class ProfilingManager, yang memungkinkan Anda mengumpulkan informasi pembuatan profil dari dalam aplikasi. Kami berencana menggabungkannya dengan Android Jetpack API yang akan menyederhanakan pembuatan permintaan pembuatan profil, tetapi API inti akan memungkinkan pengumpulan dump heap, profil heap, sampling stack, dan lainnya. Fungsi ini memberikan callback ke aplikasi Anda dengan tag yang disediakan untuk mengidentifikasi file output, yang dikirim ke direktori file aplikasi Anda. API ini melakukan pembatasan kapasitas untuk meminimalkan dampak performa.

Peningkatan database SQLite

Android 15 introduces SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps.

Developers should consult best practices for SQLite performance to get the most out of their SQLite database, especially when working with large databases or when running latency-sensitive queries.

  • Read-only deferred transactions: when issuing transactions that are read-only (don't include write statements), use beginTransactionReadOnly() and beginTransactionWithListenerReadOnly(SQLiteTransactionListener) to issue read-only DEFERRED transactions. Such transactions can run concurrently with each other, and if the database is in WAL mode, they can run concurrently with IMMEDIATE or EXCLUSIVE transactions.
  • Row counts and IDs: APIs were added to retrieve the count of changed rows or the last inserted row ID without issuing an additional query. getLastChangedRowCount() returns the number of rows that were inserted, updated, or deleted by the most recent SQL statement within the current transaction, while getTotalChangedRowCount() returns the count on the current connection. getLastInsertRowId() returns the rowid of the last row to be inserted on the current connection.
  • Raw statements: issue a raw SQlite statement, bypassing convenience wrappers and any additional processing overhead that they may incur.

Update Android Dynamic Performance Framework

Android 15 melanjutkan investasi kami dalam Android Dynamic Performance Framework (ADPF), sekumpulan API yang memungkinkan game dan aplikasi dengan performa intensif untuk berinteraksi lebih langsung dengan sistem termal dan daya perangkat Android. Pada perangkat yang didukung, Android 15 akan menambahkan kemampuan ADPF baru:

  • Mode efisiensi daya untuk sesi petunjuk guna menunjukkan bahwa thread yang terkait lebih mengutamakan penghematan daya daripada performa, bagus untuk workload latar belakang yang berjalan lama.
  • Durasi kerja GPU dan CPU dapat dilaporkan dalam sesi petunjuk, sehingga sistem dapat menyesuaikan frekuensi CPU dan GPU secara bersamaan agar dapat memenuhi permintaan workload sebaik mungkin.
  • Batas headroom termal untuk menafsirkan kemungkinan status throttling termal berdasarkan prediksi headroom.

Untuk mempelajari lebih lanjut cara menggunakan ADPF di aplikasi dan game Anda, buka dokumentasinya.

Privasi

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

Deteksi perekaman layar

Android 15 menambahkan dukungan untuk aplikasi guna mendeteksinya saat mereka sedang direkam. Callback dipanggil setiap kali aplikasi melakukan transisi antara terlihat atau tidak terlihat dalam perekaman layar. Aplikasi adalah dianggap terlihat jika aktivitas yang dimiliki oleh UID proses pendaftaran sedang direkam. Dengan cara ini, jika aplikasi melakukan operasi yang sensitif, Anda dapat memberi tahu pengguna bahwa mereka sedang direkam.

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 <uri-relative-filter-group> tag, which can optionally include an android:allow tag. These tags can contain <data> tags that use existing data tag attributes as well as the android:query and android:fragment attributes.

Here's an example of the AndroidManifest syntax:

<intent-filter>
  <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

Apps can now highlight only the most-recently-selected photos and videos when partial access to media permissions is granted. This feature can improve the user experience for apps that frequently request access to photos and videos. To use this feature in your app, enable the QUERY_ARG_LATEST_SELECTION_ONLY argument when querying MediaStore through ContentResolver.

Kotlin

val externalContentUri = MediaStore.Files.getContentUri("external")

val mediaColumns = arrayOf(
   FileColumns._ID,
   FileColumns.DISPLAY_NAME,
   FileColumns.MIME_TYPE,
)

val queryArgs = bundleOf(
   // Return only items from the last selection (selected photos access)
   QUERY_ARG_LATEST_SELECTION_ONLY to true,
   // Sort returned items chronologically based on when they were added to the device's storage
   QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
   QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
   QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
       FileColumns.MEDIA_TYPE_IMAGE.toString(),
       FileColumns.MEDIA_TYPE_VIDEO.toString()
   )
)

Java

Uri externalContentUri = MediaStore.Files.getContentUri("external");

String[] mediaColumns = {
    FileColumns._ID,
    FileColumns.DISPLAY_NAME,
    FileColumns.MIME_TYPE
};

Bundle queryArgs = new Bundle();
queryArgs.putBoolean(MediaStore.QUERY_ARG_LATEST_SELECTION_ONLY, true);
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SORT_ORDER, FileColumns.DATE_ADDED + " DESC");
queryArgs.putString(MediaStore.QUERY_ARG_SQL_SELECTION, FileColumns.MEDIA_TYPE + " = ? OR " + FileColumns.MEDIA_TYPE + " = ?");
queryArgs.putStringArray(MediaStore.QUERY_ARG_SQL_SELECTION_ARGS, new String[] {
    String.valueOf(FileColumns.MEDIA_TYPE_IMAGE),
    String.valueOf(FileColumns.MEDIA_TYPE_VIDEO)
});

Privacy Sandbox di Android

Android 15 menyertakan ekstensi Layanan Iklan Android terbaru, yang menyertakan Privacy Sandbox di Android versi terbaru. Penambahan ini adalah bagian dari upaya kami untuk mengembangkan teknologi baru yang meningkatkan privasi pengguna dan memungkinkan pengalaman iklan yang dipersonalisasi dan efektif untuk aplikasi seluler. Halaman sandbox privasi kami memiliki informasi selengkapnya tentang Privacy Sandbox di pratinjau developer Android dan program beta untuk membantu Anda memulai.

Health Connect

Android 15 mengintegrasikan ekstensi terbaru di seputar Health Connect dari Android, platform terpusat dan aman untuk mengelola serta membagikan data kesehatan dan kebugaran yang dikumpulkan aplikasi. Update ini menambahkan dukungan untuk jenis data tambahan di seluruh kebugaran, gizi, suhu kulit, rencana latihan, dan lainnya.

Pelacakan suhu kulit memungkinkan pengguna menyimpan dan membagikan data suhu yang lebih akurat dari perangkat wearable atau perangkat pelacakan lainnya.

Rencana latihan adalah rencana olahraga terstruktur untuk membantu pengguna mencapai kebugaran mereka tujuan tersebut. Dukungan paket pelatihan mencakup berbagai penyelesaian dan performa tujuan:

Pelajari lebih lanjut update terbaru untuk Health Connect di Android dalam presentasi Membuat pengalaman yang dapat disesuaikan dengan Android Health dari 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

Before Android 15, the only way to provide widget picker previews was to specify a static image or layout resource. These previews often differ significantly from the look of the actual widget when it is placed on the home screen. Also, static resources can't be created with Jetpack Glance, so a Glance developer had to screenshot their widget or create an XML layout to have a widget preview.

Android 15 adds support for generated previews. This means that app widget providers can generate RemoteViews to use as the picker preview, instead of a static resource.

Apps can provide Remote Views to the Widget Picker, so they can update the content in the picker to be more representative of what the user will see.

Push API

Apps can provide generated previews through a push API. Apps can provide previews at any point in their lifecycle, and don't receive an explicit request from the host to provide previews. Previews are persisted in AppWidgetService, and hosts can request them on-demand. The following example loads an XML widget layout resource and sets it as the preview:

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

The expected flow is:

  1. At any time, the widget provider calls setWidgetPreview. The provided previews are persisted in AppWidgetService with other provider info.
  2. setWidgetPreview notifies hosts of an updated preview through the AppWidgetHost.onProvidersChanged callback. In response, the widget host reloads all of its provider information.
  3. When displaying a widget preview, the host checks AppWidgetProviderInfo.generatedPreviewCategories, and if the chosen category is available, calls AppWidgetManager.getWidgetPreview to return the saved preview for this provider.

When to call setWidgetPreview

Because there is no callback to provide previews, apps can choose to send previews at any point when they are running. How often to update the preview depends on the widget's use case.

The following list describes the two main categories of preview use cases:

  • Providers that show real data in their widget previews, such as personalized or recent information. These providers can set the preview once the user has signed in or has done initial configuration in their app. After this, they can set up a periodic task to update the previews at their chosen cadence. Examples of this type of widget could be a photo, calendar, weather or news widget.
  • Providers that show static information in previews or quick-action widgets that don't display any data. These providers can set previews once, when the app first launches. Examples of this type of widget include a drive quick actions widget or chrome shortcuts widget.

Some providers might show static previews on the hub mode picker, but real information on the homescreen picker. These providers should follow the guidance for both of these use cases to set previews.

Picture-in-Picture

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

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

Dengan status UI ini, aplikasi yang menargetkan Android 15 (API level 35) akan mengamati Callback Activity#onPictureInPictureUiStateChanged dipanggil dengan isTransitioningToPip() segera setelah animasi PiP dimulai. Ada banyak elemen UI yang tidak relevan untuk aplikasi saat dalam mode PiP, untuk contoh tampilan atau tata letak yang menyertakan informasi seperti saran, teks mendatang video, rating, dan judul. Saat aplikasi masuk ke mode PiP, gunakan Callback onPictureInPictureUiStateChanged untuk menyembunyikan elemen UI ini. Jika aplikasi masuk ke mode layar penuh dari jendela PiP, gunakan Callback onPictureInPictureModeChanged untuk memperlihatkan elemen ini, seperti yang ditunjukkan pada 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 dari elemen UI yang tidak relevan (untuk jendela PiP) membantu memastikan animasi masuk PiP yang lebih halus dan bebas kedipan.

Peningkatan aturan Jangan Ganggu

AutomaticZenRule memungkinkan aplikasi menyesuaikan aturan Pengelolaan Perhatian (Jangan Ganggu) dan memutuskan kapan harus mengaktifkan atau menonaktifkannya. Android 15 menyempurnakan aturan ini secara signifikan dengan tujuan meningkatkan {i>user experience<i}. Peningkatan berikut disertakan:

  • Menambahkan jenis ke AutomaticZenRule, sehingga sistem dapat menerapkan perlakuan terhadap beberapa aturan.
  • Menambahkan ikon ke AutomaticZenRule, membantu membuat mode lebih menarik dikenali.
  • Menambahkan string triggerDescription ke AutomaticZenRule yang mendeskripsikan kondisi tempat aturan harus diaktifkan bagi pengguna.
  • Ditambahkan ZenDeviceEffects ke AutomaticZenRule, yang memungkinkan aturan memicu hal-hal seperti hitam putih layar, mode malam, atau meredupkan wallpaper.

Menyetel VibrationEffect untuk saluran notifikasi

Android 15 mendukung setelan getaran yang kaya untuk notifikasi masuk dengan saluran menggunakan NotificationChannel.setVibrationEffect, sehingga pengguna dapat membedakan berbagai jenis notifikasi tanpa hanya dengan melihat perangkat mereka.

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 memberi pengguna cara yang lebih baik untuk melakukan multitasking di perangkat layar besar. Sebagai misalnya, pengguna dapat menyimpan kombinasi aplikasi layar terpisah favorit mereka dengan cepat mengakses dan menyematkan taskbar di layar untuk beralih antar-aplikasi dengan cepat. Artinya bahwa memastikan aplikasi Anda bersifat adaptif kini menjadi semakin penting.

Google I/O memiliki sesi tentang Membangun Android adaptif aplikasi dan Membangun UI dengan Material 3 library adaptif yang dapat membantu, dan dokumentasi kami memiliki lebih banyak hal untuk membantu Anda Mendesain untuk layar.

Dukungan layar sampul

Aplikasi Anda dapat mendeklarasikan properti yang digunakan Android 15 untuk memungkinkan Application atau Activity ditampilkan di layar penutup kecil pada perangkat foldable yang didukung. Layar ini terlalu kecil untuk dianggap sebagai target kompatibel untuk menjalankan aplikasi Android, tetapi aplikasi Anda dapat memilih untuk mendukungnya, sehingga aplikasi tersedia di lebih banyak tempat.

Konektivitas

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

Dukungan satelit

Android 15 terus memperluas dukungan platform untuk konektivitas satelit dan menyertakan beberapa elemen UI untuk memastikan pengalaman pengguna yang konsisten di seluruh lanskap konektivitas satelit.

Aplikasi dapat menggunakan ServiceState.isUsingNonTerrestrialNetwork() untuk mendeteksi saat perangkat terhubung ke satelit, sehingga memberi mereka mengapa layanan jaringan penuh mungkin tidak tersedia. Selain itu, Android 15 menyediakan dukungan untuk aplikasi SMS dan MMS serta aplikasi RCS bawaan untuk digunakan konektivitas satelit untuk mengirim dan menerima pesan.

Notifikasi muncul saat perangkat terhubung ke satelit.

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 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 memperkenalkan peran Wallet baru yang memungkinkan integrasi yang lebih erat dengan aplikasi dompet pilihan pengguna. Peran ini menggantikan setelan pembayaran tanpa kontak fisik default NFC. Pengguna dapat mengelola pemegang peran Wallet dengan membuka Setelan > Aplikasi > Aplikasi Default.

Peran Wallet digunakan saat merutekan ketukan NFC untuk AID yang terdaftar dalam kategori pembayaran. Ketukan selalu membuka pemegang peran Wallet, kecuali jika aplikasi lain yang terdaftar untuk AID yang sama berjalan di latar depan.

Peran ini juga digunakan untuk menentukan tempat kartu QuickAccess Wallet harus berada saat diaktifkan. Jika peran disetel ke "Tidak ada", kartu QuickAccess tidak akan tersedia dan ketukan NFC kategori pembayaran hanya akan dikirim ke aplikasi latar depan.

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

Pengelola Kredensial mengintegrasikan perintah biometrik ke dalam pembuatan kredensial dan proses login, sehingga penyedia tidak perlu lagi mengelola prompt biometrik. Akibatnya, penyedia kredensial hanya perlu fokus pada hasil alur create dan get, yang ditambah dengan hasil alur biometrik. Proses yang disederhanakan ini menciptakan proses pembuatan dan pengambilan kredensial yang lebih efisien dan sederhana.

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 memperkenalkan kumpulan API baru yang melakukan pemeriksaan izin pada URI konten:

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

Mulai Android 15, file font untuk bahasa China, Jepang, dan Korea (CJK), NotoSansCJK, sekarang menjadi font variabel. {i>Font<i} variabel membuka kemungkinan baru untuk tipografi kreatif dalam bahasa CJK. Desainer dapat mempelajari berbagai gaya yang lebih luas dan membuat tata letak yang memukau secara visual yang sebelumnya sulit atau tidak mungkin dicapai.

Tampilan font variabel untuk bahasa China, Jepang, dan Korea (CJK) dengan lebar font yang berbeda.

Justifikasi antarkarakter

Mulai Android 15, teks dapat dibenarkan menggunakan spasi huruf dengan menggunakan JUSTIFICATION_MODE_INTER_CHARACTER. Justifikasi antarkata pertama kali diperkenalkan di Android 8.0 (API level 26), dan justifikasi antarkarakter memberikan kemampuan serupa untuk bahasa yang menggunakan karakter spasi kosong untuk segmentasi, seperti China, Jepang, dan lainnya.

Tata letak untuk teks bahasa Jepang menggunakan JUSTIFICATION_MODE_NONE.
Tata letak untuk teks bahasa Inggris menggunakan JUSTIFICATION_MODE_NONE.


Tata letak untuk teks bahasa Jepang menggunakan JUSTIFICATION_MODE_INTER_WORD.
Tata letak untuk teks bahasa Inggris menggunakan JUSTIFICATION_MODE_INTER_WORD.


Tata letak untuk teks bahasa Jepang menggunakan JUSTIFICATION_MODE_INTER_CHARACTER.
Tata letak untuk teks bahasa Inggris menggunakan JUSTIFICATION_MODE_INTER_CHARACTER.

Konfigurasi pemisah baris otomatis

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

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

Untuk baris teks yang pendek, LINE_BREAK_WORD_STYLE_AUTO menerapkan pemisah baris berbasis frasa untuk meningkatkan keterbacaan teks. Hal ini sama dengan menerapkan LINE_BREAK_WORD_STYLE_PHRASE.

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

Untuk baris teks panjang, LINE_BREAK_WORD_STYLE_AUTO tidak menerapkan gaya kata pemisah baris untuk meningkatkan keterbacaan teks. Hal ini sama dengan menerapkan LINE_BREAK_WORD_STYLE_NONE.

Font Hentaigana Jepang Baru

Di Android 15, file font untuk huruf Hiragana Jepang lama (yang dikenal sebagai Hentaigana) secara default dipaketkan. Bentuk unik karakter Hentaigana dapat menambahkan gaya unik pada karya seni atau desain sekaligus membantu mempertahankan transmisi dan pemahaman yang akurat tentang dokumen Jepang kuno.

Karakter dan gaya teks untuk Hentaigana Jepang font.

Kerucut VideoLAN Hak Cipta (c) 1996-2010 VideoLAN. Logo ini atau versi yang dimodifikasi dapat digunakan atau diubah oleh siapa saja untuk merujuk ke project VideoLAN atau produk apa pun yang dikembangkan oleh tim VideoLAN, tetapi tidak menunjukkan dukungan dari project.

Vulkan dan logo Vulkan adalah merek dagang terdaftar dari Khronos Group Inc.

OpenGL adalah merek dagang terdaftar dan logo OpenGL ES adalah merek dagang dari Hewlett Packard Enterprise yang digunakan atas izin dari Khronos.