Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Mengoptimalkan aplikasi Anda untuk IsiOtomatis

Aplikasi yang menggunakan tampilan standar berfungsi dengan framework IsiOtomatis tanpa memerlukan konfigurasi khusus. Namun, Anda dapat mengoptimalkan cara kerja aplikasi dengan framework. Untuk tutorial berpemandu, lihat codelab Mengoptimalkan aplikasi Anda untuk IsiOtomatis.

Menyiapkan lingkungan IsiOtomatis

Bagian ini menjelaskan cara menyiapkan fungsi IsiOtomatis dasar untuk aplikasi Anda.

Mengonfigurasi layanan IsiOtomatis

Layanan IsiOtomatis harus dikonfigurasi pada perangkat agar aplikasi Anda dapat menggunakan framework IsiOtomatis. Meskipun sebagian besar ponsel dan tablet yang menjalankan Android 8.0 (API level 26) dan yang lebih tinggi sudah dilengkapi dengan layanan IsiOtomatis, sebaiknya gunakan layanan pengujian saat menguji aplikasi Anda, seperti layanan IsiOtomatis dalam contoh framework IsiOtomatis Android. Saat menggunakan emulator, Anda harus secara eksplisit menyetel layanan IsiOtomatis karena emulator mungkin tidak disertakan dengan layanan default.

Setelah Anda menginstal layanan IsiOtomatis pengujian dari aplikasi contoh, aktifkan layanan IsiOtomatis dengan membuka Setelan > Sistem > Bahasa & masukan > Lanjutan > Bantuan masukan > Layanan IsiOtomatis.

Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi emulator untuk menguji IsiOtomatis, lihat Menguji aplikasi Anda dengan IsiOtomatis.

Memberikan petunjuk untuk IsiOtomatis

Layanan IsiOtomatis akan mencoba menentukan jenis setiap tampilan menggunakan heuristik. Namun, jika aplikasi Anda bergantung pada heuristik tersebut, perilaku IsiOtomatis dapat berubah secara tidak terduga saat Anda mengupdate aplikasi. Untuk memastikan bahwa layanan IsiOtomatis mengidentifikasi faktor bentuk aplikasi dengan benar, Anda harus memberikan petunjuk IsiOtomatis.

Anda dapat menyetel petunjuk ini menggunakan atribut android:autofillHints. Contoh berikut menyetel petunjuk "sandi" pada EditText:

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:autofillHints="password" />
    

Anda juga dapat menyetel petunjuk secara terprogram menggunakan metode setAutofillHints(), seperti yang ditunjukkan pada contoh berikut:

Kotlin

    val password = findViewById<EditText>(R.id.password)
    password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD)
    

Java

    EditText password = findViewById(R.id.password);
    password.setAutofillHints(View.AUTOFILL_HINT_PASSWORD);
    

Konstanta petunjuk yang telah ditentukan sebelumnya

Framework IsiOtomatis tidak memvalidasi petunjuk; tetapi hanya diteruskan tanpa perubahan atau validasi ke layanan IsiOtomatis. Meskipun Anda dapat menggunakan nilai apa pun, class View danHintConstants AndroidX berisi daftar konstanta petunjuk yang didukung secara resmi.

Dengan menggunakan kombinasi konstanta ini, Anda dapat membuat tata letak untuk skenario IsiOtomatis umum:

Kredensial akun

Ketika melakukan IsiOtomatis untuk kredensial akun, formulir login mungkin berisi petunjuk seperti AUTOFILL_HINT_USERNAME dan AUTOFILL_HINT_PASSWORD.

Saat membuat akun baru, atau saat pengguna mengubah nama pengguna dan sandi mereka, Anda dapat menggunakan AUTOFILL_HINT_NEW_USERNAME dan AUTOFILL_HINT_NEW_PASSWORD.

Info kartu kredit

Saat meminta info kartu kredit, Anda dapat menggunakan petunjuk seperti AUTOFILL_HINT_CREDIT_CARD_NUMBER dan AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE.

Untuk tanggal habis masa berlaku kartu kredit, lakukan salah satu cara berikut:

Alamat fisik

Saat melakukan IsiOtomatis alamat fisik, Anda dapat menggunakan petunjuk seperti berikut:

Nama orang

Saat melakukan IsiOtomatis nama orang, Anda dapat menggunakan petunjuk seperti berikut:

Nomor telepon

Untuk nomor telepon, Anda dapat menggunakan cara berikut:

Sandi untuk satu kali (OTP)

Untuk sandi satu kali dalam tampilan tunggal, Anda dapat menggunakan AUTOFILL_HINT_SMS_OTP.

Saat menggunakan beberapa tampilan di mana setiap tampilan dipetakan ke satu digit OTP, Anda dapat menggunakan metode generateSmsOptHintForCharacterPosition() untuk menghasilkan petunjuk per karakter.

