Uygulamanızı otomatik doldurma için optimize etme

Standart görünümler kullanan uygulamalar, özel yapılandırma gerektirmeden otomatik doldurma çerçevesiyle çalışır. Ayrıca uygulamanızın çerçeve ile çalışma şeklini optimize edebilirsiniz.

Otomatik doldurma ortamını ayarlama

Bu bölümde, uygulamanız için temel otomatik doldurma işlevini nasıl ayarlayacağınız açıklanmaktadır.

Otomatik doldurma hizmetini yapılandırma

Uygulamanızın otomatik doldurma çerçevesini kullanması için cihazınızda bir otomatik doldurma hizmeti yapılandırılmalıdır. Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran çoğu telefon ve tablet otomatik doldurma hizmetiyle birlikte gönderilse de uygulamanızı test ederken Android otomatik doldurma çerçevesi örneğindeki otomatik doldurma hizmeti gibi bir test hizmeti kullanmanızı öneririz. Emülatör kullanırken varsayılan bir hizmetle gelmeyebileceğinden açıkça bir otomatik doldurma hizmeti ayarlayın.

Örnek uygulamadan test otomatik doldurma hizmetini yükledikten sonra Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek otomatik doldurma hizmetini etkinleştirin.

Otomatik doldurmayı test etmek üzere bir emülatör yapılandırma hakkında daha fazla bilgi için Uygulamanızı otomatik doldurma ile test etme bölümüne bakın.

Otomatik doldurma için ipuçları ver

Otomatik doldurma hizmeti, her görünümün türünü bulgusal yöntemler kullanarak belirler. Ancak uygulamanız bu buluşsal yöntemlere başvurursa otomatik doldurma davranışı, siz uygulamanızı güncellerken beklenmedik bir şekilde değişebilir. Otomatik doldurma hizmetinin, uygulamanızın form faktörlerini doğru bir şekilde tanımladığından emin olmak için otomatik doldurma ipuçları sağlayın.

android:autofillHints özelliğini kullanarak otomatik doldurma ipuçlarını ayarlayabilirsiniz. Aşağıdaki örnekte EditText üzerinde bir "password" ipucu ayarlanmaktadır:

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

İpuçlarını, aşağıdaki örnekte gösterildiği gibi setAutofillHints() yöntemini kullanarak programatik olarak da ayarlayabilirsiniz:

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

Önceden tanımlanmış ipucu sabitlerini dahil et

Otomatik doldurma çerçevesi, ipuçlarını doğrulamaz. Bu ipuçları, değişiklik veya doğrulama yapılmadan otomatik doldurma hizmetinde iletilir. Herhangi bir değeri kullanabilirsiniz ancak View ve AndroidX HintConstants sınıfları, resmi olarak desteklenen ipucu sabitlerinin listelerini içerir.

Bu sabit değerlerin bir kombinasyonunu kullanarak yaygın otomatik doldurma senaryoları için düzenler oluşturabilirsiniz:

Hesap kimlik bilgileri

Giriş formuna AUTOFILL_HINT_USERNAME ve AUTOFILL_HINT_PASSWORD gibi hesap bilgisi ipuçlarını ekleyebilirsiniz.

Yeni bir hesap oluşturmak için veya kullanıcılar kullanıcı adlarını ve şifrelerini değiştirdiklerinde, AUTOFILL_HINT_NEW_USERNAME ve AUTOFILL_HINT_NEW_PASSWORD araçlarını kullanabilirsiniz.

Kredi kartı bilgileri

Kredi kartı bilgileri isterken AUTOFILL_HINT_CREDIT_CARD_NUMBER ve AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE gibi ipuçları kullanabilirsiniz.

Kredi kartı son kullanma tarihleri için aşağıdakilerden birini yapın:

Fiziksel adres

Fiziksel adres form alanlarında aşağıdakiler gibi ipuçları kullanabilirsiniz:

Kişilerin adları

Kişilerin adlarını isterken aşağıdakiler gibi ipuçları kullanabilirsiniz:

Telefon numaraları

Telefon numaraları için aşağıdakileri kullanabilirsiniz:

Tek kullanımlık şifre (OTP)

