Kendi erişilebilirlik hizmetinizi oluşturma (Görünümler)

Kavramlar ve Jetpack Compose uygulaması

Erişilebilirlik hizmeti, kullanıcı arayüzünü geliştirerek engelli kullanıcılara veya geçici olarak bir cihazla tam etkileşim kuramayan kullanıcılara yardımcı olan bir uygulamadır. Örneğin, araba kullanan, küçük bir çocukla ilgilenen veya çok gürültülü bir partiye katılan kullanıcıların ek veya alternatif arayüz geri bildirimine ihtiyacı olabilir.

Android, TalkBack gibi standart erişilebilirlik hizmetleri sunar ve geliştiriciler kendi hizmetlerini oluşturup dağıtabilir. Bu belgede, erişilebilirlik hizmeti oluşturmayla ilgili temel bilgiler açıklanmaktadır.

Erişilebilirlik hizmetleri normal bir uygulamayla birlikte paketlenebilir veya bağımsız bir Android projesi olarak oluşturulabilir. Hizmet oluşturma adımları her iki durumda da aynıdır.

Erişilebilirlik hizmetinizi oluşturma

Projenizde AccessibilityService sınıfını genişleten bir sınıf oluşturun:

Kotlin

package com.example.android.apis.accessibility

import android.accessibilityservice.AccessibilityService
import android.view.accessibility.AccessibilityEvent

class MyAccessibilityService : AccessibilityService() {
...
    override fun onInterrupt() {}

    override fun onAccessibilityEvent(event: AccessibilityEvent?) {}
...
}

Java

package com.example.android.apis.accessibility;

import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;

public class MyAccessibilityService extends AccessibilityService {
...
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
    }

    @Override
    public void onInterrupt() {
    }

...
}

Bu Service için yeni bir proje oluşturursanız ve projeyle ilişkilendirilmiş bir uygulamanız olmayacaksa başlangıç Activity sınıfını kaynağınızdan kaldırabilirsiniz.

Manifest beyanları ve izinleri

Erişilebilirlik hizmetleri sağlayan uygulamaların, Android sistemi tarafından erişilebilirlik hizmeti olarak değerlendirilmesi için uygulama manifest dosyalarına belirli bildirimler eklemesi gerekir. Bu bölümde, erişilebilirlik hizmetleri için zorunlu ve isteğe bağlı ayarlar açıklanmaktadır.

Erişilebilirlik hizmeti beyanı

Uygulamanızın erişilebilirlik hizmeti olarak değerlendirilmesi için manifest dosyanızdaki application öğesinin içine activity öğesi yerine service öğesini ekleyin. Ayrıca, service öğesinin içine bir erişilebilirlik hizmeti intent filtresi ekleyin. Manifest ayrıca yalnızca sistemin hizmete bağlanabilmesini sağlamak için BIND_ACCESSIBILITY_SERVICE iznini ekleyerek hizmeti korumalıdır. Aşağıda bununla ilgili bir örnek verilmiştir:

  <application>
    <service android:name=".MyAccessibilityService"
        android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
        android:label="@string/accessibility_service_label">
      <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
      </intent-filter>
    </service>
  </application>

Erişilebilirlik hizmeti yapılandırması

Erişilebilirlik hizmetleri, hizmetin işlediği erişilebilirlik etkinliklerinin türlerini belirten bir yapılandırma ve hizmetle ilgili ek bilgiler sağlamalıdır. Erişilebilirlik hizmetinin yapılandırması AccessibilityServiceInfo sınıfında yer alır. Hizmetiniz, bu sınıfın bir örneğini ve setServiceInfo() kullanarak çalışma zamanında bir yapılandırma oluşturup ayarlayabilir. Ancak bu yöntemle tüm yapılandırma seçenekleri kullanılamaz.

Aşağıdaki örnekte gösterildiği gibi, manifest dosyanıza bir yapılandırma dosyasına referans veren bir <meta-data> öğesi ekleyebilirsiniz. Bu öğe, erişilebilirlik hizmetiniz için tüm seçenekleri ayarlamanıza olanak tanır:

<service android:name=".MyAccessibilityService">
  ...
  <meta-data
    android:name="android.accessibilityservice"
    android:resource="@xml/accessibility_service_config" />
</service>

Bu <meta-data> öğesi, uygulamanızın kaynak dizininde oluşturduğunuz bir XML dosyasını ifade eder: <project_dir>/res/xml/accessibility_service_config.xml>. Aşağıdaki kodda, hizmet yapılandırma dosyasının içeriğiyle ilgili bir örnek gösterilmektedir:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/accessibility_service_description"
    android:packageNames="com.example.android.apis"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFlags="flagDefault"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"
/>

Erişilebilirlik hizmeti yapılandırma dosyasında kullanılabilecek XML özellikleri hakkında daha fazla bilgi için aşağıdaki referans belgeleri inceleyin:

Çalışma zamanında hangi yapılandırma ayarlarının dinamik olarak ayarlanabileceği hakkında daha fazla bilgi için AccessibilityServiceInfo referans belgelerine bakın.

Erişilebilirlik hizmetinizi yapılandırma

Erişilebilirlik hizmetiniz için yapılandırma değişkenlerini ayarlarken, sisteme nasıl ve ne zaman çalıştırılacağını söylemek için aşağıdakileri göz önünde bulundurun:

  • Hangi etkinlik türlerine yanıt vermesini istiyorsunuz?
  • Hizmetin tüm uygulamalarda mı yoksa yalnızca belirli paket adlarında mı etkin olması gerekiyor?
  • Hangi farklı geri bildirim türlerini kullanır?

Bu değişkenleri ayarlamak için iki seçeneğiniz vardır. Geriye dönük uyumlu seçenek, setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo) kullanarak bunları kodda ayarlamaktır. Bunu yapmak için onServiceConnected() yöntemini geçersiz kılın ve hizmetinizi aşağıdaki örnekte gösterildiği gibi orada yapılandırın:

Kotlin