Menandai kolom sebagai penting untuk IsiOtomatis

Anda dapat memberi tahu sistem apakah kolom individual di aplikasi Anda harus disertakan dalam struktur tampilan untuk tujuan IsiOtomatis. Secara default, tampilan menggunakan mode IMPORTANT_FOR_AUTOFILL_AUTO, yang memungkinkan Android menggunakan heuristiknya untuk menentukan apakah tampilan tersebut penting untuk IsiOtomatis.

Anda dapat menyetel nilai pentingnya menggunakan atribut android:importantForAutofill:

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:importantForAutofill="no" />
    

Nilai importantForAutofill dapat berupa nilai apa pun yang ditentukan dalam android:importantForAutofill:

auto
Mengizinkan Sistem Android menggunakan heuristiknya untuk menentukan apakah tampilan penting untuk IsiOtomatis atau tidak.
no
Tampilan ini tidak penting untuk IsiOtomatis.
noExcludeDescendants
Tampilan ini dan turunannya tidak penting untuk IsiOtomatis.
yes
Tampilan ini penting untuk IsiOtomatis.
yesExcludeDescendants
Tampilan ini penting untuk IsiOtomatis, tetapi turunannya tidak penting untuk IsiOtomatis.

Anda juga dapat menggunakan metode setImportantForAutofill():

Kotlin

    val captcha = findViewById<TextView>(R.id.captcha)
    captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO)
    

Java

    TextView captcha = findViewById(R.id.captcha);
    captcha.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO);
    

Ada kasus ketika tampilan, struktur tampilan, atau seluruh aktivitas tidak penting untuk IsiOtomatis:

  • Kolom CAPTCHA dalam aktivitas login biasanya tidak penting untuk IsiOtomatis. Dalam kasus seperti ini, Anda dapat menandai tampilan sebagai IMPORTANT_FOR_AUTOFILL_NO.
  • Dalam tampilan saat pengguna membuat konten, seperti editor teks atau spreadsheet, keseluruhan struktur tampilan biasanya tidak penting untuk IsiOtomatis. Dalam kasus seperti ini, Anda dapat menandai tampilan sebagai IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS untuk memastikan bahwa semua turunan juga ditandai sebagai tidak penting untuk IsiOtomatis.
  • Dalam beberapa aktivitas dalam game, seperti game yang menampilkan alur game, tidak satu pun tampilan dalam aktivitas tersebut yang penting untuk IsiOtomatis. Anda dapat menandai tampilan root sebagai IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS untuk memastikan bahwa semua tampilan dalam aktivitas ditandai sebagai tidak penting untuk IsiOtomatis.

Mengaitkan situs dan data aplikasi seluler

Layanan IsiOtomatis seperti IsiOtomatis dengan Google dapat membagikan data info login pengguna di antara beberapa browser dan perangkat Android setelah aplikasi dan situs dikaitkan. Saat pengguna memilih layanan IsiOtomatis yang sama di kedua platform, login ke aplikasi web akan membuat kredensial info login tersedia untuk di-IsiOtomatis saat mereka login ke aplikasi Android yang sesuai.

Untuk mengaitkan aplikasi Android dengan situs, Anda harus meng-host Link Aset Digital dengan delegate_permission/common.get_login_creds di situs Anda. Kemudian, deklarasikan pengaitan di file AndroidManifest.xml aplikasi Anda. Untuk petunjuk detail tentang cara mengaitkan situs dengan aplikasi Android, lihat Mengaktifkan fitur login otomatis di seluruh aplikasi dan situs.

Menyelesaikan alur kerja IsiOtomatis

Bagian ini menjelaskan skenario spesifik yang dapat Anda gunakan untuk meningkatkan fungsi IsiOtomatis bagi pengguna aplikasi Anda.

Menentukan apakah IsiOtomatis diaktifkan atau tidak

Anda dapat menerapkan fungsi IsiOtomatis tambahan di aplikasi, atau bahkan dalam tampilan tertentu pada aplikasi Anda, jika fitur IsiOtomatis tersedia bagi pengguna. Misalnya, TextView menampilkan entri IsiOtomatis di menu tambahan jika IsiOtomatis diaktifkan bagi pengguna. Untuk memeriksa apakah IsiOtomatis diaktifkan bagi pengguna, panggil isEnabled()metode objekAutofillManager.

Pengguna dapat mengaktifkan atau menonaktifkan IsiOtomatis serta mengubah layanan IsiOtomatis dengan membuka Setelan > Sistem > Bahasa & masukan > Lanjutan > Bantuan masukan > Layanan IsiOtomatis. Aplikasi Anda tidak dapat mengganti setelan IsiOtomatis pengguna.

Untuk memastikan pendaftaran dan pengalaman login yang optimal bagi para pengguna tanpa fitur IsiOtomatis, pertimbangkan untuk menerapkan Smart Lock untuk Sandi.