Tek bir görünümde tek kullanımlık şifre için AUTOFILL_HINT_SMS_OTP seçeneğini kullanabilirsiniz.

Her görünümün OTP'nin tek bir basamağıyla eşleştiği birden çok görünüm için, karakter başına ipuçları oluşturmak üzere generateSmsOtpHintForCharacterPosition() yöntemini kullanabilirsiniz.

Otomatik doldurma için alanları önemli olarak işaretleme

Otomatik doldurma amacıyla uygulamanızdaki her bir alanı görünüm yapısına ekleyebilirsiniz. Görünümler, varsayılan olarak IMPORTANT_FOR_AUTOFILL_AUTO modunu kullanır. Bu mod, Android'in bir görünümün otomatik doldurma için önemli olup olmadığını belirlemek üzere buluşsal yöntemleri kullanmasına olanak tanır.

Bununla birlikte, bir görünümün, görünüm yapısının veya tüm etkinliğin otomatik doldurma için önemli olmadığı durumlar vardır:

  • Bir giriş etkinliğinde CAPTCHA alanı
  • Kullanıcının içerik oluşturduğu bir görünüm (ör. metin veya e-tablo düzenleyicisi)
  • Oyunun oynanışını gösterenler gibi oyunlardaki bazı etkinliklerdeki görüntülemeler

android:importantForAutofill özelliğini kullanarak bir görünümün otomatik doldurma için önemini ayarlayabilirsiniz:

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

importantForAutofill değeri şunlardan herhangi biri olabilir:

auto
Android sisteminin, görünümün otomatik doldurma için önemli olup olmadığını belirlemek amacıyla buluşsal yöntemleri kullanmasına izin verin.
no
Bu görünüm otomatik doldurma için önemli değildir.
noExcludeDescendants
Bu görünüm ve alt öğeleri otomatik doldurma için önemli değildir.
yes
Bu görünüm otomatik doldurma için önemlidir.
yesExcludeDescendants
Bu görünüm otomatik doldurma için önemlidir ancak otomatik doldurma için alt öğeleri önemli değildir.

setImportantForAutofill() yöntemini de kullanabilirsiniz:

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

Yukarıdaki örnek kullanım alanlarını otomatik doldurma için önemsiz olduğunu aşağıdaki şekilde belirtebilirsiniz:

  • Giriş etkinliğindeki bir CAPTCHA alanı: Bu görünümü önemsiz olarak işaretlemek için android:importantForAutofill="no" veya IMPORTANT_FOR_AUTOFILL_NO alanını kullanın.
  • Kullanıcının içerik oluşturduğu bir görünüm: Görünüm yapısının tamamını önemsiz olarak işaretlemek için android:importantForAutofill="noExcludeDescendants" veya IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS kullanın.
  • Oyunlardaki bazı etkinliklerdeki görüntüleme sayısı: Görünüm yapısının tamamını önemsiz olarak işaretlemek için android:importantForAutofill="noExcludeDescendants" veya IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS kullanın.

Web sitesi ve mobil uygulama verilerini ilişkilendirme

Google ile otomatik doldurma gibi otomatik doldurma hizmetleri, bir uygulama ve bir web sitesi ilişkilendirildikten sonra tarayıcılar ve Android cihazlar arasında kullanıcı giriş verilerini paylaşabilir. Bir kullanıcı her iki platformda da aynı otomatik doldurma hizmetini seçtiğinde, web uygulamanızda oturum açtığınızda giriş kimlik bilgileri, ilgili Android uygulamanızda oturum açtığında otomatik olarak doldurulabilir.

Android uygulamanızı web sitenizle ilişkilendirmek için sitenizde delegate_permission/common.get_login_creds ilişkisiyle bir Dijital Öğe Bağlantısı barındırın. Ardından, uygulamanızın AndroidManifest.xml dosyasında ilişkilendirmeyi beyan edin. Web sitenizi Android uygulamanızla ilişkilendirme hakkında ayrıntılı talimatlar için Uygulamalarda ve web sitelerinde otomatik oturum açmayı etkinleştirme bölümüne bakın.

Otomatik doldurma iş akışını tamamlama