override fun onServiceConnected() {
    info.apply {
        // Set the type of events that this service wants to listen to. Others
        // aren't passed to this service.
        eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED or AccessibilityEvent.TYPE_VIEW_FOCUSED

        // If you only want this service to work with specific apps, set their
        // package names here. Otherwise, when the service is activated, it
        // listens to events from all apps.
        packageNames = arrayOf("com.example.android.myFirstApp", "com.example.android.mySecondApp")

        // Set the type of feedback your service provides.
        feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN

        // Default services are invoked only if no package-specific services are
        // present for the type of AccessibilityEvent generated. This service is
        // app-specific, so the flag isn't necessary. For a general-purpose
        // service, consider setting the DEFAULT flag.

        // flags = AccessibilityServiceInfo.DEFAULT;

        notificationTimeout = 100
    }

    this.serviceInfo = info

}

Java

@Override
public void onServiceConnected() {
    // Set the type of events that this service wants to listen to. Others
    // aren't passed to this service.
    info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED |
            AccessibilityEvent.TYPE_VIEW_FOCUSED;

    // If you only want this service to work with specific apps, set their
    // package names here. Otherwise, when the service is activated, it listens
    // to events from all apps.
    info.packageNames = new String[]
            {"com.example.android.myFirstApp", "com.example.android.mySecondApp"};

    // Set the type of feedback your service provides.
    info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;

    // Default services are invoked only if no package-specific services are
    // present for the type of AccessibilityEvent generated. This service is
    // app-specific, so the flag isn't necessary. For a general-purpose service,
    // consider setting the DEFAULT flag.

    // info.flags = AccessibilityServiceInfo.DEFAULT;

    info.notificationTimeout = 100;

    this.setServiceInfo(info);

}

İkinci seçenek ise hizmeti bir XML dosyası kullanarak yapılandırmaktır. canRetrieveWindowContent gibi belirli yapılandırma seçenekleri yalnızca hizmetinizi XML kullanarak yapılandırırsanız kullanılabilir. Önceki örnekteki yapılandırma seçenekleri, XML kullanılarak tanımlandığında şu şekilde görünür:

<accessibility-service
     android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
     android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp"
     android:accessibilityFeedbackType="feedbackSpoken"
     android:notificationTimeout="100"
     android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity"
     android:canRetrieveWindowContent="true"
/>

XML kullanıyorsanız XML dosyasına işaret eden hizmet bildiriminize bir <meta-data> etiketi ekleyerek manifestinizde buna referans verin. XML dosyanızı res/xml/serviceconfig.xml içinde saklıyorsanız yeni etiket şu şekilde görünür:

<service android:name=".MyAccessibilityService">
     <intent-filter>
         <action android:name="android.accessibilityservice.AccessibilityService" />
     </intent-filter>
     <meta-data android:name="android.accessibilityservice"
     android:resource="@xml/serviceconfig" />
</service>

Erişilebilirlik hizmeti yöntemleri

Erişilebilirlik hizmeti, AccessibilityService sınıfını genişletmeli ve bu sınıftaki aşağıdaki yöntemleri geçersiz kılmalıdır. Bu yöntemler, Android sisteminin bunları çağırma sırasına göre sunulur: hizmetin başlatıldığı andan (onServiceConnected()), çalıştığı süre boyunca (onAccessibilityEvent(), onInterrupt()) ve kapatıldığı ana (onUnbind()) kadar.

  • onServiceConnected(): (isteğe bağlı) Sistem, erişilebilirlik hizmetinize bağlandığında bu yöntemi çağırır. Bu yöntemi, hizmetiniz için tek seferlik kurulum adımlarını gerçekleştirmek üzere kullanın. Örneğin, ses yöneticisi veya cihaz titreşimi gibi kullanıcı geri bildirimi sistemi hizmetlerine bağlanmak için bu yöntemi kullanabilirsiniz. Hizmetinizin yapılandırmasını çalışma zamanında ayarlamak veya tek seferlik düzenlemeler yapmak istiyorsanız setServiceInfo() işlevini çağırmak için uygun bir yerdir.

  • onAccessibilityEvent(): (zorunlu) Sistem, erişilebilirlik hizmetiniz tarafından belirtilen etkinlik filtreleme parametreleriyle eşleşen bir AccessibilityEvent algıladığında bu yöntemi geri çağırır. Örneğin, kullanıcı bir düğmeye dokunduğunda veya erişilebilirlik hizmetinizin geri bildirim sağladığı bir uygulamada kullanıcı arayüzü kontrolüne odaklandığında bu yöntem geri çağrılır. Sistem bu yöntemi çağırdığında ilişkili AccessibilityEvent öğesini iletir. Hizmet daha sonra bu öğeyi yorumlayıp kullanıcıya geri bildirim sağlamak için kullanabilir. Bu yöntem, hizmetinizin yaşam döngüsü boyunca birçok kez çağrılabilir.

  • onInterrupt(): (zorunlu) Sistem, hizmetinizin sağladığı geri bildirimi kesmek istediğinde (genellikle odağı farklı bir denetime taşıma gibi bir kullanıcı işlemine yanıt olarak) bu yöntemi çağırır. Bu yöntem, hizmetinizin yaşam döngüsü boyunca birçok kez çağrılabilir.

  • onUnbind(): (isteğe bağlı) Sistem, erişilebilirlik hizmetini kapatmak üzereyken bu yöntemi çağırır. Kullanıcı geri bildirim sistemi hizmetlerinin (ör. ses yöneticisi veya cihaz titreşimi) tahsisini kaldırma gibi tek seferlik kapatma prosedürlerini uygulamak için bu yöntemi kullanın.

Bu geri çağırma yöntemleri, erişilebilirlik hizmetinizin temel yapısını sağlar. Android sistemi tarafından AccessibilityEvent nesneleri şeklinde sağlanan verilerin nasıl işleneceğine karar verebilir ve kullanıcıya geri bildirim sağlayabilirsiniz. Erişilebilirlik etkinliğinden bilgi alma hakkında daha fazla bilgi için Etkinlik ayrıntılarını alma başlıklı makaleyi inceleyin.

Erişilebilirlik etkinliklerine kaydolma

