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çeveyle çalışma şeklini de optimize edebilirsiniz.

Otomatik doldurma ortamını ayarlama

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

Otomatik doldurma hizmeti yapılandırma

Uygulamanızın otomatik doldurma çerçevesini kullanabilmesi 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 tablette otomatik doldurma hizmeti olsa da uygulamanızı test ederken Android otomatik doldurma çerçevesi örneğindeki otomatik doldurma hizmeti gibi bir test hizmeti kullanmanızı öneririz. Emülatör varsayılan bir hizmetle gelmediği için emülatör kullanırken otomatik doldurma hizmetini açıkça ayarlayın.

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

Otomatik doldurmayı test etmek için bir emülatör yapılandırma hakkında daha fazla bilgi edinmek isterseniz Uygulamanızı otomatik doldurma ile test etme başlıklı makaleyi inceleyin.

Otomatik doldurma için ipuçları sağlama

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

android:autofillHints özelliğini kullanarak otomatik doldurma ipuçları ayarlayabilirsiniz. Aşağıdaki örnekte, EditText öğesinde bir "password" ipucu ayarlanmıştır:

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

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

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 etme

Otomatik doldurma çerçevesi ipuçlarını doğrulamaz. İpuçları, herhangi bir değişiklik veya doğrulama yapılmadan otomatik doldurma hizmetine iletilir. İstediğiniz değeri kullanabilirsiniz. Ancak View ve AndroidX HintConstants sınıfları, resmi olarak desteklenen ipucu sabitlerinin listelerini içerir.

Bu sabitlerin 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 kimlik bilgisi ipuçları ekleyebilirsiniz.

Yeni hesap oluşturmak için veya kullanıcılar kullanıcı adlarını ve şifrelerini değiştirdiğinde AUTOFILL_HINT_NEW_USERNAME ve AUTOFILL_HINT_NEW_PASSWORD öğelerini kullanabilirsiniz.

Kredi kartı bilgileri

Kredi kartı bilgilerini 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ı için aşağıdakiler gibi ipuçlarını kullanabilirsiniz:

Kişi adları

Kullanıcıların adlarını isterken aşağıdaki gibi ipuçları kullanabilirsiniz:

Telefon numaraları

Telefon numaraları için şunları kullanabilirsiniz:

Tek kullanımlık şifre (OTP)

Tek seferlik şifreyi tek bir görünümde görmek için AUTOFILL_HINT_SMS_OTP simgesini kullanabilirsiniz.

Her görünümün OTP'nin tek bir hanesine eşlendiği birden fazla görünüm için karakter başına ipucu oluşturmak üzere generateSmsOtpHintForCharacterPosition() yöntemini kullanabilirsiniz.

Alanları otomatik doldurma için önemli olarak işaretleme

Uygulamanızdaki alanları, otomatik doldurma amacıyla bir görünüm yapısına dahil edebilirsiniz. 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 kendi sezgisel yaklaşımlarını kullanmasına olanak tanır.

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

  • Giriş etkinliğindeki CAPTCHA alanı
  • Kullanıcının içerik oluşturduğu bir görünüm (ör. metin veya e-tablo düzenleyici)
  • Oyunlardaki bazı etkinliklerdeki görüntülemeler (ör. oyun oynama işlemlerini gösterenler)

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 aşağıdakilerden herhangi biri olabilir:

auto
Android Sistemi'nin, görünümün otomatik doldurma için önemli olup olmadığını belirlemek için buluşsal yöntemlerini 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 alt öğeleri otomatik doldurma için ö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 olarak aşağıdaki gibi belirtebilirsiniz:

  • Giriş etkinliğindeki CAPTCHA alanı: Bu görünümü önemsiz olarak işaretlemek için android:importantForAutofill="no" veya IMPORTANT_FOR_AUTOFILL_NO değerini kullanın.
  • Kullanıcıların içerik oluşturduğu bir görünüm: Görüntüleme yapısının tamamını android:importantForAutofill="noExcludeDescendants" veya IMPORTANT_FOR_AUTOFILL_NO_EXCLUDE_DESCENDANTS ile işaretleyerek önemsiz olarak işaretleyin.
  • Oyunlardaki bazı etkinliklerde yer alan görünümler: 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, uygulama ve web sitesi ilişkilendirildikten sonra kullanıcı giriş verilerini tarayıcılar ve Android cihazlar arasında paylaşabilir. Kullanıcı her iki platformda da aynı otomatik doldurma hizmetini seçtiğinde, web uygulamanızda oturum açmak, ilgili Android uygulamanızda oturum açtığında giriş kimlik bilgilerinin otomatik olarak doldurulmasını sağlar.