Bu bölümde, uygulamanızın kullanıcıları için otomatik doldurma işlevini iyileştirmek amacıyla uygulayabileceğiniz belirli senaryolar açıklanmaktadır.

Otomatik doldurmanın etkin olup olmadığını belirleme

Kullanıcılar Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek otomatik doldurmayı etkinleştirebilir veya devre dışı bırakabilir ve otomatik doldurma hizmetini değiştirebilir. Uygulamanız kullanıcının otomatik doldurma ayarlarını geçersiz kılamaz. Ancak otomatik doldurma özelliği kullanıcı tarafından kullanılabiliyorsa uygulamanızda veya uygulamanızın belirli görünümlerinde ek otomatik doldurma işlevleri uygulayabilirsiniz.

Örneğin, kullanıcı için otomatik doldurma etkinse TextView, taşma menüsünde bir otomatik doldurma girişi gösterir. Otomatik doldurmanın kullanıcı için etkinleştirilip etkinleştirilmediğini kontrol etmek istiyorsanız AutofillManager nesnesinin isEnabled() yöntemini çağırın.

Otomatik doldurma özelliği olmayan kullanıcılar için kaydolma ve giriş yapma deneyiminizin optimize edildiğinden emin olmak amacıyla One Tap ile oturum açma özelliğini uygulayın.

Otomatik doldurma isteğini zorla

Bazen bir kullanıcı işlemine yanıt olarak bir otomatik doldurma isteğini uygulamaya zorlamanız gerekir. Örneğin, kullanıcı görünüme dokunup basılı tuttuğunda TextView, bir otomatik doldurma menü öğesi sunar. Aşağıdaki kod örneğinde, bir otomatik doldurma isteğinin nasıl zorunlu kılınacağı gösterilmektedir:

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

Mevcut otomatik doldurma bağlamını iptal etmek için cancel() yöntemini de kullanabilirsiniz. Bu, giriş sayfasındaki alanları temizleyen bir düğmeniz varsa yararlı olabilir.

Seçici kontrollerindeki veriler için doğru otomatik doldurma türünü kullanma

Seçiciler, kullanıcıların tarih veya saat verilerinin depolandığı bir alanın değerini değiştirmesine olanak tanıyan bir kullanıcı arayüzü sunarak otomatik doldurma özelliğiyle ilgili olarak faydalı olabilir. Örneğin, kredi kartı formunda tarih seçici, kullanıcıların kredi kartlarının son kullanma tarihini girmelerine veya değiştirmelerine olanak tanır. Ancak, seçici görünür olmadığında verileri görüntülemek için EditText gibi başka bir görünüm kullanmanız gerekir.

EditText nesnesi yerel olarak AUTOFILL_TYPE_TEXT türünde otomatik doldurma verilerini bekler. Farklı türde veriler kullanıyorsanız EditText öğesinden devralan ve karşılık gelen veri türünü işlemek için gereken yöntemleri uygulayan özel bir görünüm oluşturun. Örneğin, tarih alanınız varsa yöntemleri AUTOFILL_TYPE_DATE türündeki değerleri doğru şekilde işleyen bir mantıkla uygulayın.

Otomatik doldurma veri türünü belirlediğinizde otomatik doldurma hizmeti, görünümde gösterilen verilerin uygun bir temsilini oluşturabilir. Daha fazla bilgi edinmek için Otomatik doldurma özelliğiyle seçicileri kullanma bölümünü inceleyin.

Otomatik doldurma bağlamını tamamla

Otomatik doldurma çerçevesi, otomatik doldurma bağlamı bittikten sonra "Otomatik doldurma için kaydedilsin mi?" iletişim kutusu göstererek kullanıcı girişini gelecekte kullanılmak üzere kaydeder. Genellikle bir etkinlik bittiğinde otomatik doldurma bağlamı da sona erer. Bununla birlikte, çerçeveyi açık bir şekilde bildirmeniz gereken bazı durumlar vardır. Örneğin, hem giriş hem de içerik ekranlarınız için aynı etkinliği ancak farklı parçaları kullanıyorsanız. Bu durumlarda, AutofillManager.commit() yöntemini çağırarak bağlamı açıkça tamamlayabilirsiniz.

Özel görünümler için destek