Erişilebilirlik hizmeti yapılandırma parametrelerinin en önemli işlevlerinden biri, hizmetinizin hangi tür erişilebilirlik etkinliklerini işleyebileceğini belirtmenize olanak tanımasıdır. Bu bilgileri belirtmek, erişilebilirlik hizmetlerinin birbirleriyle birlikte çalışmasını sağlar ve yalnızca belirli uygulamalardaki belirli etkinlik türlerini işleme esnekliği sunar. Etkinlik filtreleme aşağıdaki ölçütleri içerebilir:

  • Paket adları: Hizmetinizin erişilebilirlik etkinliklerini işlemesini istediğiniz uygulamaların paket adlarını belirtin. Bu parametre atlanırsa erişilebilirlik hizmetinizin, herhangi bir uygulamadaki erişilebilirlik etkinliklerine hizmet verebileceği kabul edilir. Bu parametreyi, erişilebilirlik hizmeti yapılandırma dosyalarında android:packageNames özelliğiyle virgülle ayrılmış bir liste olarak ayarlayabilir veya AccessibilityServiceInfo.packageNames üyesini kullanabilirsiniz.

  • Etkinlik türleri: Hizmetinizin işlemesini istediğiniz erişilebilirlik etkinliklerinin türlerini belirtin. Bu parametreyi, erişilebilirlik hizmeti yapılandırma dosyalarında android:accessibilityEventTypes özelliğiyle | karakteriyle ayrılmış bir liste olarak ayarlayabilirsiniz. Örneğin, accessibilityEventTypes="typeViewClicked|typeViewFocused". Dilerseniz AccessibilityServiceInfo.eventTypes üyesini kullanarak da ayarlayabilirsiniz.

Erişilebilirlik hizmetinizi ayarlarken hizmetinizin hangi etkinlikleri işleyebileceğini dikkatlice değerlendirin ve yalnızca bu etkinliklere kaydolun. Kullanıcılar aynı anda birden fazla erişilebilirlik hizmetini etkinleştirebildiğinden hizmetiniz, işleyemediği etkinlikleri kullanmamalıdır. Diğer hizmetlerin, kullanıcı deneyimini iyileştirmek için bu etkinlikleri işleyebileceğini unutmayın.

Erişilebilirlik ses düzeyi

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda, erişilebilirlik hizmetinizin ses çıkışının ses düzeyini cihazdaki diğer seslerden bağımsız olarak kontrol etmenizi sağlayan STREAM_ACCESSIBILITY ses düzeyi kategorisi bulunur.

Erişilebilirlik hizmetleri, FLAG_ENABLE_ACCESSIBILITY_VOLUME seçeneğini ayarlayarak bu akış türünü kullanabilir. Ardından, cihazın AudioManager örneğinde adjustStreamVolume() yöntemini çağırarak cihazın erişilebilirlik ses düzeyini değiştirebilirsiniz.

Aşağıdaki kod snippet'inde, bir erişilebilirlik hizmetinin STREAM_ACCESSIBILITY ses düzeyi kategorisini nasıl kullanabileceği gösterilmektedir:

Kotlin

import android.media.AudioManager.*

class MyAccessibilityService : AccessibilityService() {

    private val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager

    override fun onAccessibilityEvent(accessibilityEvent: AccessibilityEvent) {
        if (accessibilityEvent.source.text == "Increase volume") {
            audioManager.adjustStreamVolume(AudioManager.STREAM_ACCESSIBILITY, ADJUST_RAISE, 0)
        }
    }
}

Java

import static android.media.AudioManager.*;

public class MyAccessibilityService extends AccessibilityService {
    private AudioManager audioManager =
            (AudioManager) getSystemService(AUDIO_SERVICE);

    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        AccessibilityNodeInfo interactedNodeInfo =
                accessibilityEvent.getSource();
        if (interactedNodeInfo.getText().equals("Increase volume")) {
            audioManager.adjustStreamVolume(AudioManager.STREAM_ACCESSIBILITY,
                ADJUST_RAISE, 0);
        }
    }
}

Daha fazla bilgi için Google I/O 2017'deki Android'de erişilebilirlikle ilgili yenilikler başlıklı oturumun videosunu 6:35'ten itibaren izleyin.

Erişilebilirlik kısayolu

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda kullanıcılar, her iki ses seviyesi tuşuna aynı anda basılı tutarak tercih ettikleri erişilebilirlik hizmetini herhangi bir ekrandan etkinleştirebilir ve devre dışı bırakabilir. Bu kısayol, TalkBack'i varsayılan olarak etkinleştirip devre dışı bıraksa da kullanıcılar, düğmeyi cihazlarına yüklenen herhangi bir hizmeti etkinleştirecek ve devre dışı bırakacak şekilde yapılandırabilir.

Kullanıcıların erişilebilirlik kısayolundan belirli bir erişilebilirlik hizmetine erişebilmesi için hizmetin, özelliği çalışma zamanında istemesi gerekir.

Daha fazla bilgi için Google I/O 2017'deki Android'de erişilebilirlikle ilgili yenilikler başlıklı oturumun 13:25'ten itibaren başlayan video kaydını izleyin.

Erişilebilirlik düğmesi

Yazılımla oluşturulan bir gezinme alanı kullanan ve Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda gezinme çubuğunun sağ tarafında bir erişilebilirlik düğmesi bulunur. Kullanıcılar bu düğmeye bastığında, ekranda gösterilen içeriğe bağlı olarak etkinleştirilmiş çeşitli erişilebilirlik özelliklerinden ve hizmetlerinden birini kullanabilir.

Kullanıcıların, erişilebilirlik düğmesini kullanarak belirli bir erişilebilirlik hizmetini çağırmasına izin vermek için hizmetin, AccessibilityServiceInfo nesnesinin android:accessibilityFlags özelliğine FLAG_REQUEST_ACCESSIBILITY_BUTTON işaretini eklemesi gerekir. Ardından hizmet, registerAccessibilityButtonCallback() kullanarak geri çağırmaları kaydedebilir.

Aşağıdaki kod snippet'inde, erişilebilirlik düğmesine basan kullanıcıya yanıt verecek şekilde erişilebilirlik hizmetinin nasıl yapılandırılacağı gösterilmektedir:

Kotlin

private var mAccessibilityButtonController: AccessibilityButtonController? = null
private var accessibilityButtonCallback:
        AccessibilityButtonController.AccessibilityButtonCallback? = null
private var mIsAccessibilityButtonAvailable: Boolean = false

