Register now for Android Dev Summit 2019!

Fitur dan API Android Q

Android Q memperkenalkan sejumlah fitur dan kapabilitas baru yang andal untuk pengguna dan developer. Dokumen ini merangkum apa saja yang baru untuk developer.

Untuk mempelajari API baru, silakan baca laporan perbedaan API atau buka referensi Android API. API baru ditandai agar mudah dilihat. Pastikan juga untuk memeriksa perubahan perilaku Android Q (untuk aplikasi yang menargetkan Q dan untuk semua aplikasi), juga perubahan privasi, untuk mengetahui area apa saja pada aplikasi Anda yang mungkin terpengaruh oleh perubahan platform.

Penyempurnaan keamanan

Android Q memperkenalkan sejumlah fitur keamanan, yang dirangkum dalam bagian berikut.

Dialog autentikasi biometrik yang disempurnakan

Android Q memperkenalkan penyempurnaan berikut pada dialog autentikasi biometrik terpadu yang ditambahkan pada Android 9:

Menetapkan persyaratan konfirmasi pengguna

Sekarang Anda dapat memberikan petunjuk yang memberi tahu sistem untuk tidak meminta konfirmasi pengguna setelah pengguna melakukan autentikasi menggunakan modalitas biometrik implisit. Misalnya, Anda dapat memberi tahu sistem bahwa konfirmasi lebih lanjut tidak diperlukan setelah pengguna melakukan autentikasi menggunakan autentikasi Wajah.

Secara default, sistem meminta konfirmasi pengguna. Biasanya, pengguna perlu mengonfirmasi tindakan yang sensitif atau berisiko tinggi (misalnya melakukan pembelian). Namun, jika Anda memiliki tindakan berisiko rendah tertentu untuk aplikasi, Anda dapat memberikan petunjuk untuk tidak mewajibkan konfirmasi pengguna dengan meneruskan false ke metode setConfirmationRequired(). Karena tanda ini diteruskan sebagai petunjuk ke sistem, sistem dapat mengabaikan nilai tersebut jika pengguna telah mengubah setelan sistemnya untuk autentikasi biometrik.

Contoh autentikasi wajah tanpa konfirmasi pengguna.

Gambar 1.Autentikasi wajah tanpa konfirmasi pengguna

Contoh autentikasi wajah yang memerlukan konfirmasi pengguna.

Gambar 2.Autentikasi wajah yang memerlukan konfirmasi pengguna

Dukungan fallback yang disempurnakan untuk kredensial perangkat

Sekarang Anda dapat memberi tahu sistem agar mengizinkan pengguna melakukan autentikasi menggunakan PIN, pola, atau sandi perangkat jika karena suatu alasan mereka tidak dapat melakukan autentikasi menggunakan input biometrik. Untuk mengaktifkan dukungan fallback ini, gunakan metode setDeviceCredentialAllowed().

Jika aplikasi Anda saat ini menggunakan createConfirmDeviceCredentialIntent() untuk melakukan fallback ke kredensial perangkat, beralihlah untuk menggunakan metode baru ini.

Memeriksa kapabilitas biometrik perangkat

Sekarang Anda dapat memeriksa apakah perangkat mendukung autentikasi biometrik sebelum memanggil BiometricPrompt menggunakan metode canAuthenticate() pada class BiometricManager.

Menjalankan kode DEX tersemat langsung dari APK

Sekarang Anda dapat memberi tahu platform agar menjalankan kode DEX tersemat langsung dari file APK aplikasi. Opsi ini dapat membantu mencegah serangan jika penyerang berhasil merusak kode yang dikompilasi secara lokal pada perangkat.

Untuk mengaktifkan fitur ini, tetapkan nilai atribut android:useEmbeddedDex ke true dalam elemen <application> file manifes aplikasi Anda. Anda juga harus membuat APK yang memuat kode DEX tak terkompresi yang dapat diakses langsung oleh ART. Tambahkan opsi berikut ke file konfigurasi Gradle atau Bazel Anda untuk membuat APK dengan kode DEX tak terkompresi:

Gradle

aaptOptions {
       noCompress 'dex'
    }
    

Bazel

    android_binary(
       ...,
       nocompress_extensions = [“.dex”],
    )
    

Dukungan TLS 1.3

Implementasi TLS platform sekarang mendukung TLS 1.3. TLS 1.3 adalah revisi besar atas TLS standar dan mencakup manfaat performa dan peningkatan keamanan. Tolok ukur kami menunjukkan bahwa koneksi aman dapat dibuat 40% lebih cepat dengan TLS 1.3 dibandingkan dengan TLS 1.2.

TLS 1.3 diaktifkan secara default untuk semua koneksi TLS. Jika ingin mendapatkan SSLContext dengan TLS 1.3 nonaktif, Anda dapat memanggil SSLContext.getInstance("TLSv1.2"). Anda juga dapat mengaktifkan atau menonaktifkan versi protokol per koneksi dengan memanggil setEnabledProtocols() pada objek yang sesuai.

Berikut ini beberapa detail penting tentang implementasi TLS 1.3:

  • Paket penyandian TLS 1.3 tidak dapat disesuaikan. Paket penyandian TLS 1.3 yang didukung akan selalu aktif saat TLS 1.3 diaktifkan, dan segala upaya untuk menonaktifkannya melalui panggilan ke setEnabledCipherSuites() akan diabaikan.
  • Saat TLS 1.3 dinegosiasikan, HandshakeCompletedListeners akan dipanggil sebelum sesi ditambahkan ke cache sesi (kebalikan dari TLS 1.2 dan semua versi sebelumnya).
  • Instance SSLEngine akan memunculkan SSLProtocolException dalam beberapa keadaan yang pada versi sebelumnya akan memunculkan SSLHandshakeException.
  • Mode 0-RTT tidak didukung.

Conscrypt API publik

Penyedia keamanan Conscrypt sekarang menyertakan API publik untuk fungsionalitas TLS. Di masa lalu, pengguna dapat mengakses fungsi ini melalui refleksi. Namun, karena adanya pembatasan pemanggilan API non-publik yang ditambahkan pada Android P, fungsionalitas ini telah dimasukkan ke dalam greylist pada Android Q dan akan semakin dibatasi dalam rilis mendatang.