Memaksa permintaan IsiOtomatis

Terkadang, Anda mungkin perlu memaksa permintaan IsiOtomatis agar terjadi sebagai respons atas tindakan pengguna. Misalnya, TextView menawarkan item menu IsiOtomatis jika pengguna menekan lama tampilan. Contoh kode berikut menunjukkan cara memaksa permintaan IsiOtomatis:

Kotlin

    fun eventHandler(view: View) {
        val afm = requireContext().getSystemService(AutofillManager::class.java)
        afm?.requestAutofill(view)
    }
    

Java

    public void eventHandler(View view) {
        AutofillManager afm = context.getSystemService(AutofillManager.class);
        if (afm != null) {
            afm.requestAutofill(view);
        }
    }
    

Anda juga dapat menggunakan cancel() untuk membatalkan konteks IsiOtomatis saat ini. Hal ini dapat berguna, misalnya, jika Anda memiliki tombol yang menghapus kolom pada halaman login.

Menggunakan jenis atau data IsiOtomatis yang benar untuk di kontrol alat pilih

Alat pilih berguna dalam beberapa skenario IsiOtomatis dengan menyediakan UI yang memungkinkan pengguna mengubah nilai kolom yang menyimpan data tanggal atau waktu. Misalnya, dalam formulir kartu kredit, alat pilih tanggal memungkinkan pengguna memasukkan atau mengubah tanggal habis masa berlaku kartu kredit. Namun, Anda harus menggunakan tampilan lain, seperti EditText, untuk menampilkan data saat alat pilih tidak terlihat.

Objek EditText secara native memperkirakan data IsiOtomatis untuk mengetik AUTOFILL_TYPE_TEXT. Jika menggunakan jenis data yang berbeda, Anda harus membuat tampilan kustom yang diturunkan dari EditText dan menerapkan metode yang diperlukan untuk menangani jenis data yang sesuai. Misalnya, jika Anda memiliki kolom tanggal, terapkan metode dengan logika yang secara benar menangani nilai jenis AUTOFILL_TYPE_DATE.

Saat Anda menentukan jenis data IsiOtomatis, layanan IsiOtomatis dapat membuat representasi yang sesuai dari data yang ditampilkan dalam tampilan. Untuk mengetahui informasi selengkapnya, lihat Menggunakan alat pilih dengan IsiOtomatis.

Menyelesaikan konteks IsiOtomatis

Framework IsiOtomatis menyimpan masukan pengguna untuk digunakan di masa mendatang dengan menampilkan kotak centang dialog "Simpan untuk IsiOtomatis?" setelah konteks IsiOtomatis selesai. Biasanya, konteks IsiOtomatis selesai saat aktivitas selesai. Namun, ada beberapa situasi saat Anda harus memberitahukan framework secara eksplisit; misalnya, jika Anda menggunakan aktivitas yang sama namun fragmen yang berbeda untuk layar info login dan konten. Dalam situasi khusus ini, Anda dapat menyelesaikan konteks secara eksplisit dengan memanggil AutofillManager.commit().

Dukungan untuk tampilan kustom

Tampilan kustom dapat menentukan metadata yang diekspos ke framework IsiOtomatis menggunakan API IsiOtomatis. Beberapa tampilan berfungsi sebagai penampung turunan virtual, seperti tampilan yang berisi UI yang dirender OpenGL. Tampilan ini harus menggunakan API untuk menentukan struktur informasi yang digunakan dalam aplikasi sebelum dapat berfungsi dengan framework IsiOtomatis.

Jika aplikasi Anda menggunakan tampilan kustom, Anda harus mempertimbangkan skenario berikut:

  • Tampilan kustom menyediakan struktur tampilan standar, atau struktur tampilan default.
  • Tampilan kustom memiliki struktur virtual, atau struktur tampilan yang tidak tersedia untuk framework IsiOtomatis.

Tampilan kustom dengan struktur tampilan standar

Tampilan kustom dapat menentukan metadata yang diperlukan IsiOtomatis agar berfungsi. Anda harus memastikan bahwa tampilan kustom mengelola metadata secara tepat agar dapat berfungsi dengan framework IsiOtomatis. Tampilan kustom harus melakukan tindakan berikut:

  • Tangani nilai IsiOtomatis yang dikirim framework ke aplikasi Anda.
  • Berikan jenis dan nilai IsiOtomatis ke framework.

Saat IsiOtomatis dipicu, framework IsiOtomatis akan memanggil autofill() pada tampilan Anda dan mengirimkan nilai yang akan digunakan tampilan Anda. Anda harus menerapkan autofill() untuk menentukan cara tampilan kustom Anda menangani nilai IsiOtomatis.