override fun onServiceConnected() {
    mAccessibilityButtonController = accessibilityButtonController
    mIsAccessibilityButtonAvailable =
            mAccessibilityButtonController?.isAccessibilityButtonAvailable ?: false

    if (!mIsAccessibilityButtonAvailable) return

    serviceInfo = serviceInfo.apply {
        flags = flags or AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON
    }

    accessibilityButtonCallback =
        object : AccessibilityButtonController.AccessibilityButtonCallback() {
            override fun onClicked(controller: AccessibilityButtonController) {
                Log.d("MY_APP_TAG", "Accessibility button pressed!")

                // Add custom logic for a service to react to the
                // accessibility button being pressed.
            }

            override fun onAvailabilityChanged(
                    controller: AccessibilityButtonController,
                    available: Boolean
            ) {
                if (controller == mAccessibilityButtonController) {
                    mIsAccessibilityButtonAvailable = available
                }
            }
    }

    accessibilityButtonCallback?.also {
        mAccessibilityButtonController?.registerAccessibilityButtonCallback(it, null)
    }
}

Java

private AccessibilityButtonController accessibilityButtonController;
private AccessibilityButtonController
        .AccessibilityButtonCallback accessibilityButtonCallback;
private boolean mIsAccessibilityButtonAvailable;

@Override
protected void onServiceConnected() {
    accessibilityButtonController = getAccessibilityButtonController();
    mIsAccessibilityButtonAvailable =
            accessibilityButtonController.isAccessibilityButtonAvailable();

    if (!mIsAccessibilityButtonAvailable) {
        return;
    }

    AccessibilityServiceInfo serviceInfo = getServiceInfo();
    serviceInfo.flags
            |= AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
    setServiceInfo(serviceInfo);

    accessibilityButtonCallback =
        new AccessibilityButtonController.AccessibilityButtonCallback() {
            @Override
            public void onClicked(AccessibilityButtonController controller) {
                Log.d("MY_APP_TAG", "Accessibility button pressed!");

                // Add custom logic for a service to react to the
                // accessibility button being pressed.
            }

            @Override
            public void onAvailabilityChanged(
              AccessibilityButtonController controller, boolean available) {
                if (controller.equals(accessibilityButtonController)) {
                    mIsAccessibilityButtonAvailable = available;
                }
            }
        };

    if (accessibilityButtonCallback != null) {
        accessibilityButtonController.registerAccessibilityButtonCallback(
                accessibilityButtonCallback, null);
    }
}

Daha fazla bilgi için Google I/O 2017'deki Android'de erişilebilirlikle ilgili yenilikler başlıklı oturumun 16:28'den itibaren başlayan video kaydını izleyin.

Parmak izi hareketleri

Android 8.0 (API seviyesi 26) ve sonraki sürümlerin yüklü olduğu cihazlardaki erişilebilirlik hizmetleri, cihazın parmak izi sensörü boyunca yapılan yönlü kaydırmalara (yukarı, aşağı, sola ve sağa) yanıt verebilir. Bu etkileşimlerle ilgili geri aramalar almak üzere bir hizmet yapılandırmak için aşağıdaki sırayı tamamlayın:

  1. USE_BIOMETRIC iznini ve CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES özelliğini beyan edin.
  2. android:accessibilityFlags özelliğinde FLAG_REQUEST_FINGERPRINT_GESTURES işaretini ayarlayın.
  3. registerFingerprintGestureCallback() kullanarak geri arama için kaydolun.

Tüm cihazlarda parmak izi sensörü bulunmadığını unutmayın. Bir cihazın sensörü destekleyip desteklemediğini belirlemek için isHardwareDetected() yöntemini kullanın. Parmak izi sensörü olan bir cihazda bile hizmetiniz, kimlik doğrulama amacıyla kullanıldığında sensörü kullanamaz. Sensörün ne zaman kullanılabileceğini belirlemek için isGestureDetectionAvailable() yöntemini çağırın ve onGestureDetectionAvailabilityChanged() geri çağırmasını uygulayın.

Aşağıdaki kod snippet'inde, sanal bir oyun tahtasında gezinmek için parmak izi hareketlerini kullanma örneği gösterilmektedir:

// AndroidManifest.xml
<manifest ... >
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    ...
    <application>
        <service android:name="com.example.MyFingerprintGestureService" ... >
            <meta-data
                android:name="android.accessibilityservice"
                android:resource="@xml/myfingerprintgestureservice" />
        </service>
    </application>
</manifest>
// myfingerprintgestureservice.xml
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:accessibilityFlags=" ... |flagRequestFingerprintGestures"
    android:canRequestFingerprintGestures="true"
    ... />

Kotlin

// MyFingerprintGestureService.kt
import android.accessibilityservice.FingerprintGestureController.*

class MyFingerprintGestureService : AccessibilityService() {

    private var gestureController: FingerprintGestureController? = null
    private var fingerprintGestureCallback:
            FingerprintGestureController.FingerprintGestureCallback? = null
    private var mIsGestureDetectionAvailable: Boolean = false

    override fun onCreate() {
        gestureController = fingerprintGestureController
        mIsGestureDetectionAvailable = gestureController?.isGestureDetectionAvailable ?: false
    }

    override fun onServiceConnected() {
        if (mFingerprintGestureCallback != null || !mIsGestureDetectionAvailable) return

        fingerprintGestureCallback =
                object : FingerprintGestureController.FingerprintGestureCallback() {
                    override fun onGestureDetected(gesture: Int) {
                        when (gesture) {
                            FINGERPRINT_GESTURE_SWIPE_DOWN -> moveGameCursorDown()
                            FINGERPRINT_GESTURE_SWIPE_LEFT -> moveGameCursorLeft()
                            FINGERPRINT_GESTURE_SWIPE_RIGHT -> moveGameCursorRight()
                            FINGERPRINT_GESTURE_SWIPE_UP -> moveGameCursorUp()
                            else -> Log.e(MY_APP_TAG, "Error: Unknown gesture type detected!")
                        }
                    }

                    override fun onGestureDetectionAvailabilityChanged(available: Boolean) {
                        mIsGestureDetectionAvailable = available
                    }
                }

        fingerprintGestureCallback?.also {
            gestureController?.registerFingerprintGestureCallback(it, null)
        }
    }
}

Java

// MyFingerprintGestureService.java
import static android.accessibilityservice.FingerprintGestureController.*;

public class MyFingerprintGestureService extends AccessibilityService {
    private FingerprintGestureController gestureController;
    private FingerprintGestureController
            .FingerprintGestureCallback fingerprintGestureCallback;
    private boolean mIsGestureDetectionAvailable;