Update ini menambahkan kumpulan class dalam android.net.ssl yang memuat metode statis untuk mengakses fungsionalitas yang tidak tersedia dari API javax.net.ssl generik. Nama-nama untuk class ini dapat disimpulkan dari bentuk jamak class javax.net.ssl terkait. Misalnya, kode yang beroperasi di instance javax.net.ssl.SSLSocket dapat menggunakan metode dari class android.net.ssl.SSLSockets yang baru.

Fitur konektivitas

Android Q menghadirkan beberapa penyempurnaan terkait jaringan dan konektivitas.

API koneksi jaringan Wi-Fi

Android Q menambahkan dukungan untuk koneksi peer-to-peer. Dengan fitur ini, aplikasi Anda dapat mengarahkan pengguna untuk mengubah titik akses yang terhubung dengan perangkat menggunakan WifiNetworkSpecifier untuk menjelaskan properti jaringan yang diminta. Koneksi peer-to-peer digunakan untuk keperluan selain penyediaan jaringan, misalnya untuk konfigurasi bootstrap perangkat sekunder seperti hardware Chromecast dan Google Home.

Anda akan menggunakan aliran berikut saat menggunakan API ini:

  1. Buat specifier jaringan Wi-Fi menggunakan WifiNetworkSpecifier.Builder.

  2. Setel filter jaringan untuk mencocokkan jaringan yang akan dihubungkan, bersama dengan kredensial yang diperlukan.

  3. Tentukan kombinasi SSID, SSID pattern, BSSID, dan BSSID pattern untuk menyetel filter jaringan dalam setiap permintaan, dengan mengikuti persyaratan berikut:

    • Setiap permintaan harus menyediakan setidaknya satu dari SSID, SSID pattern, BSSID, atau BSSID pattern
    • Setiap permintaan hanya dapat menyetel satu dari SSID atau SSID pattern
    • Setiap permintaan hanya dapat menyetel satu dari BSSID atau BSSID pattern
  4. Tambahkan specifier ke permintaan jaringan bersama dengan instance NetworkCallback untuk melacak status permintaan.

    Jika pengguna menerima permintaan dan koneksi ke jaringan berhasil, NetworkCallback.onAvailable() akan dipanggil pada objek callback. Jika pengguna menolak permintaan atau jika koneksi ke jaringan gagal, NetworkCallback.onUnavailable() akan dipanggil pada objek callback.

Koneksi peer-to-peer tidak memerlukan izin Lokasi atau Wi-Fi. Saat permintaan untuk terhubung ke perangkat peer diinisiasi, kotak dialog akan ditampilkan di perangkat yang sama, dan dari kotak dialog tersebut pengguna perangkat dapat menerima atau menolak permintaan koneksi.

Melewati persetujuan pengguna

Setelah pengguna menyetujui jaringan untuk terhubung sebagai respons atas permintaan dari aplikasi tertentu, perangkat akan menyimpan persetujuan untuk titik akses tertentu. Jika aplikasi membuat permintaan khusus untuk terhubung ke titik akses tersebut lagi, perangkat akan melewati fase persetujuan pengguna dan secara otomatis terhubung ke jaringan. Jika pengguna memilih untuk melupakan jaringan saat terhubung ke jaringan yang diminta oleh API, persetujuan yang disimpan untuk kombinasi aplikasi dan jaringan tersebut akan dihapus, dan permintaan apa pun di masa mendatang dari aplikasi akan memerlukan persetujuan dari pengguna lagi. Jika aplikasi membuat permintaan tidak spesifik (seperti dengan pola SSID atau BSSID), pengguna harus menyetujui permintaan tersebut.

Contoh kode

Contoh kode berikut menunjukkan cara terhubung ke jaringan terbuka dengan awalan SSID "test" dan BSSID OUI dari "10:03:23":

Kotlin

    val specifier = WifiNetworkSpecifier.Builder()
        .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
        .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
        .build()

    val request = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(specifier)
        .build()

    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val networkCallback = object : ConnectivityManager.NetworkCallback() {
        ...
        override fun onAvailable(network: Network?) {
            // do success processing here..
        }

        override fun onUnavailable() {
            // do failure processing here..
        }
        ...
    }
    connectivityManager.requestNetwork(request, networkCallback)
    ...
    // Release the request when done.
    connectivityManager.unregisterNetworkCallback(networkCallback)
    

Java

    final NetworkSpecifier specifier =
      new WifiNetworkSpecifier.Builder()
      .setSsidPattern(new PatternMatcher("test", PatterMatcher.PATTERN_PREFIX))
      .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
      .build();

    final NetworkRequest request =
      new NetworkRequest.Builder()
      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
      .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
      .setNetworkSpecifier(specifier)
      .build();

    final ConnectivityManager connectivityManager = (ConnectivityManager)
      context.getSystemService(Context.CONNECTIVITY_SERVICE);

    final NetworkCallback networkCallback = new NetworkCallback() {
      ...
      @Override
      void onAvailable(...) {
          // do success processing here..
      }

      @Override
      void onUnavailable(...) {
          // do failure processing here..
      }
      ...
    };
    connectivityManager.requestNetwork(request, networkCallback);
    ...
    // Release the request when done.
    connectivityManager.unregisterNetworkCallback(networkCallback);
    

API saran jaringan Wi-Fi

Android Q menambahkan dukungan yang memungkinkan aplikasi Anda menambahkan kredensial jaringan agar perangkat terhubung secara otomatis ke titik akses Wi-Fi. Anda dapat menyarankan dengan jaringan mana koneksi dapat dibuat menggunakan WifiNetworkSuggestion. Selanjutnya, platform memilih titik akses mana yang akan diterima berdasarkan input dari aplikasi Anda dan aplikasi lainnya.

Contoh kode berikut menunjukkan cara memberikan kredensial untuk satu jaringan terbuka, satu WPA2, dan satu WPA3:

Kotlin

    val suggestion1 = WifiNetworkSuggestion.Builder()
            .setSsid("test111111")
            .setIsAppInteractionRequired() // Optional (Needs location permission)
            .build()

    val suggestion2 = WifiNetworkSuggestion.Builder()
            .setSsid("test222222")
            .setWpa2Passphrase("test123456")
            .setIsAppInteractionRequired() // Optional (Needs location permission)
            .build()

    val suggestion3 = WifiNetworkSuggestion.Builder()
            .setSsid("test333333")
            .setWpa3Passphrase("test6789")
            .setIsAppInteractionRequired() // Optional (Needs location permission)
            .build()

    val suggestionsList = listOf(suggestion1, suggestion2, suggestion3)

    val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager

    val status = wifiManager.addNetworkSuggestions(suggestionsList);
    if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
        // do error handling here
    }

    // Optional (Wait for post connection broadcast to one of your suggestions)
    val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

    val broadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
                return;
            }
            // do post connect processing here
        }
    };
    context.registerReceiver(broadcastReceiver, intentFilter);
    