Tampilan Anda harus menentukan jenis dan nilai IsiOtomatis dengan mengganti masing-masing metode getAutofillType() serta getAutofillValue(). Dengan menambahkan kode ini, Anda memastikan bahwa tampilan dapat memberikan jenis dan nilai IsiOtomatis yang sesuai ke framework.

Terakhir, IsiOtomatis tidak boleh mengisi tampilan jika pengguna tidak dapat memberikan nilai untuk tampilan dalam status saat ini (misalnya, jika tampilan dinonaktifkan). Dalam hal ini, getAutofillType() harus mengembalikan AUTOFILL_TYPE_NONE, getAutofillValue() harus mengembalikan null, dan autofill() seharusnya tidak melakukan apa pun.

Kasus berikut memerlukan langkah tambahan agar dapat berfungsi dengan benar dalam framework:

  • Tampilan kustom dapat diedit.
  • Tampilan kustom berisi data sensitif.

Tampilan kustom dapat diedit

Jika tampilan dapat diedit, Anda harus memberi tahu framework IsiOtomatis tentang perubahan dengan memanggil objek notifyValueChanged() pada AutofillManager.

Tampilan kustom berisi data sensitif

Jika tampilan berisi informasi identitas pribadi (PII), seperti alamat email, nomor kartu kredit, dan sandi, tampilan harus ditandai seperti itu. Secara umum, tampilan yang kontennya berasal dari resource statis tidak akan berisi data sensitif, tetapi tampilan yang kontennya disetel secara dinamis dapat berisi data sensitif. Misalnya, label yang berisi ketik nama pengguna Anda tidak berisi data sensitif, sedangkan label yang berisi Halo, John memilikinya. Untuk menandai apakah tampilan berisi data sensitif atau tidak, terapkan onProvideAutofillStructure() dan panggil setDataIsSensitive() pada objek ViewStructure.

Contoh kode berikut menunjukkan cara menandai data dalam struktur tampilan sebagai sensitif atau tidak:

Kotlin

    override fun onProvideAutofillStructure(structure: ViewStructure, flags: Int) {
        super.onProvideAutofillStructure(structure, flags)

        // Content that comes from static resources generally isn't sensitive.
        val sensitive = !contentIsSetFromResources()
        structure.setDataIsSensitive(sensitive)
    }
    

Java

    @Override
    public void onProvideAutofillStructure(ViewStructure structure, int flags) {
        super.onProvideAutofillStructure(structure, flags);

        // Content that comes from static resources generally isn't sensitive.
        boolean sensitive = !contentIsSetFromResources();
        structure.setDataIsSensitive(sensitive);
    }
    

Jika tampilan hanya menerima nilai yang ditetapkan sebelumnya, Anda dapat menggunakan setAutofillOptions() untuk menyetel opsi yang dapat digunakan untuk IsiOtomatis tampilan ini. Secara khusus, tampilan dengan jenis IsiOtomatis AUTOFILL_TYPE_LIST harus menggunakan metode ini karena layanan IsiOtomatis dapat melakukan fungsinya secara lebih baik jika mengetahui opsi yang tersedia untuk mengisi tampilan.

Tampilan yang menggunakan adaptor, seperti Spinner, adalah kasus yang serupa. Misalnya, indikator lingkaran berputar yang menyediakan tahun yang dibuat secara dinamis (berdasarkan tahun berjalan) untuk digunakan dalam kolom habis masa berlaku kartu kredit dapat menerapkan metode getAutofillOptions() dari antarmuka Adapter untuk menyediakan daftar tahun.

Tampilan yang menggunakan ArrayAdapter juga dapat memberikan daftar nilai. ArrayAdapter secara otomatis menetapkan opsi IsiOtomatis untuk resource statis. Namun, jika Anda memberikan nilai secara dinamis, Anda harus mengganti getAutofillOptions().

Tampilan kustom dengan struktur virtual

Framework IsiOtomatis memerlukan struktur tampilan agar dapat mengedit dan menyimpan informasi di UI aplikasi Anda. Ada beberapa situasi ketika struktur tampilan tidak tersedia untuk framework:

  • Aplikasi menggunakan mesin rendering level rendah, seperti OpenGL, untuk merender UI.
  • Aplikasi menggunakan instance Canvas untuk menggambar UI.

Dalam hal ini, Anda dapat menentukan struktur tampilan dengan menerapkan onProvideAutofillVirtualStructure() dan mengikuti langkah-langkah berikut:

  1. Tingkatkan jumlah turunan dari struktur tampilan dengan memanggil addChildCount().
  2. Tambahkan turunan dengan memanggil newChild().
  3. Setel ID IsiOtomatis untuk turunan dengan memanggil setAutofillId().
  4. Setel properti yang relevan, seperti nilai dan jenis IsiOtomatis.
  5. Jika data pada turunan virtual sensitif, Anda harus meneruskan true ke setDataIsSensitive() atau sebaliknya false.