    @Override
    public void onCreate() {
        gestureController = getFingerprintGestureController();
        mIsGestureDetectionAvailable =
                gestureController.isGestureDetectionAvailable();
    }

    @Override
    protected void onServiceConnected() {
        if (fingerprintGestureCallback != null
                || !mIsGestureDetectionAvailable) {
            return;
        }

        fingerprintGestureCallback =
               new FingerprintGestureController.FingerprintGestureCallback() {
            @Override
            public void onGestureDetected(int gesture) {
                switch (gesture) {
                    case FINGERPRINT_GESTURE_SWIPE_DOWN:
                        moveGameCursorDown();
                        break;
                    case FINGERPRINT_GESTURE_SWIPE_LEFT:
                        moveGameCursorLeft();
                        break;
                    case FINGERPRINT_GESTURE_SWIPE_RIGHT:
                        moveGameCursorRight();
                        break;
                    case FINGERPRINT_GESTURE_SWIPE_UP:
                        moveGameCursorUp();
                        break;
                    default:
                        Log.e(MY_APP_TAG,
                                  "Error: Unknown gesture type detected!");
                        break;
                }
            }

            @Override
            public void onGestureDetectionAvailabilityChanged(boolean available) {
                mIsGestureDetectionAvailable = available;
            }
        };

        if (fingerprintGestureCallback != null) {
            gestureController.registerFingerprintGestureCallback(
                    fingerprintGestureCallback, null);
        }
    }
}

Daha fazla bilgi için Google I/O 2017'deki Android'de erişilebilirlikle ilgili yenilikler başlıklı oturumun 9:03'ten itibaren başlayan video kaydını izleyin.

Çok dilli metin okuma

Android 8.0 (API düzeyi 26) sürümünden itibaren Android'in metin okuma hizmeti, tek bir metin bloğundaki birden fazla dildeki ifadeleri tanımlayıp okuyabilir. Erişilebilirlik hizmetinde bu otomatik dil değiştirme özelliğini etkinleştirmek için aşağıdaki kod snippet'inde gösterildiği gibi tüm dizeleri LocaleSpan nesnelerine sarın:

Kotlin

val localeWrappedTextView = findViewById<TextView>(R.id.my_french_greeting_text).apply {
    text = wrapTextInLocaleSpan("Bonjour!", Locale.FRANCE)
}

private fun wrapTextInLocaleSpan(originalText: CharSequence, loc: Locale): SpannableStringBuilder {
    return SpannableStringBuilder(originalText).apply {
        setSpan(LocaleSpan(loc), 0, originalText.length - 1, 0)
    }
}

Java

TextView localeWrappedTextView = findViewById(R.id.my_french_greeting_text);
localeWrappedTextView.setText(wrapTextInLocaleSpan("Bonjour!", Locale.FRANCE));

private SpannableStringBuilder wrapTextInLocaleSpan(
        CharSequence originalText, Locale loc) {
    SpannableStringBuilder myLocaleBuilder =
            new SpannableStringBuilder(originalText);
    myLocaleBuilder.setSpan(new LocaleSpan(loc), 0,
            originalText.length() - 1, 0);
    return myLocaleBuilder;
}

Daha fazla bilgi için Google I/O 2017'deki Android'de erişilebilirlikle ilgili yenilikler başlıklı oturumun 10:59'dan itibaren başlayan video kaydını izleyin.

Kullanıcılar adına işlem yapma

Erişilebilirlik hizmetleri, 2011'den itibaren giriş odağını değiştirme ve kullanıcı arayüzü öğelerini seçme (etkinleştirme) dahil olmak üzere kullanıcılar adına işlem yapabilir. 2012'de, kaydırma listeleri ve metin alanlarıyla etkileşim kurma gibi işlemler de eklendi. Erişilebilirlik hizmetleri, ana ekrana gitme, Geri düğmesine basma, bildirim ekranını ve son uygulamalar listesini açma gibi genel işlemleri de gerçekleştirebilir. Android, 2012'den beri erişilebilirlik odaklı bir özellik içerir. Bu özellik sayesinde, görünür tüm öğeler bir erişilebilirlik hizmeti tarafından seçilebilir.

Bu özellikler, erişilebilirlik hizmeti geliştiricilerinin alternatif gezinme modları (ör. hareketle gezinme) oluşturmasına ve engelli kullanıcıların Android destekli cihazlarını daha iyi kontrol etmesine olanak tanır.

Hareketleri dinleme

Erişilebilirlik hizmetleri, belirli hareketleri dinleyebilir ve kullanıcı adına işlem yaparak yanıt verebilir. Bu özellik için erişilebilirlik hizmeti isteğinizin Dokunarak Keşfet özelliğini etkinleştirmesi gerekir. Hizmetiniz, aşağıdaki örnekte gösterildiği gibi hizmetin flags üyesini AccessibilityServiceInfo örneğinin FLAG_REQUEST_TOUCH_EXPLORATION_MODE olarak ayarlayarak bu etkinleştirmeyi isteyebilir.

Kotlin

class MyAccessibilityService : AccessibilityService() {

    override fun onCreate() {
        serviceInfo.flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE
    }
    ...
}

Java

public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onCreate() {
        getServiceInfo().flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
    }
    ...
}

Hizmetiniz, Dokunarak Keşfet özelliğinin etkinleştirilmesini istedikten sonra kullanıcı, özellik etkin değilse etkinleştirilmesine izin vermelidir. Bu özellik etkin olduğunda hizmetiniz, onGesture() geri çağırma yöntemi aracılığıyla erişilebilirlik hareketleriyle ilgili bildirim alır ve kullanıcı adına işlem yaparak yanıt verebilir.

Devam eden hareketler

Android 8.0 (API düzeyi 26) ve sonraki sürümlerin yüklü olduğu cihazlar, birden fazla Path nesne içeren programatik hareketler olan devam eden hareketleri destekler.

Bir dizi vuruş belirtirken, aşağıdaki kod snippet'inde gösterildiği gibi GestureDescription.StrokeDescription oluşturucusunda son bağımsız değişken willContinue'yı kullanarak bu vuruşların aynı programatik harekete ait olduğunu belirtebilirsiniz:

Kotlin