Özel görünümler, autofill API'sini kullanarak otomatik doldurma çerçevesine sunulan meta verileri belirtebilir. Bazı görünümler, sanal alt öğelerin kapsayıcısı görevi görür (ör. OpenGL tarafından oluşturulan kullanıcı arayüzü içeren görünümler). Bu görünümlerin, otomatik doldurma çerçevesiyle çalışmadan önce uygulamada kullanılan bilgilerin yapısını belirtmek için API'yi kullanması gerekir.

Uygulamanızda özel görünümler kullanılıyorsa aşağıdaki senaryoları göz önünde bulundurun:

  • Özel görünüm, standart görünüm yapısı veya varsayılan bir görünüm yapısı sağlar.
  • Özel görünüm, sanal bir yapıya veya otomatik doldurma çerçevesinde kullanılamayan bir görünüm yapısına sahiptir.

Standart görünüm yapısına sahip özel görünümler

Özel görünümler, otomatik doldurmanın çalışması için gereken meta verileri tanımlayabilir. Özel görünümünüzün meta verileri otomatik doldurma çerçevesiyle çalışacak şekilde uygun şekilde yönettiğinden emin olun. Özel görünümünüz şu işlemleri yapmalıdır:

  • Çerçevenin uygulamanıza gönderdiği otomatik doldurma değerini işleyin.
  • Çerçeveye otomatik doldurma türünü ve değerini sağlayın.

Otomatik doldurma tetiklendiğinde otomatik doldurma çerçevesi, görünümünüzde autofill() kodunu çağırır ve görünümünüzün kullanması gereken değeri gönderir. Özel görünümünüzün otomatik doldurma değerini nasıl işleyeceğini belirtmek için autofill() işlevini uygulayın.

Görünümünüz, sırasıyla getAutofillType() ve getAutofillValue() yöntemlerini geçersiz kılarak bir otomatik doldurma türü ve değeri belirtmelidir.

Son olarak, otomatik doldurma, kullanıcı görünüm için mevcut durumuyla bir değer sağlayamıyorsa (örneğin, görünüm devre dışıysa) görünümü doldurmamalıdır. Bu durumlarda getAutofillType(), AUTOFILL_TYPE_NONE değerini, getAutofillValue() null değerini ve autofill() hiçbir şey yapmamalıdır.

Aşağıdaki durumlarda, çerçeve içinde düzgün çalışmak için ek adımlar gerekir:

  • Özel görünüm düzenlenebilir.
  • Özel görünüm hassas veriler içeriyor.

Özel görünüm düzenlenebilir

Görünüm düzenlenebilirse AutofillManager nesnesinde notifyValueChanged() çağrısı yaparak otomatik doldurma çerçevesini değişiklikler hakkında bilgilendirin.

Özel görünüm hassas veriler içeriyor

Bir görünümde e-posta adresleri, kredi kartı numaraları ve şifreler gibi kimliği tanımlayabilecek bilgiler (PII) varsa bu bilgiler hassas olarak işaretlenmelidir.

Genel olarak, içeriği statik kaynaklardan gelen görünümler hassas veri içermez ancak içeriği dinamik olarak ayarlanan görünümler hassas veriler içerebilir. Örneğin, kullanıcı adınızı girin ifadesini içeren bir etiket hassas veri içermezken Merhaba Can içeren bir etiket hassas veri içermez.

Otomatik doldurma çerçevesi, tüm verilerin varsayılan olarak hassas olduğunu varsayar. Hassas olmayan verileri işaretleyebilirsiniz.

Bir görünümün hassas veriler içerip içermediğini işaretlemek için ViewStructure nesnesine onProvideAutofillStructure() uygulayın ve setDataIsSensitive() öğesini çağırın.

Aşağıdaki kod örneğinde, görünüm yapısındaki verilerin hassas değil olarak nasıl işaretleneceği gösterilmektedir:

Kotlin

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

    structure.setDataIsSensitive(false)
}

Java

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

    structure.setDataIsSensitive(false);
}