Cuplikan kode berikut menunjukkan cara membuat turunan baru dalam struktur virtual:

Kotlin

    override fun onProvideAutofillVirtualStructure(structure: ViewStructure, flags: Int) {

        super.onProvideAutofillVirtualStructure(structure, flags)

        // Create a new child in the virtual structure.
        structure.addChildCount(1)
        val child = structure.newChild(childIndex)

        // Set the autofill ID for the child.
        child.setAutofillId(structure.autofillId!!, childVirtualId)

        // Populate the child by providing properties such as value and type.
        child.setAutofillValue(childAutofillValue)
        child.setAutofillType(childAutofillType)

        // Some children can provide a list of values. For example, if the child is
        // a spinner.
        val childAutofillOptions = arrayOf<CharSequence>("option1", "option2")
        child.setAutofillOptions(childAutofillOptions)

        // Just like other types of views, mark the data as sensitive, if
        // appropriate.
        val sensitive = !contentIsSetFromResources()
        child.setDataIsSensitive(sensitive)
    }
    

Java

    @Override
    public void onProvideAutofillVirtualStructure(ViewStructure structure, int flags) {

        super.onProvideAutofillVirtualStructure(structure, flags);

        // Create a new child in the virtual structure.
        structure.addChildCount(1);
        ViewStructure child =
                structure.newChild(childIndex);

        // Set the autofill ID for the child.
        child.setAutofillId(structure.getAutofillId(), childVirtualId);

        // Populate the child by providing properties such as value and type.
        child.setAutofillValue(childAutofillValue);
        child.setAutofillType(childAutofillType);

        // Some children can provide a list of values. For example, if the child is
        // a spinner.
        CharSequence childAutofillOptions[] = { "option1", "option2" };
        child.setAutofillOptions(childAutofillOptions);

        // Just like other types of views, mark the data as sensitive, if
        // appropriate.
        boolean sensitive = !contentIsSetFromResources();
        child.setDataIsSensitive(sensitive);
    }
    

Saat elemen dalam struktur virtual berubah, Anda harus memberi tahu framework tersebut dengan melakukan tugas berikut:

  • Jika fokus di dalam turunan berubah, panggil notifyViewEntered() dan notifyViewExited() pada objek AutofillManager.
  • Jika nilai turunan berubah, panggil objek notifyValueChanged() pada AutofillManager.
  • Jika hierarki tampilan tidak lagi tersedia karena pengguna telah menyelesaikan langkah dalam alur kerja (misalnya, pengguna yang login menggunakan formulir login), panggil objek commit() pada AutofillManager.
  • Jika hierarki tampilan tidak valid lagi karena pengguna telah membatalkan langkah dalam alur kerja (misalnya, jika pengguna mengklik tombol yang menghapus formulir login), panggil objek cancel() padaAutofillManager.

Menggunakan callback pada peristiwa IsiOtomatis

Jika aplikasi Anda menyediakan tampilan pelengkapan otomatisnya sendiri, Anda memerlukan mekanisme yang memberi tahu aplikasi untuk mengaktifkan atau menonaktifkan tampilan sebagai respons terhadap perubahan dalam kemampuan UI IsiOtomatis. Framework IsiOtomatis menyediakan mekanisme ini dalam formulir AutofillCallback.

Class ini menyediakan metode onAutofillEvent(View, int) yang dipanggil oleh aplikasi setelah perubahan dalam status IsiOtomatis dikaitkan dengan tampilan. Ada juga versi overload dari metode ini, yang mencakup parameter childId yang dapat digunakan aplikasi Anda dengan tampilan virtual. Status yang tersedia didefinisikan sebagai konstanta pada callback.

Anda dapat mendaftarkan callback menggunakan metode registerCallback() dari class AutofillManager. Contoh kode berikut menunjukkan cara mendeklarasikan callback untuk peristiwa IsiOtomatis:

Kotlin

    val afm = context.getSystemService(AutofillManager::class.java)

    afm?.registerCallback(object : AutofillManager.AutofillCallback() {
        // For virtual structures, override
        // onAutofillEvent(View view, int childId, int event) instead.
        override fun onAutofillEvent(view: View, event: Int) {
            super.onAutofillEvent(view, event)
            when (event) {
                EVENT_INPUT_HIDDEN -> {
                    // The autofill affordance associated with the view was hidden.
                }
                EVENT_INPUT_SHOWN -> {
                    // The autofill affordance associated with the view was shown.
                }
                EVENT_INPUT_UNAVAILABLE -> {
                    // Autofill isn't available.
                }
            }

        }
    })
    