// Simulates an L-shaped drag path: 200 pixels right, then 200 pixels down.
private fun doRightThenDownDrag() {
    val dragRightPath = Path().apply {
        moveTo(200f, 200f)
        lineTo(400f, 200f)
    }
    val dragRightDuration = 500L // 0.5 second

    // The starting point of the second path must match
    // the ending point of the first path.
    val dragDownPath = Path().apply {
        moveTo(400f, 200f)
        lineTo(400f, 400f)
    }
    val dragDownDuration = 500L
    val rightThenDownDrag = GestureDescription.StrokeDescription(
            dragRightPath,
            0L,
            dragRightDuration,
            true
    ).apply {
        continueStroke(dragDownPath, dragRightDuration, dragDownDuration, false)
    }
}

Java

// Simulates an L-shaped drag path: 200 pixels right, then 200 pixels down.
private void doRightThenDownDrag() {
    Path dragRightPath = new Path();
    dragRightPath.moveTo(200, 200);
    dragRightPath.lineTo(400, 200);
    long dragRightDuration = 500L; // 0.5 second

    // The starting point of the second path must match
    // the ending point of the first path.
    Path dragDownPath = new Path();
    dragDownPath.moveTo(400, 200);
    dragDownPath.lineTo(400, 400);
    long dragDownDuration = 500L;
    GestureDescription.StrokeDescription rightThenDownDrag =
            new GestureDescription.StrokeDescription(dragRightPath, 0L,
            dragRightDuration, true);
    rightThenDownDrag.continueStroke(dragDownPath, dragRightDuration,
            dragDownDuration, false);
}

Daha fazla bilgi için Google I/O 2017'deki Android'de erişilebilirlikle ilgili yenilikler başlıklı oturumun 15:47'den itibaren başlayan bölümünü izleyin.

Erişilebilirlik işlemlerini kullanma

Erişilebilirlik hizmetleri, uygulamalarla etkileşimi basitleştirmek ve daha üretken olmak için kullanıcılar adına işlem yapabilir. Erişilebilirlik hizmetlerinin işlem yapabilme özelliği 2011'de eklenmiş ve 2012'de önemli ölçüde genişletilmiştir.

Kullanıcılar adına işlem yapmak için erişilebilirlik hizmetinizin, uygulamalardan etkinlik almak üzere kaydolması ve hizmet yapılandırma dosyasında android:canRetrieveWindowContent değerini true olarak ayarlayarak uygulamaların içeriğini görüntüleme izni istemesi gerekir. Etkinlikler hizmetiniz tarafından alındığında AccessibilityNodeInfo nesnesini getSource() kullanarak etkinlikten alabilir. AccessibilityNodeInfo nesnesiyle hizmetiniz, hangi işlemin yapılacağını belirlemek için görünüm hiyerarşisini inceleyebilir ve ardından performAction() kullanarak kullanıcı adına işlem yapabilir.

Kotlin

class MyAccessibilityService : AccessibilityService() {

    override fun onAccessibilityEvent(event: AccessibilityEvent) {
        // Get the source node of the event.
        event.source?.apply {

            // Use the event and node information to determine what action to
            // take.

            // Act on behalf of the user.
            performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)

            // Recycle the nodeInfo object.
            recycle()
        }
    }
    ...
}

Java

public class MyAccessibilityService extends AccessibilityService {

    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // Get the source node of the event.
        AccessibilityNodeInfo nodeInfo = event.getSource();

        // Use the event and node information to determine what action to take.

        // Act on behalf of the user.
        nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);

        // Recycle the nodeInfo object.
        nodeInfo.recycle();
    }
    ...
}

performAction() yöntemi, hizmetinizin bir uygulama içinde işlem yapmasına olanak tanır. Hizmetinizin ana ekrana gitme, Geri düğmesine dokunma veya bildirim ekranını ya da son kullanılan uygulamalar listesini açma gibi genel bir işlem yapması gerekiyorsa performGlobalAction() yöntemini kullanın.

Odak türlerini kullanma

Android, 2012'de erişilebilirlik odağı adı verilen bir kullanıcı arayüzü odağı tanıttı. Erişilebilirlik hizmetleri, görünür kullanıcı arayüzü öğelerini seçmek ve bunlar üzerinde işlem yapmak için bu odağı kullanabilir. Bu odak türü, kullanıcının karakter yazması, klavyede Enter tuşuna basması veya D-pad'in orta düğmesine basması durumunda ekrandaki hangi kullanıcı arayüzü öğesinin giriş alacağını belirleyen giriş odağından farklıdır.

Kullanıcı arayüzündeki bir öğe giriş odağına sahipken başka bir öğe erişilebilirlik odağına sahip olabilir. Erişilebilirlik odağının amacı, öğenin sistem açısından giriş odaklı olup olmadığına bakılmaksızın, erişilebilirlik hizmetlerine ekrandaki görünür öğelerle etkileşim kurma yöntemi sağlamaktır. Erişilebilirlik hizmetinizin uygulamaların giriş öğeleriyle doğru şekilde etkileşimde bulunduğundan emin olmak için uygulamanın erişilebilirliğini test etme yönergelerini uygulayarak hizmetinizi tipik bir uygulamayı kullanırken test edin.

Erişilebilirlik hizmeti, AccessibilityNodeInfo.findFocus() yöntemini kullanarak hangi kullanıcı arayüzü öğesinin giriş odağına veya erişilebilirlik odağına sahip olduğunu belirleyebilir. focusSearch() yöntemini kullanarak giriş odağıyla seçilebilen öğeleri de arayabilirsiniz. Son olarak, erişilebilirlik hizmetiniz performAction(AccessibilityNodeInfo.ACTION_SET_ACCESSIBILITY_FOCUS) yöntemini kullanarak erişilebilirlik odağını ayarlayabilir.

Bilgi toplama

Erişilebilirlik hizmetleri, kullanıcı tarafından sağlanan bilgilerin (ör. etkinlik ayrıntıları, metin ve sayılar) temel birimlerini toplamak ve göstermek için standart yöntemlere sahiptir.

Pencere değişikliği ayrıntılarını alma