Android uygulamanızı web sitenizle ilişkilendirmek için sitenizde delegate_permission/common.get_login_creds ilişkisi olan bir Digital Asset Link barındırın. Ardından, uygulamanızın AndroidManifest.xml dosyasında ilişkilendirmeyi tanımlayın. Web sitenizi Android uygulamanızla ilişkilendirmeyle ilgili ayrıntılı talimatlar için Uygulamalar 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 üzere adım atabileceğ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 bölümü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 kullanıcının otomatik doldurma özelliğine erişimi varsa uygulamanızda veya uygulamanızın belirli görünümlerinde ek otomatik doldurma işlevi uygulayabilirsiniz.

Örneğin, kullanıcı için otomatik doldurma etkinse TextView, taşma menüsünde bir otomatik doldurma girişi gösterir. Kullanıcı için otomatik doldurmanın etkin olup olmadığını kontrol etmek üzere AutofillManager nesnesinin isEnabled() yöntemini çağırın.

Kaydolma ve oturum açma deneyiminizin, otomatik doldurma özelliği olmayan kullanıcılar için optimize edildiğinden emin olmak istiyorsanız One Tap ile kaydolma özelliğini uygulayın.

Otomatik doldurma isteğini zorlama

Bazen kullanıcı işlemine yanıt olarak bir otomatik doldurma isteği göndermeniz gerekir. Örneğin, kullanıcı görünüme dokunup basılı tuttuktan sonra TextView otomatik doldurma menü öğesi sunar. Aşağıdaki kod örneğinde, otomatik doldurma isteğinin nasıl zorlanacağı 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 olduğunda yararlı olabilir.

Seçici denetimlerindeki veriler için doğru otomatik doldurma türünü kullanın

Seçiciler, kullanıcıların tarih veya saat verilerini depolayan bir alanın değerini değiştirmesine olanak tanıyan bir kullanıcı arayüzü sağlayarak otomatik doldurma özelliğinde yararlı olabilir. Örneğin, bir kredi kartı formunda tarih seçici, kullanıcıların kredi kartlarının son kullanma tarihini girmesine veya değiştirmesine olanak tanır. Ancak, seçici görünmediğinde verileri görüntülemek için EditText gibi başka bir görünüm kullanmanız gerekir.

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

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

Otomatik doldurma bağlamını tamamlama

Otomatik doldurma bağlamı sona erdikten sonra otomatik doldurma çerçevesi, "Otomatik doldurma için kaydetme" iletişim kutusunu göstererek kullanıcı girişini gelecekte kullanılmak üzere kaydeder. Otomatik doldurma bağlamı genellikle bir etkinlik sona erdiğinde sona erer. Bununla birlikte, çerçeveyi açıkça 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 gibi durumlarda, AutofillManager.commit() işlevini çağırarak bağlamı açıkça sonlandırabilirsiniz.

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

Özel görünümler, otomatik doldurma API'sini kullanarak otomatik doldurma çerçevesine sunulan meta verileri belirtebilir. Bazı görünümler, OpenGL tarafından oluşturulan kullanıcı arayüzü içeren görünümler gibi sanal çocukların kapsayıcısı olarak işlev görür. Bu görünümler, otomatik doldurma çerçevesiyle çalışabilmek için uygulamada kullanılan bilgilerin yapısını belirtmek üzere API'yi kullanmalıdır.

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 bir görünüm yapısı veya varsayılan bir görünüm yapısı sağlar.
  • Özel görünümün sanal bir yapısı veya otomatik doldurma çerçevesinin kullanamadığı bir görünüm yapısı vardır.

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 aşağıdaki işlemleri gerçekleştirmelidir:

  • Ç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() işlevini ç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() uygulayın.

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

Son olarak, kullanıcı mevcut durumundaki görünüm için bir değer sağlayamazsa (ör. görünüm devre dışıysa) otomatik doldurma özelliği görünümü doldurmamalıdır. Bu durumlarda getAutofillType(), AUTOFILL_TYPE_NONE döndürmeli, getAutofillValue() null döndürmeli 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üntü düzenlenebiliyorsa 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üm e-posta adresleri, kredi kartı numaraları ve şifreler gibi kimliği tanımlayabilecek bilgiler (PII) içeriyorsa bu görünümler hassas olarak işaretlenmelidir.

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

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 veri içerip içermediğini işaretlemek için onProvideAutofillStructure() sınıfını uygulayın ve ViewStructure nesnesinde setDataIsSensitive() işlevini çağırın.

Aşağıdaki kod örneğinde, görünüm yapısındaki verilerin hassas olmayan 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 ayarlamak üzere setAutofillOptions() yöntemini kullanabilirsiniz. Özellikle, otomatik doldurma türü AUTOFILL_TYPE_LIST olan görünümler bu yöntemi kullanmalıdır. Otomatik doldurma hizmeti, görünümü doldurmak için kullanılabilecek seçenekleri bilirse daha iyi bir iş çıkarabilir.