Java

    AutofillManager afm = getContext().getSystemService(AutofillManager.class);

    afm.registerCallback(new AutofillManager.AutofillCallback() {
        // For virtual structures, override
        // onAutofillEvent(View view, int childId, int event) instead.
        @Override
        public void onAutofillEvent(@NonNull View view, int event) {
            super.onAutofillEvent(view, event);
            switch (event) {
                case EVENT_INPUT_HIDDEN:
                    // The autofill affordance associated with the view was hidden.
                    break;
                case EVENT_INPUT_SHOWN:
                    // The autofill affordance associated with the view was shown.
                    break;
                case EVENT_INPUT_UNAVAILABLE:
                    // Autofill isn't available.
                    break;
            }
        }
    });
    

Saat tiba waktunya untuk menghapus callback, gunakan metode unregisterCallback().

Menyesuaikan drawable yang disorot IsiOtomatis

Saat tampilan di-IsiOtomatis, platform akan menampilkan Drawable pada tampilan untuk menunjukkan konten tampilan telah di-IsiOtomatis. Secara default, drawable ini adalah persegi panjang solid dengan warna transparan yang sedikit lebih gelap dari warna tema yang digunakan untuk menggambar latar belakang. Drawable tidak perlu diubah, tetapi dapat disesuaikan dengan mengganti item android:autofilledHighlightdari tema yang digunakan oleh aplikasi atau aktivitas, seperti yang ditunjukkan dalam contoh berikut:

res/values/styles.xml

<resources>
        <style name="MyAutofilledHighlight" parent="...">
            <item name="android:autofilledHighlight">@drawable/my_drawable</item>
        </style>
    </resources>
    

res/drawable/my_drawable.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="#4DFF0000" />
    </shape>
    

AndroidManifest.xml

<application ...
        android:theme="@style/MyAutofilledHighlight">
    <!-- or -->
    <activity ...
        android:theme="@style/MyAutofilledHighlight">
    

Autentikasi untuk IsiOtomatis

Layanan IsiOtomatis dapat mengharuskan pengguna untuk melakukan autentikasi sebelum layanan dapat menyelesaikan kolom di aplikasi Anda, sehingga sistem Android akan meluncurkan aktivitas autentikasi layanan sebagai bagian dari stack aktivitas Anda.

Anda tidak perlu mengupdate aplikasi untuk mendukung autentikasi karena autentikasi terjadi dalam layanan. Namun, Anda harus memastikan agar struktur tampilan aktivitas dipertahankan saat aktivitas dimulai ulang (misalnya, dengan membuat struktur tampilan di onCreate(), bukan di onStart() atau onResume().

Anda dapat memverifikasi bagaimana aplikasi Anda berperilaku ketika layanan IsiOtomatis memerlukan autentikasi menggunakan HeuristicsService dari contoh AutofillFramework dan mengonfigurasinya agar memerlukan autentikasi respons pengisian. Anda juga dapat menggunakan contoh BadViewStructureCreationSignInActivity untuk mengemulasi masalah ini.

Menetapkan ID IsiOtomatis untuk tampilan yang didaur ulang

Penampung yang mendaur ulang tampilan, seperti class RecyclerView, sangat berguna untuk aplikasi yang perlu menampilkan daftar scroll elemen berdasarkan set data besar. Saat penampung di-scroll, sistem akan menggunakan kembali tampilan dalam tata letak, namun tampilan akan berisi konten baru. Jika konten awal tampilan diisi, layanan IsiOtomatis akan mempertahankan makna logis tampilan menggunakan ID IsiOtomatisnya. Masalah terjadi saat, karena sistem menggunakan kembali tampilan dalam tata letak, ID logis penayangan tetap sama, sehingga menyebabkan data pengguna IsiOtomatis yang salah dikaitkan dengan ID IsiOtomatis.

Untuk mengatasi masalah ini di perangkat yang menjalankan Android 9 (API level 28) dan yang lebih tinggi, Anda dapat secara eksplisit mengelola tampilan IsiOtomatis yang digunakan oleh RecyclerView menggunakan metode baru ini:

  • Metode getNextAutofillId() mendapatkan ID IsiOtomatis baru yang unik untuk aktivitas tersebut.
  • Metode setAutofillId() menyetel ID IsiOtomatis yang unik dan logis dari tampilan ini dalam aktivitas.

Mengatasi masalah umum

Bagian ini memberikan penyelesaian masalah umum dalam framework IsiOtomatis.

Dialog yang diubah ukurannya tidak dipertimbangkan untuk IsiOtomatis

Di Android 8.1 (API level 27) dan yang lebih rendah, jika tampilan dalam dialog diubah ukurannya setelah ditampilkan, tampilan tidak dipertimbangkan untuk IsiOtomatis. Tampilan tersebut tidak disertakan dalam objek AssistStructure yang dikirimkan oleh sistem Android ke layanan IsiOtomatis. Sehingga, layanan tidak dapat mengisi tampilan.

Untuk mengatasi masalah ini, ganti properti token dari parameter jendela dialog dengan properti token dari aktivitas yang membuat dialog. Setelah Anda memvalidasi bahwa IsiOtomatis diaktifkan, simpan parameter jendela di metode onWindowAttributesChanged()dari class yang mewarisi dari Dialog. Lalu, ganti properti token dari parameter yang disimpan dengan properti token dari aktivitas induk di metode onAttachedToWindow().

Cuplikan kode berikut menunjukkan class yang menerapkan solusi:

Kotlin

    class MyDialog(context: Context) : Dialog(context) {

        // Used to store the dialog window parameters.
        private var token: IBinder? = null

        private val isDialogResizedWorkaroundRequired: Boolean
            get() {
                if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
                    return false
                }
                val autofillManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    context.getSystemService(AutofillManager::class.java)
                } else {
                    null
                }
                return autofillManager?.isEnabled ?: false
            }

        override fun onWindowAttributesChanged(params: WindowManager.LayoutParams) {
            if (params.token == null && token != null) {
                params.token = token
            }

            super.onWindowAttributesChanged(params)
        }

        override fun onAttachedToWindow() {
            if (isDialogResizedWorkaroundRequired) {
                token = ownerActivity!!.window.attributes.token
            }

            super.onAttachedToWindow()
        }

    }
    