Android 9 (API düzeyi 28) ve sonraki sürümlerde, bir uygulama birden fazla pencereyi aynı anda yeniden çizdiğinde uygulamaların pencere güncellemelerini takip etmesine olanak tanınır. Bir TYPE_WINDOWS_CHANGED etkinliği gerçekleştiğinde aralıkların nasıl değişeceğini belirlemek için getWindowChanges() API'sini kullanın. Çok pencereli güncelleme sırasında her pencere kendi etkinlik grubunu oluşturur. getSource() yöntemi, her etkinlikle ilişkili pencerenin kök görünümünü döndürür.

Bir uygulama, View nesneleri için erişilebilirlik bölmesi başlıkları tanımlarsa hizmetiniz, uygulamanın kullanıcı arayüzü güncellendiğinde bunu algılayabilir. Bir TYPE_WINDOW_STATE_CHANGED etkinliği gerçekleştiğinde, pencerenin nasıl değişeceğini belirlemek için getContentChangeTypes() tarafından döndürülen türleri kullanın. Örneğin, çerçeve bir bölmenin yeni bir başlığı olduğunda veya bir bölme kaybolduğunda bunu algılayabilir.

Etkinlik ayrıntılarını alma

Android, AccessibilityEvent nesneleri aracılığıyla kullanıcı arayüzü etkileşimi hakkında erişilebilirlik hizmetlerine bilgi sağlar. Önceki Android sürümlerinde, erişilebilirlik etkinliğinde bulunan bilgiler, kullanıcılar tarafından seçilen kullanıcı arayüzü denetimi hakkında önemli ayrıntılar sağlarken sınırlı bağlamsal bilgiler sunuyordu. Çoğu durumda, bu eksik bağlam bilgisi, seçilen kontrolün anlamını anlamak için kritik öneme sahip olabilir.

Bağlamın kritik olduğu bir arayüz örneği, takvim veya günlük planlayıcıdır. Kullanıcı, pazartesiden cumaya gün listesinde saat 16:00'ı seçerse ve erişilebilirlik hizmeti"16:00" diye duyurur ancak haftanın gününü, ayın gününü veya ay adını duyurmazsa ortaya çıkan geri bildirim kafa karıştırıcı olur. Bu durumda, toplantı planlamak isteyen bir kullanıcı için kullanıcı arayüzü denetiminin bağlamı çok önemlidir.

Android, 2011'den beri görünüm hiyerarşisine dayalı erişilebilirlik etkinlikleri oluşturarak bir erişilebilirlik hizmetinin kullanıcı arayüzü etkileşimi hakkında elde edebileceği bilgi miktarını önemli ölçüde artırıyor. Görünüm hiyerarşisi, bileşeni içeren kullanıcı arayüzü bileşenleri (üst öğeleri) ve bu bileşenin içerebileceği kullanıcı arayüzü öğelerinden (alt öğeleri) oluşan bir settir. Bu sayede Android, erişilebilirlik etkinlikleri hakkında daha ayrıntılı bilgi sağlayabilir ve erişilebilirlik hizmetlerinin kullanıcılara daha faydalı geri bildirimler vermesine olanak tanır.

Erişilebilirlik hizmeti, bir kullanıcı arayüzü etkinliği hakkında bilgileri sistem tarafından hizmetin AccessibilityEvent geri çağırma yöntemine iletilen bir onAccessibilityEvent() aracılığıyla alır. Bu nesne, üzerinde işlem yapılan nesnenin türü, açıklayıcı metni ve diğer ayrıntılar dahil olmak üzere etkinlik hakkında ayrıntılar sağlar.

  • AccessibilityEvent.getRecordCount() ve getRecord(int): Bu yöntemler, sistem tarafından size iletilen AccessibilityRecord nesneleri kümesini almanıza olanak tanır.AccessibilityEvent Bu ayrıntı düzeyi, erişilebilirlik hizmetinizi tetikleyen etkinlik için daha fazla bağlam bilgisi sağlar.

  • AccessibilityRecord.getSource(): Bu yöntem, bir AccessibilityNodeInfo nesnesi döndürür. Bu nesne, erişilebilirlik etkinliğini başlatan bileşenin görünüm düzeni hiyerarşisini (üstler ve altlar) istemenize olanak tanır. Bu özellik, erişilebilirlik hizmetinin bir etkinliğin tam bağlamını (kapsayan görünümlerin veya alt görünümlerin içeriği ve durumu dahil) incelemesine olanak tanır.

Android platformu, AccessibilityService görünüm hiyerarşisine sorgu gönderme, bir etkinlik oluşturan kullanıcı arayüzü bileşeni ve bunun üst öğesi ile alt öğeleri hakkında bilgi toplama olanağı sağlar. Bunu yapmak için XML yapılandırmanızda aşağıdaki satırı ayarlayın:

android:canRetrieveWindowContent="true"

Bu işlem tamamlandıktan sonra getSource() kullanarak AccessibilityNodeInfo nesnesi alın. Bu çağrı yalnızca etkinliğin kaynağı olan pencere hâlâ etkin pencereyse bir nesne döndürür. Aksi takdirde null değeri döndürülür. Bu nedenle, buna göre davranın.

Aşağıdaki örnekte, bir etkinlik alındığında kod şunları yapar:

  1. Etkinliğin gerçekleştiği görünümün üst öğesini hemen alır.
  2. Bu görünümde, alt görünümler olarak bir etiket ve onay kutusu arar.
  3. Bulursa etiketi ve kontrol edilip edilmediğini belirten bir dize oluşturarak kullanıcıya bildirir.

Görünüm hiyerarşisinde gezinirken herhangi bir noktada boş değer döndürülürse yöntem sessizce vazgeçer.

Kotlin

// Alternative onAccessibilityEvent that uses AccessibilityNodeInfo.

override fun onAccessibilityEvent(event: AccessibilityEvent) {

    val source: AccessibilityNodeInfo = event.source ?: return

    // Grab the parent of the view that fires the event.
    val rowNode: AccessibilityNodeInfo = getListItemNodeInfo(source) ?: return

    // Using this parent, get references to both child nodes, the label, and the
    // checkbox.
    val taskLabel: CharSequence = rowNode.getChild(0)?.text ?: run {
        rowNode.recycle()
        return
    }

    val isComplete: Boolean = rowNode.getChild(1)?.isChecked ?: run {
        rowNode.recycle()
        return
    }

    // Determine what the task is and whether it's complete based on the text
    // inside the label, and the state of the checkbox.
    if (rowNode.childCount < 2 || !rowNode.getChild(1).isCheckable) {
        rowNode.recycle()
        return
    }

    val completeStr: String = if (isComplete) {
        getString(R.string.checked)
    } else {
        getString(R.string.not_checked)
    }
    val reportStr = "$taskLabel$completeStr"
    speakToUser(reportStr)
}