Spinner gibi bir adaptör kullanan görünümler de benzer bir durumdur. Örneğin, kredi kartı geçerlilik süresi alanlarında kullanılmak üzere mevcut yıla göre dinamik olarak oluşturulmuş yılları sağlayan 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ğlarsanız getAutofillOptions() değerini geçersiz kılın.

Sanal yapıya sahip ö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çeve tarafından kullanılamaz:

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

Bu durumlarda, onProvideAutofillVirtualStructure() kodunu 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 çocuk ekleyin.
  3. setAutofillId() çağrısını yaparak çocuğun otomatik doldurma kimliğini ayarlayın.
  4. Otomatik doldurma değeri ve türü gibi alakalı özellikleri ayarlayın.
  5. Sanal alt öğedeki veriler hassassa true öğesini setDataIsSensitive() öğesine, aksi takdirde false öğesini iletin.

Aşağıdaki kod snippet'inde, sanal yapıda yeni bir alt öğenin nasıl oluşturulacağı gösterilmektedir:

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

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

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

Otomatik doldurma etkinliklerinde geri çağırma işlevlerini kullanma

Uygulamanız kendi otomatik tamamlama görünümlerini sunuyorsa, kullanıcı arayüzü otomatik doldurma özelliğindeki değişikliklere göre uygulamaya 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ıf, bir görünümle ilişkili otomatik doldurma durumunda değişiklik yapıldıktan sonra uygulamanın çağırdığı onAutofillEvent(View, int) yöntemini sağlar. Bu yöntemin, uygulamanızın sanal görüntülerle kullanabileceği bir childId parametresi içeren aşırı yüklenmiş bir sürümü de vardır. Kullanılabilir durumlar, geri çağırma işlevinde sabitler olarak tanımlanır.

AutofillManager sınıfının registerCallback() yöntemini kullanarak geri arama 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 aramayı 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çeriğinin otomatik olarak doldurulduğunu belirtmek için görünümün üzerine bir Drawable simgesi yerleştirir. Varsayılan olarak bu çizilebilir öğe, arka planları çizmek için kullanılan tema renginden biraz daha koyu olan yarı saydam bir renge sahip katı bir dikdörtgendir. Çekilebilir öğenin değiştirilmesi gerekmez ancak bu örnekte gösterildiği gibi, uygulama veya etkinlik tarafından kullanılan temanı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ı yapma

Otomatik doldurma hizmeti, hizmetin uygulamanızdaki alanları tamamlayabilmesi için önce kullanıcının kimlik doğrulaması yapmasını gerektirebilir. Bu durumda Android sistemi, etkinliğin 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ği için uygulamanızı kimlik doğrulamayı destekleyecek şekilde güncellemeniz gerekmez. Ancak etkinlik yeniden başlatılırken etkinliğin görüntüleme yapısının korunduğundan emin olmanız gerekir. Örneğin, görüntüleme yapısını onStart() veya onResume() yerine onCreate() içinde oluşturabilirsiniz.

Otomatik Doldurma Çerçevesi örneğindeki HeuristicsService'i kullanarak ve doldurma yanıtı kimlik doğrulamasını gerektirecek şekilde yapılandırarak, bir otomatik doldurma hizmeti kimlik doğrulama gerektirdiğinde uygulamanızın nasıl davrandığını doğrulayabilirsiniz. Bu sorunu emüle etmek için BadViewstructureCreationSignInActivity örneğini de kullanabilirsiniz.

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

Görünümleri geri dönüştüren kapsayıcılar (ör. RecyclerView sınıfı), büyük veri kümelerine dayalı öğelerin kayan listelerini görüntülemesi gereken uygulamalar için kullanışlıdır. Kapsayıcı kaydırıldığında sistem, düzendeki görünümleri yeniden kullanır ancak görünümler yeni içerikler içerir.

Geri dönüştürülmüş bir görünümün ilk içerikleri doldurulmuşsa otomatik doldurma hizmeti, otomatik doldurma kimliklerini kullanarak görünümlerin mantıksal anlamını korur. Sistem, görünümleri düzende yeniden kullandığında görünümlerin mantıksal kimlikleri aynı kalır ve yanlış otomatik doldurma kullanıcı verilerinin bir otomatik doldurma kimliğiyle ilişkilendirilmesine neden olur.

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öntemlerden birini kullanarak açıkça yönetin:

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

Bilinen sorunları giderin

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

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

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

Boyutu değiştirilen iletişim kutuları otomatik doldurma için dikkate alınmaz