Java

    public class MyDialog extends Dialog {

        public MyDialog(Context context) {
            super(context);
        }

        // Used to store the dialog window parameters.
        private IBinder token;

        @Override
        public void onWindowAttributesChanged(WindowManager.LayoutParams params) {
            if (params.token == null && token != null) {
                params.token = token;
            }

            super.onWindowAttributesChanged(params);
        }

        @Override
        public void onAttachedToWindow() {
            if (isDialogResizedWorkaroundRequired()) {
                token = getOwnerActivity().getWindow().getAttributes().token;
            }

            super.onAttachedToWindow();
        }

        private boolean isDialogResizedWorkaroundRequired() {
            if (Build.VERSION.SDK_INT != Build.VERSION_CODES.O
                    || Build.VERSION.SDK_INT != Build.VERSION_CODES.O_MR1) {
                return false;
            }
            AutofillManager autofillManager =
                    null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                autofillManager = getContext().getSystemService(AutofillManager.class);
            }
            return autofillManager != null && autofillManager.isEnabled();
        }

    }
    

Untuk menghindari operasi yang tidak perlu, cuplikan kode berikut menunjukkan cara memeriksa apakah IsiOtomatis didukung di perangkat dan diaktifkan untuk pengguna saat ini, dan apakah solusi ini diwajibkan:

Kotlin

    // AutofillExtensions.kt

    fun Context.isDialogResizedWorkaroundRequired(): Boolean {
        // After the issue is resolved on Android, you should check if the
        // workaround is still required for the current device.
        return isAutofillAvailable()
    }

    fun Context.isAutofillAvailable(): Boolean {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            // The autofill framework is only available on Android 8.0
            // or higher.
            return false
        }

        val afm = getSystemService(AutofillManager::class.java)
        // Return true if autofill is supported by the device and enabled
        // for the current user.
        return afm != null && afm.isEnabled
    }
    

Java

    public class AutofillHelper {

        public static boolean isDialogResizedWorkaroundRequired(Context context) {
            // After the issue is resolved on Android, you should check if the
            // workaround is still required for the current device.
            return isAutofillAvailable(context);
        }

        public static boolean isAutofillAvailable(Context context) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
                // The autofill framework is only available on Android 8.0
                // or higher.
                return false;
            }

            AutofillManager afm = context.getSystemService(AutofillManager.class);
            // Return true if autofill is supported by the device and enabled
            // for the current user.
            return afm != null && afm.isEnabled();
        }
    }
    

Menguji aplikasi Anda dengan IsiOtomatis

Sebagian besar aplikasi berfungsi dengan layanan IsiOtomatis tanpa perubahan apa pun. Namun, Anda dapat mengoptimalkan aplikasi untuk memastikannya berfungsi sebaik mungkin dengan layanan IsiOtomatis. Setelah mengoptimalkan aplikasi, Anda harus mengujinya untuk memastikan aplikasi berfungsi dengan layanan IsiOtomatis seperti yang diharapkan.

Anda harus menggunakan emulator atau perangkat fisik yang menjalankan Android 8.0 (API level 26) atau yang lebih tinggi untuk menguji aplikasi Anda. Untuk mengetahui informasi selengkapnya tentang cara membuat emulator, lihat Membuat dan mengelola perangkat virtual.

Menginstal layanan IsiOtomatis

Sebelum dapat menguji aplikasi dengan fitur IsiOtomatis, Anda perlu memasang aplikasi lain yang menyediakan layanan IsiOtomatis. Anda dapat menggunakan aplikasi pihak ketiga untuk tujuan ini, tetapi akan lebih mudah jika menggunakan layanan IsiOtomatis contoh sehingga Anda tidak perlu mendaftar ke layanan pihak ketiga mana pun.