Bir görünüm yalnızca önceden tanımlanmış değerleri kabul ediyorsa görünümü otomatik olarak doldurmak için kullanılabilecek seçenekleri belirlemek üzere setAutofillOptions() yöntemini kullanabilirsiniz. Otomatik doldurma türü AUTOFILL_TYPE_LIST olan görünümlerin özellikle bu yöntemi kullanması gerekir. Çünkü otomatik doldurma hizmeti, görünümü doldurmak için sunulan seçenekleri bilirse daha iyi iş çıkarabilir.

Spinner gibi bir bağdaştırıcı kullanan görünümler de benzerdir. Örneğin, kredi kartı son kullanma alanlarında kullanılmak üzere mevcut yıla göre dinamik olarak oluşturulan yılları gösteren bir döner simge, yıl listesi sağlamak için Adapter arayüzünün getAutofillOptions() yöntemini uygulayabilir.

ArrayAdapter kullanan görünümler de değer listeleri sağlayabilir. ArrayAdapter, statik kaynaklar için otomatik doldurma seçeneklerini otomatik olarak ayarlar. Değerleri dinamik olarak sağlıyorsanız getAutofillOptions() değerini geçersiz kılın.

Sanal yapılı özel görünümler

Otomatik doldurma çerçevesinin, uygulamanızın kullanıcı arayüzündeki bilgileri düzenleyip kaydedebilmesi için bir görünüm yapısı gerekir. Görünüm yapısı aşağıdaki durumlarda çerçevede kullanılamaz:

  • Uygulama, kullanıcı arayüzünü oluşturmak için OpenGL gibi alt düzey bir oluşturma motoru kullanır.
  • Uygulama, kullanıcı arayüzünü çizmek için bir Canvas örneği kullanır.

Bu durumlarda, onProvideAutofillVirtualStructure() özelliğini uygulayıp aşağıdaki adımları uygulayarak bir görünüm yapısı belirtebilirsiniz:

  1. addChildCount() yöntemini çağırarak görüntüleme yapısının alt sayısını artırın.
  2. newChild() numaralı telefonu arayarak bir çocuk ekleyin.
  3. setAutofillId() yöntemini çağırarak çocuğun otomatik doldurma kimliğini ayarlayın.
  4. Otomatik doldurma değeri ve türü gibi ilgili özellikleri ayarlayın.
  5. Sanal alt öğedeki veriler hassassa true öğesini setDataIsSensitive() adresine, aksi takdirde false aktarın.

Aşağıdaki kod snippet'i, sanal yapıda yeni bir alt öğe oluşturmayı göstermektedir:

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, such as when 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 when
    // 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, such as when the child is
    // a spinner.
    CharSequence childAutofillOptions[] = { "option1", "option2" };
    child.setAutofillOptions(childAutofillOptions);

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

Sanal bir yapıdaki öğeler değiştiğinde, aşağıdaki görevleri gerçekleştirerek çerçeveyi bilgilendirin:

  • Alt öğelerin içindeki odak değişirse AutofillManager nesnesini notifyViewEntered() ve notifyViewExited() çağırın.
  • Bir alt öğenin değeri değişirse AutofillManager nesnesinde notifyValueChanged() çağrısı yapın.
  • Kullanıcı, iş akışındaki bir adımı tamamladığı için (örneğin, bir giriş formu kullanarak oturum açtığında) görünüm hiyerarşisi artık kullanılamıyorsa AutofillManager nesnesinde commit() çağrısı yapın.
  • Kullanıcı, iş akışındaki bir adımı iptal ettiği için (ör. kullanıcı, giriş formunu temizleyen bir düğmeye dokunduğunda) görünüm hiyerarşisi geçerli değilse AutofillManager nesnesinde cancel() çağrısı yapın.

Otomatik doldurma etkinliklerinde geri çağırmaları kullanma

Uygulamanız kendi otomatik tamamlama görünümlerini sağlıyorsa uygulamaya, kullanıcı arayüzü otomatik doldurma ücretindeki değişikliklere yanıt olarak görünümleri etkinleştirmesini veya devre dışı bırakmasını söyleyen bir mekanizmaya ihtiyacınız vardır. Otomatik doldurma çerçevesi, bu mekanizmayı AutofillCallback biçiminde sağlar.