Java

// Alternative onAccessibilityEvent that uses AccessibilityNodeInfo.

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

    AccessibilityNodeInfo source = event.getSource();
    if (source == null) {
        return;
    }

    // Grab the parent of the view that fires the event.
    AccessibilityNodeInfo rowNode = getListItemNodeInfo(source);
    if (rowNode == null) {
        return;
    }

    // Using this parent, get references to both child nodes, the label, and the
    // checkbox.
    AccessibilityNodeInfo labelNode = rowNode.getChild(0);
    if (labelNode == null) {
        rowNode.recycle();
        return;
    }

    AccessibilityNodeInfo completeNode = rowNode.getChild(1);
    if (completeNode == null) {
        rowNode.recycle();
        return;
    }

    // Determine what the task is and whether it's complete based on the text
    // inside the label, and the state of the checkbox.
    if (rowNode.getChildCount() < 2 || !rowNode.getChild(1).isCheckable()) {
        rowNode.recycle();
        return;
    }

    CharSequence taskLabel = labelNode.getText();
    final boolean isComplete = completeNode.isChecked();
    String completeStr = null;

    if (isComplete) {
        completeStr = getString(R.string.checked);
    } else {
        completeStr = getString(R.string.not_checked);
    }
    String reportStr = taskLabel + completeStr;
    speakToUser(reportStr);
}

Artık eksiksiz ve işlevsel bir erişilebilirlik hizmetiniz var. Android'in metin okuma motorunu ekleyerek veya dokunsal geri bildirim sağlamak için Vibrator kullanarak kullanıcıyla nasıl etkileşimde bulunacağını yapılandırmayı deneyin.

İşleme metni

Android 8.0 (API düzeyi 26) ve sonraki sürümlerin yüklü olduğu cihazlarda, erişilebilirlik hizmetlerinin ekranda görünen belirli metin birimlerini tanımlamasını ve bu birimler üzerinde işlem yapmasını kolaylaştıran çeşitli metin işleme özellikleri bulunur.

İpuçları

Android 9 (API seviyesi 28), bir uygulamanın kullanıcı arayüzünde ipuçlarına erişmenizi sağlayan çeşitli özellikler sunar. İpucunun metnini okumak için getTooltipText(), View örneklerine ipuçlarını göstermelerini veya gizlemelerini söylemek için ACTION_SHOW_TOOLTIP ve ACTION_HIDE_TOOLTIP öğelerini kullanın.

İpucu metni

Android, 2017'den itibaren metin tabanlı bir nesnenin ipucu metniyle etkileşim kurmak için çeşitli yöntemler sunmaktadır:

  • isShowingHintText() ve setShowingHintText() yöntemleri, sırasıyla düğümün mevcut metin içeriğinin düğümün ipucu metnini temsil edip etmediğini belirtir ve ayarlar.
  • getHintText(), ipucu metnine erişim sağlar. Bir nesne ipucu metni göstermese bile getHintText() çağrısı başarılı olur.

Ekran metni karakterlerinin konumları

Android 8.0 (API düzeyi 26) ve sonraki sürümlerin yüklü olduğu cihazlarda erişilebilirlik hizmetleri, TextView widget'ındaki her görünür karakterin sınırlayıcı kutusunun ekran koordinatlarını belirleyebilir. Hizmetler, refreshWithExtraData() işlevini çağırarak, ilk bağımsız değişken olarak EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY ve ikinci bağımsız değişken olarak Bundle nesnesini ileterek bu koordinatları bulur. Yöntem yürütülürken sistem, Bundle bağımsız değişkenini Rect nesnelerinin paketlenebilir bir dizisiyle doldurur. Her Rect nesnesi, belirli bir karakterin sınırlayıcı kutusunu temsil eder.

Standartlaştırılmış tek taraflı aralık değerleri

Bazı AccessibilityNodeInfo nesneleri, bir kullanıcı arayüzü öğesinin bir değer aralığı alabileceğini belirtmek için AccessibilityNodeInfo.RangeInfo örneğini kullanır. RangeInfo.obtain() kullanarak bir aralık oluştururken veya getMin() ve getMax() kullanarak aralığın uç değerlerini alırken Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazların tek taraflı aralıkları standart bir şekilde temsil ettiğini unutmayın:

Erişilebilirlik etkinliklerine yanıt verme

Hizmetiniz çalışacak ve etkinlikleri dinleyecek şekilde ayarlandığına göre, AccessibilityEvent geldiğinde ne yapacağını bilmesi için kod yazın. İlk olarak onAccessibilityEvent(AccessibilityEvent) yöntemini geçersiz kılarak başlayın. Bu yöntemde, etkinlik türünü belirlemek için getEventType(), etkinliği tetikleyen görünümle ilişkili etiket metnini ayıklamak için ise getContentDescription() kullanın:

Kotlin

override fun onAccessibilityEvent(event: AccessibilityEvent) {
    var eventText: String = when (event.eventType) {
        AccessibilityEvent.TYPE_VIEW_CLICKED -> "Clicked: "
        AccessibilityEvent.TYPE_VIEW_FOCUSED -> "Focused: "
        else -> ""
    }

    eventText += event.contentDescription

    // Do something nifty with this text, like speak the composed string back to
    // the user.
    speakToUser(eventText)
    ...
}

Java

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    final int eventType = event.getEventType();
    String eventText = null;
    switch(eventType) {
        case AccessibilityEvent.TYPE_VIEW_CLICKED:
            eventText = "Clicked: ";
            break;
        case AccessibilityEvent.TYPE_VIEW_FOCUSED:
            eventText = "Focused: ";
            break;
    }

    eventText = eventText + event.getContentDescription();

    // Do something nifty with this text, like speak the composed string back to
    // the user.
    speakToUser(eventText);
    ...
}

Ek kaynaklar

Daha fazla bilgi edinmek için aşağıdaki kaynakları inceleyin:

Kılavuzlar

Codelab uygulamaları