Anda dapat menggunakan contoh framework IsiOtomatis Android untuk menguji aplikasi dengan layanan IsiOtomatis. Aplikasi contoh menyediakan class Activity layanan otomatis dan klien yang dapat Anda gunakan untuk menguji alur kerja sebelum menggunakannya dengan aplikasi Anda. Halaman ini merujuk pada aplikasi contoh android-AutofillFramework.

Setelah menginstal aplikasi, Anda harus mengaktifkan layanan IsiOtomatis di setelan sistem. Anda dapat mengaktifkan layanan dengan membuka Setelan > Sistem > Bahasa & masukan > Lanjutan > Masukan bantuan > Layanan IsiOtomatis.

Menganalisis persyaratan data

Untuk menguji aplikasi dengan layanan IsiOtomatis, layanan harus memiliki data yang dapat digunakan untuk mengisi aplikasi Anda. Layanan ini juga perlu memahami jenis data yang diharapkan dalam tampilan aplikasi Anda. Misalnya, jika aplikasi Anda memiliki tampilan yang mengharapkan nama pengguna, layanan harus memiliki set data yang berisi nama pengguna dan beberapa mekanisme untuk mengetahui bahwa tampilan tersebut mengharapkan data tersebut.

Anda harus mengizinkan layanan untuk mengetahui jenis data yang diharapkan dalam tampilan dengan menyetel atribut android:autofillHints. Beberapa layanan menggunakan heuristik canggih untuk menentukan jenis data, namun yang lain, seperti aplikasi contoh, bergantung pada developer untuk menyediakan informasi ini. Aplikasi Anda berfungsi lebih baik dengan layanan IsiOtomatis jika Anda menyetel atribut android:autofillHints pada tampilan yang relevan untuk IsiOtomatis.

Menjalankan pengujian

Setelah menganalisis persyaratan data, Anda dapat menjalankan pengujian, yang mencakup menyimpan data pengujian di layanan IsiOtomatis dan memicu IsiOtomatis di aplikasi Anda.

Menyimpan data di layanan

Langkah berikut menunjukkan cara menyimpan data di layanan IsiOtomatis yang saat ini aktif:

  1. Buka aplikasi yang berisi tampilan yang mengharapkan jenis data yang ingin Anda gunakan selama pengujian. Aplikasi sampel android-AutofillFramework menyediakan tampilan dengan UI yang mengharapkan beberapa jenis data, seperti nomor kartu kredit dan nama pengguna.
  2. Ketuk tampilan yang menyimpan jenis data yang Anda butuhkan.
  3. Ketik nilai ke dalam tampilan.
  4. Ketuk tombol konfirmasi, seperti Login atau Kirim.

    Anda biasanya harus mengirimkan formulir sebelum layanan mencoba menyimpan data.

  5. Sistem akan menampilkan dialog yang meminta izin Anda untuk menyimpan data. Dialog menampilkan nama layanan yang saat ini aktif.

    Verifikasi bahwa ini adalah layanan yang ingin Anda gunakan dalam pengujian, lalu ketuk Simpan.

Jika Android tidak menampilkan dialog izin, atau layanan bukan yang ingin Anda gunakan dalam pengujian, periksa apakah layanan tersebut saat ini aktif di setelan sistem.

Memicu IsiOtomatis di aplikasi Anda

Langkah berikut menunjukkan cara memicu IsiOtomatis di aplikasi Anda:

  1. Buka aplikasi, lalu buka aktivitas yang memiliki tampilan yang ingin Anda uji.
  2. Ketuk tampilan yang harus diisi.
  3. Sistem akan menampilkan UI IsiOtomatis, yang berisi set data yang dapat mengisi tampilan, seperti yang ditunjukkan pada Gambar 1.
  4. Ketuk set data yang berisi data yang ingin Anda gunakan. Tampilan akan menampilkan data yang sebelumnya disimpan di layanan.
UI IsiOtomatis menampilkan “dataset-2” sebagai set data yang tersedia
Gambar 1. UI IsiOtomatis menampilkan set data yang tersedia.

Jika Android tidak menampilkan UI IsiOtomatis, Anda dapat mencoba opsi pemecahan masalah berikut:

  • Pastikan bahwa tampilan di aplikasi Anda menggunakan nilai yang benar dalam atribut android:autofillHints. Untuk daftar nilai untuk atribut yang dimungkinkan, lihat konstanta yang diawali dengan AUTOFILL_HINT dalam class View.
  • Periksa apakah atribut android:importantForAutofill disetel ke nilai selain no pada tampilan yang harus diisi, atau disetel ke nilai selain noExcludeDescendants pada tampilan atau salah satu induknya.