Bu sınıfta, bir görünümle ilişkili otomatik doldurma durumunda değişiklik olduğunda uygulamanın çağırdığı onAutofillEvent(View, int) yöntemi sunulmaktadır. Bu yöntemin, uygulamanızın sanal görünümlerde kullanabileceği childId parametresini içeren aşırı yüklenmiş bir sürümü de vardır. Kullanılabilir durumlar, geri çağırmada sabit değerler olarak tanımlanır.

AutofillManager sınıfının registerCallback() yöntemini kullanarak geri çağırma kaydedebilirsiniz. Aşağıdaki kod örneğinde, otomatik doldurma etkinlikleri için bir geri çağırmanın nasıl bildirileceği gösterilmektedir:

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

Geri çağırmayı kaldırma zamanı geldiğinde unregisterCallback() yöntemini kullanın.

Vurgulanan çekilebilir otomatik doldurmayı özelleştirin

Bir görünüm otomatik olarak doldurulduğunda platform, görünüm içeriklerinin otomatik olarak doldurulduğunu belirtmek için görünüm üzerinde bir Drawable oluşturur. Varsayılan olarak bu çekilebilir öğe, arka plan çizmek için kullanılan temanın renginden biraz daha koyu olan yarı saydam rengine sahip düz bir dikdörtgendir. Çekilebilir öğenin değiştirilmesi gerekmez ancak aşağıdaki örnekte gösterildiği gibi, uygulama veya etkinlik tarafından kullanılan tema'nın android:autofilledHighlight öğesi geçersiz kılınarak özelleştirilebilir:

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

Otomatik doldurma için kimlik doğrulaması yapın

Otomatik doldurma hizmeti, hizmetin uygulamanızdaki alanları doldurabilmesi için kullanıcının kimlik doğrulamasını zorunlu kılabilir. Bu durumda Android sistemi, etkinlik yığınının bir parçası olarak hizmetin kimlik doğrulama etkinliğini başlatır.

Kimlik doğrulama hizmet içinde gerçekleştiğinden kimlik doğrulamayı desteklemek için uygulamanızı güncellemeniz gerekmez. Bununla birlikte, etkinlik yeniden başlatıldığında (ör. görünüm yapısını onStart() veya onResume()'da değil, onCreate() içinde oluşturarak) etkinliğin görünüm yapısının korunduğundan emin olmanız gerekir.

Bir otomatik doldurma hizmeti kimlik doğrulama gerektiğinde uygulamanızın nasıl davrandığını doğrulamak için AutofillFramework örneğinden HeuristicsService'i kullanıp doldurma yanıtı kimlik doğrulamasını zorunlu kılacak şekilde yapılandırabilirsiniz. Bu sorunu emüle etmek için BadViewStructureCreationSignInActivity örneği öğesini de kullanabilirsiniz.

Geri dönüştürülmüş görünümlere otomatik doldurma kimlikleri atama

Görünümleri geri dönüştüren RecyclerView sınıfı gibi container'lar, büyük veri kümelerine dayanan öğe kaydırma listelerini görüntülemesi gereken uygulamalar için kullanışlıdır. Kapsayıcı kaydırdıkça, sistem düzendeki görünümleri yeniden kullanır, ancak görünümler yeni içerik içerir.

Geri dönüştürülmüş bir görünümün ilk içerikleri doldurulursa otomatik doldurma hizmeti, görünümlerin otomatik doldurma kimliklerini kullanarak bunların mantıksal anlamını korur. Sistem, görünümleri düzende yeniden kullandığında görünümlerin mantıksal kimliklerinin aynı kalması ve yanlış otomatik doldurma kullanıcı verilerinin bir otomatik doldurma kimliğiyle ilişkilendirilmesine neden olması durumunda bir sorun ortaya çıkar.

Android 9 (API düzeyi 28) ve sonraki sürümleri çalıştıran cihazlarda bu sorunu çözmek için RecyclerView tarafından kullanılan görünümlerin otomatik doldurma kimliğini aşağıdaki yöntemlerle açıkça yönetin:

  • getNextAutofillId() yöntemi, etkinliğe özgü yeni bir otomatik doldurma kimliği alır.
  • setAutofillId() yöntemi, etkinlikteki bu görünümün benzersiz ve mantıksal otomatik doldurma kimliğini ayarlar.

Bilinen sorunları giderme

Bu bölümde, otomatik doldurma çerçevesindeki bilinen sorunlara yönelik çözümler sunulmaktadır.

Otomatik doldurma, uygulamaların Android 8.0, 8.1'de kilitlenmesine neden oluyor

Android 8.0 (API düzeyi 26) ve 8.1 (API düzeyi 27) sürümlerinde otomatik doldurma, uygulamanızın belirli senaryolarda kilitlenmesine neden olabilir. Olası sorunları çözmek için importantForAutofill=no ile otomatik olarak doldurulmayan görünümleri etiketleyin. Ayrıca etkinliğin tamamını importantForAutofill=noExcludeDescendants ile etiketleyebilirsiniz.

Yeniden boyutlandırılan iletişim kutuları otomatik doldurma için dikkate alınmaz

Android 8.1 (API düzeyi 27) ve önceki sürümlerde bir iletişim kutusundaki bir görünüm gösterildikten sonra yeniden boyutlandırılırsa görünüm otomatik doldurma için dikkate alınmaz. Bu görünümler, Android sisteminin otomatik doldurma hizmetine gönderdiği AssistStructure nesnesine dahil edilmez. Bu nedenle görüntüleme sayısı hizmet tarafından doldurulamaz.

Bu sorunu çözmek için iletişim penceresi parametrelerinin token özelliğini, iletişim kutusunu oluşturan etkinliğin token özelliğiyle değiştirin. Otomatik doldurmanın etkinleştirildiğini doğruladıktan sonra pencere parametrelerini Dialog kaynağından devralan sınıfın onWindowAttributesChanged() yöntemine kaydedin. Ardından, kayıtlı parametrelerin token özelliğini, onAttachedToWindow() yöntemindeki üst etkinliğin token özelliğiyle değiştirin.

Aşağıdaki kod snippet'inde, bu geçici çözümü uygulayan bir sınıf gösterilmektedir:

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

}