Java

    final WifiNetworkSuggestion suggestion1 =
      new WifiNetworkSuggestion.Builder()
      .setSsid("test111111")
      .setIsAppInteractionRequired() // Optional (Needs location permission)
      .build()

    final WifiNetworkSuggestion suggestion2 =
      new WifiNetworkSuggestion.Builder()
      .setSsid("test222222")
      .setWpa2Passphrase("test123456")
      .setIsAppInteractionRequired() // Optional (Needs location permission)
      .build()

    final WifiNetworkSuggestion suggestion3 =
      new WifiNetworkSuggestion.Builder()
      .setSsid("test333333")
      .setWpa3Passphrase("test6789")
      .setIsAppInteractionRequired() // Optional (Needs location permission)
      .build()

    final List<wifinetworksuggestion> suggestionsList =
      new ArrayList<wifinetworksuggestion> {{
        add(suggestion1);
        add(suggestion2);
        add(suggestion3);
      }};

    final WifiManager wifiManager =
      (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

    final int status = wifiManager.addNetworkSuggestions(suggestionsList);
    if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
    // do error handling here…
    }

    // Optional (Wait for post connection broadcast to one of your suggestions)
    final IntentFilter intentFilter =
      new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);

    final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        if (!intent.getAction().equals(
          WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
          return;
        }
        // do post connect processing here..
      }
    };
    context.registerReceiver(broadcastReceiver, intentFilter);
    

Saran dari aplikasi harus disetujui oleh pengguna sebelum platform menginisiasi koneksi ke jaringan. Persetujuan ini diberikan pengguna dengan merespons notifikasi saat platform pertama kali menemukan jaringan yang cocok dengan salah satu saran dari aplikasi dalam hasil pemindaian. Setelah platform tersambung ke salah satu jaringan yang disarankan, setelan akan menampilkan teks yang mengatribusikan koneksi jaringan tersebut ke aplikasi pemberi saran yang terkait.

Menangani pemutusan pengguna

Jika pengguna menggunakan alat pilih Wi-Fi untuk memutus sambungan secara eksplisit pada salah satu saran jaringan saat tersambung, jaringan tersebut akan masuk daftar hitam selama 24 jam. Selama berada dalam daftar hitam, jaringan tersebut tidak akan dipertimbangkan untuk koneksi otomatis, meskipun aplikasi menghapus lalu menambahkan kembali saran jaringan yang sesuai dengan jaringan.

Mengubah status persetujuan untuk aplikasi

Pengguna yang menolak notifikasi saran jaringan akan menghapus izin CHANGE_WIFI_STATE dari aplikasi. Pengguna dapat memberikan persetujuan ini di lain waktu dengan masuk ke menu kontrol Wi-Fi (Setelan > Aplikasi & notifikasi > Akses aplikasi khusus > Kontrol Wi-Fi > Nama aplikasi).

Penyempurnaan pada mode Wi-Fi performa tinggi latensi rendah

Dengan Android Q, Anda dapat memberikan petunjuk kepada modem dasar untuk meminimalkan latensi.

Android Q meningkatkan kapabilitas API penguncian Wi-Fi untuk mendukung mode performa tinggi latensi rendah secara efektif. Penghematan daya Wi-Fi dinonaktifkan untuk mode performa tinggi latensi rendah, dan pengoptimalan latensi lebih lanjut dapat diaktifkan dalam mode latensi rendah, bergantung pada dukungan modem.

Mode latensi rendah hanya diaktifkan jika aplikasi yang memperoleh kunci sedang berjalan di latar depan dan layar dalam kondisi menyala. Mode latensi rendah ini sangat berguna dalam aplikasi game seluler real time.

Pencarian khusus pada resolver DNS

Android Q menambahkan dukungan native untuk pencarian DNS melalui TLS serta DNS khusus. Sebelumnya, resolver DNS platform mendukung resolusi jenis A, yang akan menentukan alamat IP terhadap nama domain tanpa informasi spesifik tentang layanan yang ditawarkan di IP tersebut. Dengan update ini, pencarian SRV & NAPTR kini juga didukung.

Android Q memungkinkan developer untuk melakukan pencarian cleartext standar ini dan mode DNS-over-TLS.

Easy Connect Wi-Fi

Android Q memungkinkan Anda menggunakan Easy Connect untuk menyediakan kredensial Wi-Fi ke perangkat peer, sebagai pengganti WPS yang tidak digunakan lagi. Aplikasi dapat mengintegrasikan Easy Connect ke dalam alur penyiapan dan penyediaan dengan menggunakan intent ACTION_PROCESS_WIFI_EASY_CONNECT_URI. Intent ini membutuhkan URI. Aplikasi yang memanggil dapat mengambil URI melalui berbagai metode, termasuk memindai kode QR dari stiker atau tampilan, maupun pemindaian Bluetooth LE atau iklan NFC.

Setelah URI tersedia, Anda dapat menyediakan kredensial Wi-Fi perangkat peer dengan intent ACTION_PROCESS_WIFI_EASY_CONNECT_URI. Cara ini memungkinkan pengguna memilih jaringan Wi-Fi yang akan dibagikan dan mentransfer kredensial dengan aman.

Easy Connect tidak memerlukan izin Lokasi atau Wi-Fi.

API koneksi Wi-Fi Langsung

Android Q mencakup update class API WifiP2pConfig dan WifiP2pManager untuk mendukung kapabilitas pembentukan koneksi cepat ke Wi-Fi Direct menggunakan informasi yang telah ditentukan. Informasi ini dibagikan melalui saluran samping, seperti Bluetooth atau NFC.

Contoh kode berikut menunjukkan cara membuat grup menggunakan informasi yang telah ditentukan:

Kotlin

    val manager = getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager
    val channel = manager.initialize(this, mainLooper, null)

    // prefer 5G band for this group
    val config = WifiP2pConfig.Builder()
        .setNetworkName("networkName")
        .setPassphrase("passphrase")
        .enablePersistentMode(false)
        .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
        .build()

    // create a non-persistent group on 5GHz
    manager.createGroup(channel, config, null)
    