Android 8.1 (API düzeyi 27) ve önceki sürümlerde, ileti kutusunda bir görünüm zaten görüntülendikten sonra yeniden boyutlandırılırsa bu 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, hizmet görünümleri dolduramaz.

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 etkin olduğunu doğruladıktan sonra, pencere parametrelerini Dialog sınıfı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şlemleri önlemek için aşağıdaki kod snippet'inde, otomatik doldurma özelliğinin cihazda desteklenip desteklenmediğinin ve mevcut kullanıcı için etkinleştirilip etkinleştirilmediğinin ve bu geçici çözümün gerekli olup olmadığının nasıl kontrol edileceği gösterilmektedir:

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

Uygulamanızı otomatik doldurma özelliğiyle test etme

Uygulamanızı otomatik doldurma hizmetleriyle çalışacak şekilde optimize ettikten sonra otomatik doldurma hizmetleriyle istediğiniz gibi çalışıp çalışmadığını test edin.

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

Otomatik doldurma hizmeti yükleme

Uygulamanızı otomatik doldurma ile test edebilmek için otomatik doldurma hizmetleri sunan başka bir uygulama yüklemeniz gerekir. Bu amaçla bir üçüncü taraf uygulaması kullanabilirsiniz ancak üçüncü taraf hizmetlerine kaydolmanız gerekmediği için örnek bir otomatik doldurma hizmeti kullanmak daha kolaydır.

Uygulamanızı otomatik doldurma hizmetleriyle test etmek için Java'daki Android otomatik doldurma çerçevesi örneğini kullanabilirsiniz. Örnek uygulama, iş akışını uygulamanızla kullanmadan önce 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 Ayarlar > Sistem > Diller ve giriş > Gelişmiş > Giriş yardımı > Otomatik doldurma hizmeti'ne giderek emülatör sistem ayarlarında otomatik doldurma hizmetini etkinleştirin.

Veri gereksinimlerini analiz etme

Uygulamanızı otomatik doldurma hizmetiyle test etmek için hizmetin uygulamanızı doldurmak amacıyla kullanabileceği verilere sahip olması gerekir. Hizmetin ayrıca, uygulamanızın görünümlerinde ne tür verilerin beklendiğini de anlaması gerekir. Örneğin, uygulamanız kullanıcı adı bekleyen bir görünüme sahipse hizmetin, kullanıcı adı ve görünümün bu tür veriler beklediğini anlamasını sağlayacak bir mekanizma içeren veri kümesine sahip olması gerekir.

android:autofillHints özelliğini ayarlayarak hizmete, görünümlerinizde ne tür verilerin beklendiğini bildirin. Bazı hizmetler, veri türünü belirlemek için gelişmiş sezgisel yöntemler kullanır. Örnek uygulama gibi diğer hizmetler ise bu bilgileri sağlamak için geliştiriciye güvenir. Otomatik doldurma ile alakalı 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 şartlarını analiz ettikten sonra testinizi çalıştırabilirsiniz. Bu test, test verilerini otomatik doldurma hizmetine kaydetmeyi ve uygulamanızda otomatik doldurmayı tetiklemeyi içerir.

Hizmete veri kaydetme

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

  1. Testiniz 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 sağlar.
  2. İhtiyacınız olan veri türünü içeren görünüme dokunun.
  3. Görüntüye bir değer girin.
  4. Oturum aç veya Gönder gibi bir onay düğmesine dokunun. Genellikle, hizmet verileri kaydetmeden önce formu göndermeniz gerekir.
  5. Sistem iletişim kutusunda izin isteğini doğrulayın. Sistem iletişim kutusunda, şu anda etkin olan hizmetin adı gösterilir ve testinizde kullanmak istediğiniz hizmetin bu olup olmadığı sorulur. Hizmeti kullanmak istiyorsanız Kaydet'e dokunun.

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

Uygulamanızda otomatik doldurmayı tetikleme

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

  1. Uygulamanızı açın ve test etmek istediğiniz görüntülemelerin bulunduğu 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österir.
  4. Kullanmak istediğiniz verileri içeren veri kümesine dokunun. Bu görünüm, hizmette daha önce depolanan verileri gösterir.
"veri kümesi-2"yi kullanılabilir veri kümesi olarak gösteren otomatik doldurma kullanıcı arayüzü
Şekil 1. Mevcut veri kümelerini gösteren otomatik doldurma kullanıcı arayüzü.

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

  • Uygulamanızdaki görünümlerin android:autofillHints özelliğinde doğru değeri kullandığından emin olun. Özelliğin olası değerlerinin listesi için View sınıfında AUTOFILL_HINT ile başlayan sabitlere bakın.
  • android:importantForAutofill özelliğinin, doldurulması gereken görünümde no dışında bir değere veya görünümde ya da üst öğelerinden birine noExcludeDescendants dışında bir değere ayarlanıp ayarlanmadığını kontrol edin.