Gereksiz işlemlerden kaçınmak için aşağıdaki kod snippet'i, otomatik doldurmanın cihazda desteklenip desteklenmediğini ve geçerli kullanıcı için etkinleştirilip etkinleştirilmediğini nasıl kontrol edeceğinizi ve bu geçici çözümün gerekli olup olmadığını nasıl kontrol edeceğinizi gösterir:

Kotlin

// AutofillExtensions.kt

fun Context.isDialogResizedWorkaroundRequired(): Boolean {
    // After the issue is resolved on Android, check whether 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 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, check whether 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 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();
    }
}

Otomatik doldurma özelliğiyle uygulamanızı test etme

Uygulamanızı otomatik doldurma hizmetleriyle çalışacak şekilde optimize ettikten sonra, uygulamanın otomatik doldurma hizmetleriyle amaçlandığı şekilde çalışıp çalışmadığını test edin.

Uygulamanızı test etmek için Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran bir emülatör ya da fiziksel bir cihaz kullanın. Emülatör oluşturma hakkında daha fazla bilgi için Sanal cihazlar oluşturma ve yönetme bölümüne bakın.

Otomatik doldurma hizmeti yükleme

Uygulamanızı otomatik doldurma ile test etmeden önce otomatik doldurma hizmetleri sağlayan başka bir uygulama yüklemeniz gerekir. Bu amaçla üçüncü taraf bir uygulama kullanabilirsiniz ancak örnek bir otomatik doldurma hizmeti kullanmak daha kolay olduğundan üçüncü taraf hizmetlerine kaydolmanıza gerek kalmaz.

Uygulamanızı otomatik doldurma hizmetleriyle test etmek için Java'daki Android otomatik doldurma çerçevesi örneğini kullanabilirsiniz. Örnek uygulama, uygulamanızla kullanmadan önce iş akışını test etmek için kullanabileceğiniz bir otomatik doldurma hizmeti ve istemci Activity sınıfları sağlar. Bu sayfada android-AutofillFramework örnek uygulamasına referans verilmektedir.

Uygulamayı yükledikten sonra emülatörün sistem ayarlarında Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek otomatik doldurma hizmetini etkinleştirin.

Veri gereksinimlerini analiz edin