Java

    WifiP2pManager manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    Channel channel = manager.initialize(this, getMainLooper(), null);

    // prefer 5G band for this group
    WifiP2pConfig config = new WifiP2pConfig.Builder()
    .setNetworkName("networkName")
    .setPassphrase("passphrase")
    .enablePersistentMode(false)
    .setGroupOperatingBand(WifiP2pConfig.GROUP_OWNER_BAND_5GHZ)
    .build();

    // create a non-persistent group on 5GHz
    manager.createGroup(channel, config, null);
    

Untuk bergabung dengan sebuah grup menggunakan kredensial, ganti manager.createGroup() dengan berikut ini:

Kotlin

    manager.connect(channel, config, null)
    

Java

    manager.connect(channel, config, null);
    

Saluran Berorientasi Koneksi (CoC) Bluetooth LE

Android Q memungkinkan aplikasi Anda menggunakan koneksi CoC BLE untuk mentransfer aliran data berukuran besar antara dua perangkat BLE. Antarmuka ini mengabstraksi Bluetooth dan mekanisme konektivitas untuk menyederhanakan implementasi.

Fitur telepon

Android Q mencakup beberapa penyempurnaan terkait fitur telepon.

Peningkatan kualitas panggilan

Android Q menambahkan kemampuan untuk mengumpulkan informasi kualitas panggilan IP Multimedia Subsystem (IMS) yang sedang berlangsung, termasuk kualitas ke dan dari jaringan, pada perangkat yang mendukung fitur tersebut.

Penyaringan panggilan dan nomor penelepon

Android Q memberi aplikasi Anda kemampuan untuk mengidentifikasi panggilan dari nomor yang tidak tercantum dalam buku alamat sebagai panggilan telepon spam potensial, dan untuk menolak panggilan telepon spam secara diam-diam atas nama pengguna. Informasi tentang panggilan yang diblokir ini dicatat di log panggilan sebagai panggilan diblokir untuk memberikan transparansi yang lebih baik kepada pengguna saat mereka tidak dapat menjawab panggilan. Dengan API baru ini, izin READ_CALL_LOG tidak perlu lagi diminta dari pengguna untuk menyediakan fungsionalitas penyaringan panggilan dan nomor penelepon.

API layanan pengalihan panggilan

Android Q mengubah penanganan intent panggilan. Siaran NEW_OUTGOING_CALL tidak digunakan lagi dan diganti dengan CallRedirectionService API. CallRedirectionService API menyediakan antarmuka bagi Anda untuk memodifikasi panggilan keluar yang dilakukan oleh platform Android. Misalnya, aplikasi pihak ketiga dapat membatalkan panggilan dan mengalihkannya melalui VoIP.

Peningkatan dalam pembuatan file di penyimpanan eksternal

Selain memperkenalkan perubahan perilaku privasi penyimpanan yang tercakup, Android Q juga memberikan lebih banyak fleksibilitas dalam menulis file dan memperkenalkan kemampuan untuk membantu Anda memengaruhi tempat file tersebut disimpan di perangkat penyimpanan eksternal.

Status tertunda untuk file media baru

Android Q memperkenalkan tanda IS_PENDING, yang memberi aplikasi Anda akses eksklusif ke file media saat ditulis ke disk.

Cuplikan kode berikut menunjukkan cara menggunakan tanda IS_PENDING saat membuat image baru di aplikasi Anda:

Kotlin

    val values = ContentValues().apply {
        put(MediaStore.Images.Media.DISPLAY_NAME, "IMG1024.JPG")
        put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
        put(MediaStore.Images.Media.IS_PENDING, 1)
    }

    val resolver = context.getContentResolver()
    val collection = MediaStore.Images.Media
            .getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
    val item = resolver.insert(collection, values)

    resolver.openFileDescriptor(item, "w", null).use { pfd ->
        // Write data into the pending image.
    }

    // Now that we're finished, release the "pending" status, and allow other apps
    // to view the image.
    values.clear()
    values.put(MediaStore.Images.Media.IS_PENDING, 0)
    resolver.update(item, values, null, null)
    