Uygulamanızı otomatik doldurma hizmetiyle test etmek için hizmetin, uygulamanızı doldurmak üzere kullanabileceği verilere sahip olması gerekir. Hizmetin, uygulamanızın görünümlerinde ne tür verilerin beklendiğini de anlaması gerekir. Örneğin, uygulamanızın kullanıcı adı bekleyen bir görünümü varsa hizmetin, kullanıcı adı içeren bir görünümü ve görünümde bu tür verileri beklediğini anlaması için bir mekanizma bulunması gerekir.

android:autofillHints özelliğini ayarlayarak, görünümlerinizde ne tür verilerin beklendiğini hizmete bildirin. Bazı hizmetler, veri türünü belirlemek için gelişmiş buluşsal yöntemler kullanır ancak örnek uygulama gibi diğerleri bu bilgiyi sağlamak için geliştiriciye güvenir. Otomatik doldurmayla ilgili görünümlerde android:autofillHints özelliğini ayarlarsanız uygulamanız otomatik doldurma hizmetleriyle daha iyi çalışır.

Testinizi çalıştırın

Veri gereksinimlerini analiz ettikten sonra testinizi çalıştırabilirsiniz. Bu işlem, test verilerinin otomatik doldurma hizmetine kaydedilmesini ve uygulamanızda otomatik doldurmanın tetiklenmesini içerir.

Hizmete veri tasarrufu

Verileri şu anda etkin olan otomatik doldurma hizmetine kaydetmek için aşağıdakileri yapın:

  1. Test sırasında kullanmak istediğiniz veri türünü bekleyen bir görünüm içeren bir uygulama açın. android-AutofillFramework örnek uygulaması, kullanıcı arayüzüne kredi kartı numaraları ve kullanıcı adları gibi çeşitli veri türlerini bekleyen görünümler sunar.
  2. İhtiyacınız olan veri türünün bulunduğu görünüme dokunun.
  3. Görünüme bir değer girin.
  4. Oturum aç veya Gönder gibi bir onay düğmesine dokunun. Genellikle, hizmetin verileri kaydetmeden önce formu göndermeniz gerekir.
  5. Sistem iletişim kutusundan izin isteğini doğrulayın. Sistem iletişim kutusu, etkin durumdaki hizmetin adını gösterir ve testinizde kullanmak istediğiniz hizmetin bu olup olmadığını sorar. Hizmeti kullanmak istiyorsanız Kaydet'e dokunun.

Android izin iletişim kutusunu göstermiyorsa veya hizmet, testinizde kullanmak istediğiniz hizmet değilse sistem ayarlarından hizmetin şu anda etkin olup olmadığını kontrol edin.

Uygulamanızda otomatik doldurmayı tetikleyin

Uygulamanızda otomatik doldurmayı tetiklemek için aşağıdakileri yapın:

  1. Uygulamanızı açın ve test etmek istediğiniz görünümleri içeren etkinliğe gidin.
  2. Doldurulması gereken görünüme dokunun.
  3. Sistem, Şekil 1'de gösterildiği gibi görünümü doldurabilecek veri kümelerini içeren otomatik doldurma kullanıcı arayüzünü görüntüler.
  4. Kullanmak istediğiniz verileri içeren veri kümesine dokunun. Görünüm, hizmette önceden depolanan verileri gösterir.
Otomatik doldurma kullanıcı arayüzü, "dataset-2"yi kullanılabilir bir veri kümesi olarak gösteriyor
Şekil 1. Mevcut veri kümelerini gösteren otomatik doldurma kullanıcı arayüzü.

Android, otomatik doldurma kullanıcı arayüzünü görüntülemiyorsa aşağıdaki sorun giderme seçeneklerini deneyebilirsiniz:

  • Uygulamanızdaki görünümlerin android:autofillHints özelliğinde doğru değeri kullanıp kullanmadığını kontrol edin. Özelliğin olası değerlerinin listesi için View sınıfındaki AUTOFILL_HINT ön ekine sahip sabit değerlere bakın.
  • android:importantForAutofill özelliğinin, doldurulması gereken görünümdeki no dışında bir değere veya görünümde ya da üst öğelerinden birinde noExcludeDescendants dışında bir değere ayarlandığından emin olun.