Java

    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.DISPLAY_NAME, "IMG1024.JPG");
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
    values.put(MediaStore.Images.Media.IS_PENDING, 1);

    ContentResolver resolver = context.getContentResolver();
    Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
    Uri item = resolver.insert(collection, values);

    try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(item, "w", null)) {
        // Write data into the pending image.
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Now that we're finished, release the "pending" status, and allow other apps
    // to view the image.
    values.clear();
    values.put(MediaStore.Images.Media.IS_PENDING, 0);
    resolver.update(item, values, null, null);
    

Pengaruh pada lokasi penyimpanan

Android Q memperkenalkan beberapa kemampuan untuk membantu Anda mengatur file yang diberikan oleh aplikasi ke penyimpanan eksternal.

Petunjuk direktori

Saat aplikasi Anda memberikan media pada perangkat yang menjalankan Android Q, media akan diatur berdasarkan jenisnya secara default. Misalnya, file gambar baru dimasukkan ke dalam direktori "gambar" secara default.

Jika aplikasi Anda mengetahui lokasi spesifik tempat file disimpan, seperti Pictures/MyVacationPictures, Anda dapat menyetel MediaColumns.RELATIVE_PATH untuk memberikan petunjuk bagi sistem lokasi penyimpanan file yang baru ditulis. Sama halnya, Anda dapat memindahkan file pada disk selama panggilan untuk update() dengan mengubah MediaColumns.RELATIVE_PATH atau MediaColumns.DISPLAY_NAME.

Pemilihan perangkat

Di Android 9 (API level 28) dan lebih rendah, semua file yang disimpan ke semua perangkat penyimpanan muncul pada satu nama volume external. Android Q, di sisi lain, memberi setiap perangkat penyimpanan eksternal nama volume unik. Sistem penamaan baru ini akan membantu Anda mengatur dan mengindeks konten secara efisien, dan memberi Anda kontrol terhadap tempat penyimpanan konten baru.

Perangkat penyimpanan utama bersama selalu disebut VOLUME_EXTERNAL_PRIMARY. Anda dapat menemukan volume lainnya dengan memanggil MediaStore.getExternalVolumeNames().

Untuk mengajukan kueri, menyisipkan, mengupdate, atau menghapus volume tertentu, teruskan nama volume ke salah satu metode getContentUri() yang tersedia di API MediaStore, seperti pada cuplikan kode berikut:

    // Publish an audio file onto a specific external storage device.
    val values = ContentValues().apply {
        put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/My Album/My Song")
        put(MediaStore.Audio.Media.DISPLAY_NAME, "My Song.mp3")
    }

    // Assumes that the storage device of interest is the 2nd one
    // that your app recognizes.
    val volumeNames = MediaStore.getExternalVolumeNames(context)
    val selectedVolumeName = volumeNames[1]
    val collection = MediaStore.Audio.Media.getContentUri(selectedVolumeName)
    val item = resolver.insert(collection, values)
    

Media dan grafis

Android Q memperkenalkan fitur dan API media dan grafis baru berikut ini:

Perekaman pemutaran audio

Android Q memberi aplikasi kemampuan untuk merekam pemutaran audio dari aplikasi lain. Untuk informasi selengkapnya, lihat Merekam pemutaran .

Native MIDI API

Android Native MIDI API (AMidi) memungkinkan developer aplikasi untuk mengirim dan menerima data MIDI dengan kode C/C++, sehingga berintegrasi lebih erat dengan logika audio/kontrol C/C++ dan meminimalkan kebutuhan akan JNI.

Untuk informasi selengkapnya, lihat Android Native MIDI API.

Penyempurnaan MediaCodecInfo

Ada metode baru di MediaCodecInfo yang mengungkap lebih banyak informasi tentang codec:

isSoftwareOnly()
Menampilkan nilai true jika codec hanya berjalan di software. Codec software tidak memberikan jaminan tentang performa rendering.
isHardwareAccelerated()
Menampilkan nilai true jika codec dipercepat oleh hardware.
isVendor()
Menampilkan nilai true jika codec disediakan oleh vendor perangkat, atau false jika disediakan oleh platform Android.
isAlias()
MediaCodecList dapat memuat entri tambahan untuk codec dasar yang sama yang menggunakan nama codec alternatif (alias). Metode ini menampilkan true jika codec dalam entri ini adalah alias untuk codec lain.

Selain itu, MediaCodec.getCanonicalName() juga menampilkan nama codec dasar untuk codec yang dibuat melalui alias.

Poin Performa

Poin performa menunjukkan kemampuan codec untuk merender video pada tinggi, lebar, dan frekuensi gambar (frame rate) tertentu. Misalnya, poin performa UHD_60 menunjukkan video Ultra High Definition (3840x2160 piksel) yang dirender pada 60 frame per detik.

Metode MediaCodecInfo.VideoCapabilities.getSupportedPerformancePoints() menampilkan daftar entri PerformancePoint yang dapat dirender atau direkam oleh codec.

Anda dapat memeriksa apakah PerformancePoint yang diberikan telah mencakup poin performa lainnya dengan memanggil PerformancePoint.covers(PerformancePoint). Misalnya, UHD_60.covers(UHD_50) akan menampilkan nilai true.

Daftar poin performa disediakan untuk semua codec yang dipercepat hardware. Daftar ini bisa jadi kosong jika codec tidak memenuhi poin performa standar terendah sekalipun.

Harap perhatikan bahwa perangkat yang telah diupgrade ke Q tanpa memperbarui gambar vendor tidak akan memiliki data poin performa, karena data ini berasal dari HAL vendor. Dalam hal ini, getSupportedPerformancePoints() akan menampilkan nilai nol.

ANGLE

Dengan dirilisnya Android Q, developer Android dan partner memiliki opsi untuk menjalankan aplikasi menggunakan ANGLE, sebuah project dalam organisasi Chrome yang menempatkan lapisan ES di atas Vulkan, bukan menggunakan driver ES yang disediakan oleh vendor.

Untuk mengetahui detailnya, lihat ANGLE.

Thermal API

Ketika terlalu panas, perangkat dapat menekan CPU dan/atau GPU, dan hal ini dapat memengaruhi aplikasi dan game dengan cara yang tidak terduga. Aplikasi yang menggunakan grafis kompleks, komputasi yang berat, atau aktivitas jaringan yang berkelanjutan lebih cenderung mengalami masalah, dan hal tersebut dapat berbeda-beda di berbagai perangkat berdasarkan frekuensi chipset dan inti, tingkat integrasi, dan juga paket perangkat serta faktor bentuk.

Kini di Android Q, aplikasi dan game dapat menggunakan thermal API untuk memantau perubahan pada perangkat dan mengambil tindakan untuk mempertahankan penggunaan daya yang lebih rendah guna mengembalikan ke suhu normal. Aplikasi mendaftarkan pemroses di PowerManager, yang melaluinya sistem melaporkan status termal yang sedang berlangsung mulai dari ringan dan sedang hingga parah, kritis, darurat, dan merusak.

Saat perangkat melaporkan tekanan termal, aplikasi dan game dapat membantu dengan membatalkan aktivitas yang sedang berlangsung guna mengurangi penggunaan daya dalam berbagai cara. Misalnya, aplikasi streaming dapat mengurangi resolusi/kecepatan bit atau traffic jaringan, aplikasi kamera dapat menonaktifkan flash atau penyempurnaan gambar intensif, game dapat mengurangi frekuensi gambar atau tesselation poligon, aplikasi media dapat mengurangi volume speaker, dan aplikasi peta dapat menonaktifkan GPS.

Thermal API membutuhkan lapisan HAL perangkat baru. Saat ini didukung pada perangkat Pixel yang menjalankan Android Q dan kami bekerja sama dengan partner pembuat perangkat untuk menyediakan dukungan yang luas ke ekosistem secepat mungkin.

Kamera dan gambar

Android Q memperkenalkan fitur baru yang terkait dengan kamera dan gambar berikut:

Dukungan kamera monokrom

Android 9 (API level 28) memperkenalkan kapabilitas kamera monokrom untuk pertama kalinya. Android Q menambahkan beberapa penyempurnaan ke dukungan kamera monokrom:

  • Dukungan format aliran Y8 baru untuk meningkatkan efisiensi memori.
  • Dukungan untuk pengambilan gambar DNG RAW monokrom.
  • Pengenalan enumerasi MONO dan NIR CFA untuk membedakan antara kamera monokrom biasa dengan kamera inframerah dekat.

Anda dapat menggunakan fitur ini untuk mengambil gambar monokrom native. Perangkat multi-kamera logis dapat menggunakan kamera monokrom sebagai sub-kamera fisik untuk mencapai kualitas gambar cahaya rendah yang lebih baik.

Dynamic Depth Format

Mulai Android Q, kamera dapat menyimpan data kedalaman gambar ke dalam file terpisah, menggunakan skema baru yang disebut Dynamic Depth Format (DDF). Aplikasi dapat meminta gambar JPG dan metadata kedalamannya, dan menggunakan informasi tersebut untuk menerapkan efek blur yang diinginkan dalam tahap pasca-pemrosesan tanpa memodifikasi data gambar aslinya.

Untuk membaca spesifikasi format baru, lihat Format Kedalaman Dinamis.

Format File Gambar Efisiensi Tinggi

Format High Efficiency Image File (HEIF) adalah format gambar dan video standar yang memperkenalkan encoding berkualitas tinggi dan ukuran file yang lebih kecil jika dibandingkan dengan format file lainnya.

Untuk mengetahui informasi lebih lanjut mengenai format file tersebut, lihat HEIC.

Penyempurnaan multi-kamera

Android Q menyempurnakan penggabungan beberapa kamera menjadi satu kamera logis, sebuah fitur yang diperkenalkan di Android 9 (API level 28). Hal berikut ditambahkan ke Camera2 API:

API layanan aksesibilitas

Android Q memperkenalkan fitur dan API layanan aksesibilitas baru berikut:

Tanda kunci entri AccessibilityNodeInfo

Pada Android Q, AccessibilityNodeInfo telah disempurnakan dengan tanda baru yang menentukan apakah tanda tersebut merepresentasikan kunci entri teks atau bukan. Anda dapat mengakses tanda ini menggunakan metode AccessibilityNodeInfo.isTextEntryKey().

Masukan lisan dialog aksesibilitas

Jika layanan aksesibilitas mengharuskan pengguna untuk mengulang pintasan aksesibilitas untuk memulai layanan, dialog kini dapat disertai dengan perintah text-to-speech jika layanan memintanya.

Pintasan aksesibilitas untuk keyboard fisik

Pada Android Q, sekarang pengguna dapat memicu pintasan aksesibilitas pada keyboard fisik dengan menekan Control+Alt+Z.

Penyempurnaan pengontrol keyboard virtual

Pada Android Q, layanan aksesibilitas kini dapat meminta agar keyboard virtual ditampilkan bahkan saat perangkat mendeteksi adanya keyboard fisik. Pengguna dapat mengganti perilaku ini.

Waktu tunggu aksesibilitas yang ditetapkan pengguna

Android Q memperkenalkan metode API AccessibilityManager.getRecommendedTimeoutMillis(), yang memberikan dukungan untuk waktu tunggu yang ditetapkan pengguna untuk elemen UI Aksesibilitas interaktif dan non-interaktif. Nilai yang ditampilkan dipengaruhi oleh preferensi pengguna dan API layanan aksesibilitas.

Penyempurnaan IsiOtomatis

Android Q menghadirkan penyempurnaan berikut pada layanan IsiOtomatis.

Sekarang Anda dapat menggunakan tanda FillRequest.FLAG_COMPATIBILITY_MODE_REQUEST untuk menentukan apakah permintaan IsiOtomatis dibuat melalui mode kompatibilitas.

Menyimpan nama pengguna dan sandi secara bersamaan

Sekarang Anda dapat mendukung kasus ketika aplikasi menggunakan beberapa aktivitas untuk menampilkan nama pengguna, sandi, dan kolom lainnya menggunakan tanda SaveInfo.FLAG_DELAY_SAVE.

Interaksi pengguna dengan UI Penyimpanan

Sekarang Anda dapat menampilkan dan menyembunyikan kolom sandi dalam dialog penyimpanan dengan menetapkan pemroses tindakan pada dialog dan mengubah visibilitas tampilan sandi yang terkait.

Dukungan untuk memperbarui set data

IsiOtomatis sekarang dapat memperbarui sandi yang ada. Misalnya, jika pengguna yang telah menyimpan sandi menyimpan sandi baru, IsiOtomatis akan meminta pengguna untuk memperbarui sandi yang ada, bukan menyimpan sandi yang baru.

Penyempurnaan Field Classification

Android Q memperkenalkan penyempurnaan Field Classification API berikut ini.

Konstruktor UserData.Builder

Konstruktor UserData.Builder telah berubah agar lebih selaras dengan pola Builder.

Mengizinkan pemetaan sebuah Nilai ke beberapa jenis ID Kategori

Saat menggunakan UserData.Builder pada Android Q, sekarang Anda dapat memetakan sebuah nilai ke beberapa ID kategori. Pada rilis sebelumnya, pengecualian ditampilkan jika sebuah nilai ditambahkan lebih dari sekali.

Dukungan yang lebih baik untuk nomor kartu kredit

Klasifikasi kolom kini dapat mendeteksi angka empat digit sebagai empat digit terakhir dari sebuah nomor kartu kredit.

Dukungan untuk klasifikasi kolom khusus aplikasi

Android Q menambahkan FillResponse.setUserData(), yang memungkinkan Anda menetapkan data pengguna khusus aplikasi sepanjang sesi. Hal ini membantu layanan IsiOtomatis mendeteksi jenis kolom dengan konten khusus aplikasi.

Kontrol UI dan sistem

Android Q menghadirkan penyempurnaan antarmuka pengguna berikut:

Mendukung cap PopFrame JFMTI

Android Q menambahkan dukungan untuk kapabilitas can_pop_frames dalam implementasi JVMTI Android. Selama proses debug, fitur ini memungkinkan Anda menjalankan kembali fungsi setelah dijeda di titik henti sementara dan menyesuaikan setelan lokal, global, atau implementasi suatu fungsi. Untuk informasi lebih lanjut, lihat halaman referensi Pop Frame Oracle.

API kontrol permukaan

Android Q menyediakan SurfaceControl API untuk akses level rendah ke compositor sistem (SurfaceFlinger). Bagi sebagian besar pengguna, SurfaceView adalah cara tepat untuk memanfaatkan compositor. SurfaceControl API dapat berguna dalam kasus tertentu, misalnya:

  • Sinkronisasi beberapa permukaan
  • Penyematan permukaan lintas proses
  • Pengelolaan masa aktif level rendah

SurfaceControl API tersedia dalam binding SDK dan NDK. Implementasi NDK mencakup API untuk pertukaran buffer secara manual dengan compositor. Hal ini memberikan alternatif bagi pengguna yang dihadapkan pada pembatasan BufferQueue.

Deteksi perender hung WebView

Android Q memperkenalkan class abstrak WebViewRenderProcessClient baru, yang dapat digunakan oleh aplikasi untuk mendeteksi jika WebView menjadi tidak responsif. Untuk menggunakan class ini:

  1. Tentukan subclass Anda sendiri, lalu implementasikan metode onRenderProcessResponsive() dan onRenderProcessUnresponsive().
  2. Lampirkan instance WebViewRenderProcessClient Anda ke satu atau beberapa objek WebView.
  3. Jika WebView menjadi tidak responsif, sistem akan memanggil metode onRenderProcessUnresponsive() klien, meneruskan WebView dan WebViewRenderProcess. (Jika WebView adalah proses tunggal, parameter WebViewRenderProcess adalah nol.) Aplikasi Anda dapat mengambil tindakan yang sesuai, seperti menampilkan kotak dialog kepada pengguna untuk menanyakan apakah mereka ingin menghentikan proses rendering.

Jika WebView tetap tidak responsif, sistem akan memanggil onRenderProcessUnresponsive() secara berkala (tidak lebih dari sekali setiap lima detik), tetapi tidak mengambil tindakan lain. Jika WebView menjadi responsif lagi, sistem akan memanggil onRenderProcessResponsive() satu kali.

Panel setelan

Android Q memperkenalkan Panel Setelan, sebuah API yang membuat aplikasi dapat menampilkan setelan ke pengguna dalam konteks aplikasi mereka. Dengan begitu pengguna tidak perlu membuka Setelan untuk mengubah menu seperti NFC atau Data seluler agar dapat menggunakan aplikasi.

Gambar 1. Pengguna mencoba membuka halaman saat perangkat tidak tersambung ke jaringan. Chrome memunculkan panel setelan Sambungan Internet...

Gambar 2. Pengguna dapat mengaktifkan Wi-Fi dan memilih jaringan tanpa keluar dari aplikasi Chrome.

Contoh, misalkan pengguna membuka browser web saat perangkat dalam mode pesawat. Sebelum Android Q, aplikasi hanya dapat menampilkan pesan umum yang meminta pengguna untuk membuka Setelan dan memulihkan konektivitas. Pada Android Q, aplikasi browser dapat menampilkan panel inline yang menampilkan setelan konektivitas utama, Wi-Fi (termasuk jaringan di sekitar), dan data seluler. Dengan panel ini, pengguna dapat memulihkan konektivitas tanpa keluar dari aplikasi.

Untuk menampilkan panel setelan, aktifkan intent dengan salah satu tindakan Settings.Panel baru:

Kotlin

    val panelIntent = Intent(Settings.Panel.settings_panel_type)
    startActivityForResult(panelIntent)
    

Java

    Intent panelIntent = new Intent(Settings.Panel.settings_panel_type);
    startActivityForResult(panelIntent);
    

settings_panel_type dapat berupa salah satu dari:

ACTION_INTERNET_CONNECTIVITY
Menampilkan setelan terkait konektivitas internet, seperti Mode pesawat, Wi-Fi, dan Data Seluler.
ACTION_WIFI:
Menampilkan setelan Wi-Fi, tetapi tidak pada setelan konektivitas lainnya. Ini berguna untuk aplikasi yang memerlukan koneksi Wi-Fi untuk menjalankan operasi upload dan download berukuran besar.
ACTION_NFC
Menampilkan semua setelan yang terkait dengan komunikasi nirkabel jarak dekat (NFC).
ACTION_VOLUME
Menampilkan setelan volume untuk semua aliran audio.

Kami berencana untuk memperkenalkan wrapper AndroidX untuk fungsionalitas ini. Saat dipanggil di perangkat yang menjalankan Android 9 (API level 28) atau yang lebih rendah, wrapper akan membuka halaman yang paling sesuai pada aplikasi Setelan.

Penyempurnaan fitur berbagi

Android Q menghadirkan sejumlah penyempurnaan untuk fitur berbagi. Untuk informasi selengkapnya, lihat Penyempurnaan fitur berbagi di Android Q.

Tema gelap

Android Q menawarkan tema Gelap baru yang berlaku untuk UI sistem Android dan aplikasi yang berjalan pada perangkat. Informasi lengkapnya dapat dilihat di Tema gelap.

Jenis layanan latar depan

Android Q memperkenalkan atribut manifes XML baru, foregroundServiceType, yang Anda sertakan ke dalam definisi beberapa layanan tertentu. Terdapat kemungkinan, meskipun jarang tepat, untuk menetapkan beberapa jenis layanan latar depan ke layanan tertentu.

Tabel berikut ini menunjukkan berbagai jenis layanan latar depan dan layanan yang sesuai untuk menyatakan jenis spesifik:

Jenis layanan latar depan Contoh kasus penggunaan untuk layanan yang seharusnya menyatakan jenis ini
connectedDevice Memantau pelacak kebugaran perangkat wearable
dataSync Mendownload file dari jaringan
location Melanjutkan tindakan yang dimulai pengguna
mediaPlayback Memutar buku audio, podcast, atau musik
mediaProjection Merekam video dari tampilan perangkat dalam waktu singkat
phoneCall Menangani panggilan telepon yang sedang berlangsung

Kotlin

Android Q menyertakan pembaruan berikut untuk pengembangan Kotlin.

Anotasi nullability untuk API libcore

Android Q meningkatkan cakupan anotasi nullability pada SDK untuk API libcore. Dengan anotasi ini, developer aplikasi yang menggunakan analisis nullability Kotlin atau Java di Android Studio dapat memperoleh informasi nullness saat berinteraksi dengan API tersebut.

Dalam kondisi normal, pelanggaran kontrak nullability di Kotlin mengakibatkan error kompilasi. Untuk memastikan kompatibilitas dengan kode yang ada, setiap anotasi baru dibatasi ke @RecentlyNullable dan @RecentlyNonNull. Akibatnya, pelanggaran nullability akan memunculkan peringatan, bukan error.

Selain itu, setiap anotasi @RecentlyNullable atau @RecentlyNonNull yang ditambahkan pada Android 9 berubah berturut-turut menjadi @Nullable dan @NonNull. Ini berarti bahwa pelanggaran nullability kini mengakibatkan error, bukan peringatan.

Untuk informasi selengkapnya tentang perubahan anotasi, lihat SDK Android Pie kini lebih cocok untuk Kotlin di Blog Developer Android.

NDK

Android Q menyertakan perubahan NDK berikut.

Proses debug yang lebih baik untuk kepemilikan deskriptor file

Android Q menambahkan fdsan untuk membantu Anda menemukan dan memperbaiki masalah kepemilikan deskriptor file dengan lebih mudah.

Bug yang terkait dengan kesalahan penanganan kepemilikan deskriptor file, yang cenderung bermanifestasi sebagai use-after-close dan double-close, dapat dianalogikan dengan bug alokasi memori use-after-free dan double-free, tetapi lebih sulit untuk didiagnosis dan diperbaiki. fdsan berupaya mendeteksi dan/atau mencegah kesalahan pengelolaan deskriptor file dengan memberlakukan kepemilikan deskriptor file.

Untuk informasi lebih lanjut tentang error yang terkait dengan masalah ini, lihat Error yang terdeteksi oleh fdsan. Untuk informasi lebih lanjut tentang fdsan, lihat halaman Googlesource terkait fdsan.

ELF TLS

Aplikasi yang dibuat menggunakan NDK dengan level API minimal 29 tidak perlu lagi menggunakan emutls, tetapi dapat menggunakan ELF TLS. Dukungan linker dinamis dan statis telah ditambahkan untuk mendukung metode penanganan variabel thread-lokal yang baru ini.

Untuk aplikasi yang menargetkan API level 28 dan lebih rendah, sejumlah penyempurnaan telah diterapkan untuk libgcc/compiler-rt sebagai solusi atas beberapa masalah emutls.

Untuk informasi lebih lanjut, lihat perubahan Android untuk developer NDK.

Runtime

Android Q mencakup perubahan runtime berikut.

Pemicuan pembersihan sampah memori berbasis Mallinfo

Saat objek Java platform kecil mereferensikan objek besar dalam heap C++, objek C++ biasanya hanya dapat diklaim kembali jika objek Java tersebut dikumpulkan dan difinalisasi. Pada rilis sebelumnya, platform memperkirakan ukuran objek C ++ yang terkait dengan objek Java. Perkiraan ini tidak selalu akurat dan terkadang mengakibatkan peningkatan penggunaan memori secara signifikan, karena platform gagal melakukan pembersihan sampah memori saat pembersihan seharusnya dilakukan.

Pada Android Q, pembersih sampah memori (GC) melacak ukuran total heap yang dialokasikan oleh malloc() sistem, sehingga memastikan bahwa alokasi malloc() yang besar selalu disertakan dalam penghitungan yang memicu GC. Sebagai akibatnya, aplikasi yang menyisipkan sejumlah besar alokasi C++ dengan eksekusi Java mungkin mengalami peningkatan frekuensi pembersihan sampah memori. Aplikasi lainnya mungkin mengalami sedikit penurunan.

Pengujian dan proses debug

Android Q menyertakan penyempurnaan berikut untuk pengujian dan proses debug.

Penyempurnaan untuk pelacakan sistem pada perangkat

Sekarang Anda dapat menentukan batas ukuran dan durasi pelacakan saat melakukan pelacakan sistem pada perangkat. Setelah Anda menentukan salah satu nilai, sistem akan melakukan pelacakan panjang, yang secara berkala menyalin buffer pelacakan ke file tujuan selagi pelacakan direkam. Pelacakan selesai ketika batas ukuran atau durasi yang Anda tentukan tercapai.

Gunakan parameter tambahan ini untuk menguji kasus penggunaan berbeda yang biasanya Anda uji dengan pelacakan standar. Misalnya, Anda mungkin mendiagnosis bug performa yang hanya terjadi setelah aplikasi Anda berjalan untuk waktu yang lama. Dalam hal ini, Anda dapat merekam pelacakan panjang yang berdurasi sehari penuh, lalu menganalisis penjadwal CPU, aktivitas disk, thread aplikasi, dan data lainnya dalam laporan untuk membantu Anda menentukan penyebab bug.

Perbaikan TextClassifier

Android Q menyediakan fungsionalitas klasifikasi teks tambahan di antarmuka TextClassifier.

Deteksi bahasa

TextClassifier kini menampilkan metode detectLanguage(). Metode ini bekerja mirip dengan metode klasifikasi yang sudah ada, yaitu menerima objek TextLanguage.Request dan mengembalikan objek TextLanguage.

Objek TextLanguage baru terdiri dari daftar penyambungan yang dipesan. Setiap penyambungan berisi lokal dan skor keyakinan yang sesuai untuk sampel teks yang diminta.

Tindakan percakapan yang disarankan

TextClassifier kini menampilkan metode suggestConversationActions(). Metode ini bekerja mirip dengan metode klasifikasi yang sudah ada, yaitu menerima objek ConversationActions.Request dan mengembalikan objek ConversationActions.

Objek ConversationActions baru terdiri dari daftar objek ConversationAction. Setiap objek ConversationAction mencakup tindakan yang disarankan dan skor keyakinannya.

Smart reply/tindakan di notifikasi

Android 9 memperkenalkan kemampuan untuk menampilkan balasan yang disarankan dalam notifikasi. Dimulai di Android Q, notifikasi juga dapat menyertakan saran tindakan berbasis intent. Selain itu, sistem kini juga dapat menghasilkan saran tersebut secara otomatis. Aplikasi tetap dapat memberikan sarannya sendiri, atau memilih tidak memakai saran yang dihasilkan sistem.

API yang digunakan untuk menghasilkan balasan ini adalah bagian dari TextClassifier , dan juga telah langsung dibuka kepada developer di Android Q. Silakan baca bagian tentang penyempurnaan TextClassifier untuk informasi lebih lanjut.

Jika aplikasi Anda memiliki saran sendiri, platform tidak akan menghasilkan saran otomatis apa pun. Jika Anda tidak ingin notifikasi aplikasi menampilkan balasan atau tindakan yang disarankan, Anda dapat memilih untuk tidak memakai balasan dan tindakan yang dihasilkan sistem menggunakan setAllowGeneratedReplies() dan setAllowSystemGeneratedContextualActions().