Kendi erişilebilirlik hizmetinizi oluşturun

Erişilebilirlik hizmeti, yardımcı olmak için kullanıcı arayüzünü geliştiren bir uygulamadır geçici olarak tam olarak etkileşimde bulunamayabilecek engelli kullanıcılar bir ölçümdür. Örneğin, araba kullanan, küçük bir çocuğa bakan, veya çok gürültülü bir partiye katılmak için ek veya alternatif bir arayüz gerekebilir. geri bildirim.

Android, aşağıdakiler de dahil olmak üzere standart erişilebilirlik hizmetleri sağlar: TalkBack ve geliştiriciler kendi hizmetlerini oluşturup dağıtabilir. Bu doküman erişilebilirlik hizmeti oluşturmanın temellerini açıklar.

Erişilebilirlik hizmeti, normal bir uygulamayla birlikte paketlenebilir veya bağımsız bir Android projesidir. Hizmeti oluşturma adımları aşağıda da açıklanmıştır: her iki durumda da kullanılabilir.

Erişilebilirlik hizmetinizi oluşturun

Projeniz içinde bir sınıf oluşturun. AccessibilityService:

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 bir uygulamanız olmasını planlamıyorsanız varsa Activity başlangıç sınıfını kaynak.

Manifest beyanları ve izinleri

Erişilebilirlik hizmetleri sağlayan uygulamalar, uygulama manifest dosyaları, Android tarafından bir erişilebilirlik hizmeti olarak bahsedeceğim. Bu bölümde, şu işlemler için zorunlu ve isteğe bağlı ayarlar açıklanmaktadır: erişilebilirlik hizmetleri.

Erişilebilirlik hizmeti beyanı

Uygulamanızın erişilebilirlik hizmeti olarak değerlendirilmesi için service ekleyin öğesi (activity öğesi yerine) application içinde öğesi ekleyin. Ayrıca, service öğesine bir erişilebilirlik hizmeti amacı filtresi. Manifest, hizmeti de korumalıdır. şunu ekleyerek BIND_ACCESSIBILITY_SERVICE bunun yalnızca sisteme bağlanmasını sağlamak için izin almanız gerekir. 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 etkinlikleri ve geri dönelim. Erişilebilirlik hizmetinin yapılandırılması AccessibilityServiceInfo sınıfını kullanır. Hizmetiniz bunun bir örneğini kullanarak yapılandırma oluşturabilir ve ayarlayabilir sınıf ve setServiceInfo() çalışma zamanında. Ancak tüm yapılandırma seçenekleri bu komut dosyası kullanılarak yöntemidir.

Manifest dosyanıza bir <meta-data> öğesi ekleyerek Bu yapılandırma dosyası, işletmeniz için tüm seçenekleri erişilebilirlik hizmetini kullanabilirsiniz:

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

Bu <meta-data> öğesi, Uygulamanın kaynak dizini: <project_dir>/res/xml/accessibility_service_config.xml>. Aşağıdaki kod hizmet yapılandırma dosyasının içeriğiyle ilgili bir örnek gösterir:

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

Şu sayfada kullanılabilecek XML özellikleri hakkında daha fazla bilgi için: erişilebilirlik hizmeti yapılandırma dosyası için aşağıdaki referansa bakın dokümanlar:

Hangi yapılandırma ayarlarının dinamik olarak ayarlanabileceği hakkında daha fazla bilgi hakkında daha fazla bilgi edinmek için AccessibilityServiceInfo referans belgeler.

Erişilebilirlik hizmetinizi yapılandırın

Uygulamanız için yapılandırma değişkenlerini ayarlarken aşağıdakileri göz önünde bulundurun: erişilebilirlik hizmetini kullanarak sisteme nasıl ve ne zaman çalışacağını bildirir:

  • Bu uygulamanın hangi etkinlik türlerine yanıt vermesini istiyorsunuz?
  • Hizmetin tüm uygulamalar için mi yoksa yalnızca belirli bir paket için mi etkin olması gerekiyor? nelerdir?
  • Hangi farklı geri bildirim türlerini kullanıyor?

Bu değişkenleri ayarlamak için iki seçeneğiniz vardır. Geriye dönük uyumlu seçeneği bunları kod içinde ayarlamak, setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo) Bunu yapmak için, onServiceConnected() yöntemini kullanın ve hizmetinizi aşağıdaki örnekte gösterildiği gibi 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, hizmeti XML dosyası kullanarak yapılandırmaktır. Belirli gibi yapılandırma seçeneklerini canRetrieveWindowContent yalnızca hizmetinizi XML kullanarak yapılandırıyorsanız kullanılabilir. Yapılandırma önceki örnekteki seçenekler XML kullanılarak tanımlandığında aşağıdaki gibi 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 bir <meta-data> etiketini hizmet beyanını sağlamanız gerekir. XML dosyanızı res/xml/serviceconfig.xml, yeni etiket aşağıdaki gibi 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

Bir erişilebilirlik hizmeti, AccessibilityService sınıfını genişletmeli ve bu sınıfa ait aşağıdaki yöntemleri geçersiz kılar. Bu yöntemler, Android sisteminin onları çağırdığı sıra (hizmetin başladığı andan itibaren) (onServiceConnected()), çalışırken (onAccessibilityEvent(), onInterrupt()), kapanışa kadar (onUnbind()).

  • onServiceConnected(): (isteğe bağlı) erişilebilirlik hizmetinize bağlanır. Tek seferlik kurulum için bu yöntemi kullanın kullanıcı geri bildirim sistemine bağlanmak da dahil olmak üzere hizmetinize ilişkin adımlar bazı hizmetler (ör. ses yöneticisi veya cihaz titreşimi) Belirli bir hizmetinizin çalışma zamanında yapılandırmasını değiştirebilir veya tek seferlik ayarlamalar yapabilirsiniz. burası setServiceInfo() hattını aramak için uygun bir konumdur.

  • onAccessibilityEvent(): (zorunlu) Aşağıdaki durumlarda sistem bu yöntemi geri çağırır algıladığında AccessibilityEvent erişilebilirlik ayarlarınız tarafından belirtilen etkinlik filtreleme parametreleriyle eşleşen hizmet (ör. kullanıcının bir düğmeye dokunması veya bir kullanıcı arayüzüne odaklanması) erişilebilirlik hizmetinizin geri bildirim sağladığı uygulamadaki erişim denetimi seviyesi. Zaman sistem bu yöntemi çağırır, ilişkili AccessibilityEvent öğesini iletir. hizmet bu bilgileri yorumlayıp müşteriye geri bildirim belirtir. Bu yöntem, yaşam döngüsü boyunca birçok kez geliştirmenizi sağlar.

  • onInterrupt(): (zorunlu) Sistem tarafından gerçekleştirildiğinde bu yöntemi çağırır hizmet verdiği geri bildirimi aksatmak istiyorsa, bir kullanıcı işlemine tepkisi (ör. odağı farklı bir kontrole taşımak) Bu yöntemi, hizmetinizin yaşam döngüsü boyunca birçok kez çağrılabilir.

  • onUnbind(): (isteğe bağlı) Sistem şu durumda olduğunda bu yöntemi çağırır: erişilebilirlik hizmetini kapatmak üzere. Bu yöntemi kullanarak kullanıcı geri bildirim sisteminin ayrılmasını da içeren tek seferlik kapatma prosedürleri bazı hizmetler (ör. ses yöneticisi veya cihaz titreşimi)

Bu geri çağırma yöntemleri, erişilebilirliğiniz için temel yapıyı sağlar geliştirmenizi sağlar. Android sistemi tarafından sağlanan verilerin nasıl işleneceğine AccessibilityEvent nesnelerinden oluşsun ve kullanıcıya geri bildirim sağlayın. Örneğin, erişilebilirlik etkinliğinden bilgi alma hakkında daha fazla bilgi için etkinlik ayrıntıları bölümünde bulabilirsiniz.

Erişilebilirlik etkinliklerine kaydolun

Erişilebilirlik hizmeti yapılandırmasının en önemli işlevlerinden biri parametreleriniz, hizmetinizin ne tür erişilebilirlik etkinlikleri ele alacağız. Bu bilgilerin belirtilmesi, erişilebilirlik hizmetlerinin birlikte çalışmasını sağlar birbirleriyle etkileşim kurabilir ve size yalnızca belirli etkinlikleri yönetme esnekliğini sunar. türlerden ibaret değildir. Etkinlik filtrelemesi aşağıdakileri içerebilir ölçütler:

  • Paket adları: Erişilebilirliği olan uygulamaların paket adlarını belirtir istediğiniz etkinlikler için geçerlidir. Bu parametre atlanırsa, erişilebilirlik hizmetinin hizmete erişilebilir olduğu kabul edilir etkinlikleri görebilirsiniz. Bu parametreyi erişilebilirlik hizmetinde ayarlayabilirsiniz android:packageNames özelliğini içeren yapılandırma dosyalarını virgülle ayrılmış liste veya AccessibilityServiceInfo.packageNames üye olun.

  • Etkinlik türleri: Erişiminizin açık olmasını istediğiniz erişilebilirlik etkinliklerinin türlerini belirtin çok önemli. Bu parametreyi erişilebilirlik hizmetinde ayarlayabilirsiniz android:accessibilityEventTypes özelliğine sahip yapılandırma dosyaları | karakteriyle ayrılmış bir liste; örneğin, accessibilityEventTypes="typeViewClicked|typeViewFocused". İsterseniz kodu kullanarak AccessibilityServiceInfo.eventTypes üye olun.

Erişilebilirlik hizmetinizi ayarlarken, uygulamanızın hangi etkinlikleri hizmeti yalnızca bu etkinlikleri işleyebilir ve kaydedebilir. Kullanıcılar, aynı anda birden çok erişilebilirlik hizmeti bulunuyorsa hizmetiniz etkinlikleri için çok önemlidir. Diğer hizmetlerin bunları halledebileceğini unutmayın. ve kullanıcı deneyimini iyileştirmeye yönelik etkinliklerdir.

Erişilebilirlik ses düzeyi

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlar STREAM_ACCESSIBILITY ses düzeyi kategorisini seçin. Bu özellik, erişilebilirliğinizin ses düzeyini kontrol etmenizi sağlar. cihazdaki diğer seslerden bağımsız olarak kullanılamaz.

Erişilebilirlik hizmetleri, FLAG_ENABLE_ACCESSIBILITY_VOLUME seçeneğini belirleyin. Ardından şu numarayı arayarak cihazın erişilebilirlik ses düzeyini değiştirebilirsiniz: "the" adjustStreamVolume() yöntemini kullanan AudioManager.

Aşağıdaki kod snippet'i, bir erişilebilirlik hizmetinin STREAM_ACCESSIBILITY cilt kategorisi:

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'de düzenlenen Android erişilebilirliğindeki yenilikler başlıklı oturumun videosunu izleyin. 18:35.

Erişilebilirlik kısayolu

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda kullanıcılar ve simgesine basarak tercih ettikleri erişilebilirlik hizmetini herhangi bir ekrandan devre dışı bırakmak için: ses seviyesi tuşlarının ikisini birden aynı anda basılı tutun. Bu kısayol, hem TalkBack varsayılan olarak devre dışı bırakıldığında, kullanıcılar düğmeyi yapılandırabilir ve cihazlarında yüklü olan hizmetleri devre dışı bırakma.

Kullanıcıların belirli bir erişilebilirlik hizmetine erişilebilirlik bölümünden kısayolunun, bu özelliği çalışma zamanında istemesi gerekir.

Daha fazla bilgi için Google I/O 2017'de düzenlenen Android erişilebilirliğindeki yenilikler başlıklı oturumun videosunu izleyin. 13:25.

Erişilebilirlik düğmesi

Yazılımla oluşturulmuş gezinme alanı kullanan ve Android 8.0 çalıştıran cihazlarda (API düzeyi 26) veya daha yüksek bir düzeye ayarlanırsa gezinme çubuğunun sağ tarafında bir erişilebilirlik düğmesi. Kullanıcılar bu düğmeye bastığında içeriğe bağlı olarak, etkin erişilebilirlik özellikleri ve hizmetleri ekranda gösteriliyor.

Kullanıcıların, erişilebilirliği kullanarak belirli bir erişilebilirlik hizmetini çalıştırmasına izin vermek için düğmesini tıkladığında, hizmetin FLAG_REQUEST_ACCESSIBILITY_BUTTON bir AccessibilityServiceInfo nesnesinin android:accessibilityFlags öğesinde işaretle özelliğini gönderin. Daha sonra hizmet, registerAccessibilityButtonCallback().

Aşağıdaki kod snippet'i, bir erişilebilirlik hizmetini nasıl erişilebilirlik düğmesine basan kullanıcıya yanıt vermek için bir hizmet:

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'de düzenlenen Android erişilebilirliğindeki yenilikler başlıklı oturumun videosunu izleyin. 16:28.

Parmak izi hareketleri

Android 8.0 (API düzeyi 26) veya sonraki sürümleri çalıştıran cihazlarda erişilebilirlik hizmetleri bir cihazın ekranı boyunca yaptığı yön kaydırmalarına (yukarı, aşağı, sola ve sağa) tepki verebilir. parmak izi sensöründe zorlanır. Bunlarla ilgili geri çağırmalar almak üzere bir hizmeti yapılandırmak için etkileşimleri için aşağıdaki sırayı tamamlayın:

  1. USE_BIOMETRIC beyan edin ve CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES olanağı sunar.
  2. FLAG_REQUEST_FINGERPRINT_GESTURES ayarını yapın. android:accessibilityFlags özelliğine eklenmelidir.
  3. registerFingerprintGestureCallback() üzerinden geri arama için kaydolun.
ziyaret edin.

Tüm cihazlarda parmak izi sensörlerinin bulunmadığını unutmayın. Tespit etmek için sensörü destekleyip desteklemediğini öğrenmek için isHardwareDetected() yöntemidir. Parmak izi sensörü içeren bir cihazda bile hizmetiniz ve kimlik doğrulama amacıyla kullanımdayken sensörünü kullanmayın. Bunu ne zaman sensör müsait olduğunda isGestureDetectionAvailable() yöntemini kullanmak onGestureDetectionAvailabilityChanged() geri arama.

Aşağıdaki kod snippet'i, aşağıdakileri yapmak için parmak izi hareketlerinin sanal bir oyun tahtasında gezinme:

// 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'de düzenlenen Android erişilebilirliğindeki yenilikler başlıklı oturumun videosunu izleyin. 09:03.

Çok dilli metin okuma

Android 8.0 (API düzeyi 26) sürümünden itibaren, Android'in metin okuma (TTS) hizmeti tek bir blok içinde birden çok dilde kelime öbeğini belirleyip söyleyebilir metin. Bu otomatik dil geçiş özelliğini erişilebilirlik hizmet, tüm dizeleri Gösterildiği şekliyle LocaleSpan nesne aşağıdaki kod snippet'inde:

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'de düzenlenen Android erişilebilirliğindeki yenilikler başlıklı oturumun videosunu izleyin. 10:59.

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

2011'den itibaren erişilebilirlik hizmetleri, aşağıdakiler de dahil olmak üzere kullanıcılar adına hareket edebilir: giriş odağını değiştirme ve kullanıcı arayüzü öğelerini seçme (etkinleştirme). İçinde 2012'de bu işlemlerin kapsamı, kaydırma listelerini ve etkileşimleri içerecek şekilde genişletildi. kullanabilirsiniz. Erişilebilirlik hizmetleri, ana ekrana gidin, Geri düğmesine basın ve bildirimler ekranı ve son uygulamalar listesi. Android 2012'den beri şunları içerir: erişilebilirlik odağı, bir kullanıcı tarafından tüm görünür öğeleri seçilebilir erişilebilirlik hizmeti.

Bu özellikler, erişilebilirlik hizmetleri geliştiricilerinin hareketle gezinme gibi gezinme modları ve engelli kullanıcılara daha iyi kontrol edebiliyorlar.

Hareketleri dinleyin

Erişilebilirlik hizmetleri, belirli hareketleri dinleyebilir ve hareket ederek yanıt verebilir. bir uyarı alırsınız. Bu özellik için erişilebilirlik hizmeti Dokunarak Araştırma özelliğinin etkinleştirilmesi. Hizmetiniz bunu isteyebilir etkinleştirmek için flags hizmetinin AccessibilityServiceInfo örneğinin üyesi olan FLAG_REQUEST_TOUCH_EXPLORATION_MODE, aşağıda gösterildiği gibidir.

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'in etkinleştirilmesini istedikten sonra, kullanıcının Etkin değilse bu özellik açılır. Bu özellik, etkin olduğunda hizmetiniz hizmetinizin onGesture() geri çağırma yöntemini kullanır ve kullanıcı adına hareket ederek yanıt verebilir.

Kesintisiz hareketler

Android 8.0 (API düzeyi 26) çalıştıran cihazlar devam eden hareketleri destekliyor veya birden fazla program içeren hareketler Path nesnesini tıklayın.

Bir çizgi dizisi belirtirken, bunların son bağımsız değişkeni kullanarak aynı programatik hareketi (willContinue) GestureDescription.StrokeDescription oluşturucuyu temel alır:

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'de düzenlenen Android erişilebilirliğindeki yenilikler başlıklı oturumun videosunu izleyin. 15:47.

Erişilebilirlik işlemlerini kullanma

Erişilebilirlik hizmetleri, kullanıcılarla kurulan etkileşimleri basitleştirmek için kullanıcılar adına hareket edebilir. ve verimliliğinizi artırır. Erişilebilirlik hizmetlerinin aşağıdakileri yapabilmesi: Performans işlemleri, 2011'de eklendi ve 2012'de önemli ölçüde genişletildi.

Kullanıcılar adına işlem yapabilmeniz için erişilebilirlik hizmetinizin kaydolması gerekir uygulamalardan etkinlik almak ve içeriği görüntüleme izni istemek için android:canRetrieveWindowContent ayarını true olarak ayarlayarak hizmet yapılandırma dosyanız olduğundan emin olun. Etkinlikleriniz hizmeti geri alıyorsa AccessibilityNodeInfo kullanarak etkinlikten nesne getSource(). Hizmetiniz, AccessibilityNodeInfo nesnesini kullanarak görünümü inceleyebilir hangi eylemin gerçekleştirileceğini belirlemek ve ardından performAction()

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 24 saat içinde uygulamasını indirin. Hizmetinizin, ana ekrana gidebilir, Geri düğmesine dokunabilir veya ve son uygulamalar listesine eklemek için performGlobalAction() yöntemidir.

Odak türlerini kullanma

Android, 2012'de erişilebilirlik odağı adlı bir kullanıcı arayüzü odağını kullanıma sundu. Erişilebilirlik hizmetleri, görünür herhangi bir kullanıcı arayüzünü seçmek için bu odağı kullanabilir eyleme dökülebilir. Bu odak türü, giriş odaklılık yaklaşımından farklıdır. bir kullanıcı aşağıdaki işlemleri gerçekleştirdiğinde ekrandaki hangi kullanıcı arayüzü öğesinin giriş alacağını belirler karakter yazar, klavyede Enter tuşuna basar veya ortaya iter düğmesi hakkında da bilgi edindiniz.

Kullanıcı arayüzündeki bir öğeye giriş odağı bulunurken erişilebilirlik odağı var. Erişilebilirlik odağının amacı erişilebilirlik hizmetleri için görünür olanla etkileşim yöntemi sağlamak amacıyla girişe odaklanılabilir olup olmadığına bakılmaksızın, ekrandaki tüm öğelere perspektifinden bakalım. Erişilebilirlik hizmetinizin etkileşimde bulunduğundan emin olmak sağlama konusunda işe yarar giriş öğeleri kullanıyorsanız uygulamanın özelliklerini test etmek için erişilebilirlik ile hizmetinizi test edin tipik bir uygulamadır.

Bir erişilebilirlik hizmeti, hangi kullanıcı arayüzü öğesinin giriş yaptığını belirleyebilir erişilebilirlik odağı AccessibilityNodeInfo.findFocus() yöntemidir. Giriş odağıyla seçilebilen öğeleri de arayabilirsiniz her bir arama terimi için focusSearch() yöntemidir. Son olarak, erişilebilirlik hizmetiniz şu uygulamayı kullanarak erişilebilirlik odağını ayarlayabilir: "the" performAction(AccessibilityNodeInfo.ACTION_SET_ACCESSIBILITY_FOCUS) yöntemidir.

Bilgi toplama

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

Aralık değişikliği ayrıntılarını alma

Android 9 (API düzeyi 28) ve sonraki sürümler, aşağıdaki durumlarda uygulamaların pencere güncellemelerini takip etmesini sağlar Uygulama aynı anda birden fazla pencereyi yeniden çiziyor. Bir TYPE_WINDOWS_CHANGED etkinlik gerçekleşirse getWindowChanges() Pencerelerin nasıl değişeceğini belirleyen API. Çoklu pencere güncellemesi sırasında penceresi kendi etkinlik kümesini oluşturur. getSource() yöntemi kökü döndürür. her etkinlikle ilişkili pencerenin görünümünü değiştirebilirsiniz.

Uygulama erişilebilirlik bölmesini tanımlıyorsa başlıkları View nesneleri kullanıyorsanız hizmetiniz uygulamanın kullanıcı arayüzü güncellendiğinden. Bir TYPE_WINDOW_STATE_CHANGED bir etkinlik gerçekleştirdiğinde, getContentChangeTypes() pencerenin nasıl değişeceğini belirleyin. Örneğin çerçeve, başlığı değişir veya bölme kaybolur.

Etkinlik ayrıntılarını alma

Android, erişilebilirlik hizmetleri için kullanıcı arayüzü hakkında bilgi sağlar AccessibilityEvent nesne üzerinden etkileşimde bulunur. Önceki Android sürümlerinde, bir erişilebilirlik etkinliğinde sunulan bilgileri kullanıcıların seçtiği, sınırlı olarak sunulan kullanıcı arayüzü denetimiyle ilgili ayrıntılar bağlamsal bilgiler sağlar. Pek çok durumda bu eksik bağlam bilgisi seçilen kontrolün anlamını anlamanız açısından son derece önemlidir.

Bağlamın çok önemli olduğu arayüze örnek olarak takvim veya gün verilebilir. planlayıcıdır. Kullanıcı Pazartesi-Cuma günleri arasında bir 16:00 zaman aralığı seçerse erişilebilirlik hizmeti "16:00" ifadesini duyuruyor ancak hafta içi gününü duyurulamıyor ayın adını veya ayın adını belirttiğinizde, sonuçta ortaya çıkan geri bildirim kafa karıştırıcı olabilir. Bu durumda kullanıcı arayüzü denetiminin bağlamı, Toplantı planlamak isteyen kullanıcılar

Android 2011'den bu yana, bir şirketin aradığı bilgi miktarını önemli ölçüde Bir kullanıcı arayüzü etkileşimi hakkında erişilebilirlik etkinliklerini görebilirsiniz. Görünüm hiyerarşisi bileşeni (üst öğeleri) ve kullanıcıyı içeren kullanıcı arayüzü bileşenleri arayüz öğeleri, söz konusu bileşen (alt öğeleri) tarafından barındırılabilir. İçinde Böylece Android, erişilebilirlik etkinlikleri hakkında daha fazla ayrıntı sağlayabilir. Böylece, erişilebilirlik hizmetleri, kullanıcılara daha faydalı geri bildirimler sağlar.

Erişilebilirlik hizmeti, kullanıcı arayüzü etkinlikleri hakkında AccessibilityEvent, sistem tarafından hizmetin onAccessibilityEvent() geri çağırma yöntemi. Bu nesne, işlem yapılan nesnenin türü, açıklayıcı metni ve bazı ipuçları vereceğim.

  • AccessibilityEvent.getRecordCount() ve getRecord(int): bu yöntemler, AccessibilityRecord tarafından size iletilen AccessibilityEvent'a katkıda bulunan nesneler bahsedeceğim. Bu ayrıntı düzeyi olayın daha iyi anlamasını erişilebilirlik hizmetinizi tetikler.

  • AccessibilityRecord.getSource(): bu yöntem bir AccessibilityNodeInfo nesnesi döndürür. Bu nesne şunları yapmanızı sağlar: bu bileşenin görünüm düzeni hiyerarşisini (üst ve alt öğeler) erişilebilirlik etkinliğidir. Bu özellik, erişilebilirlik bir olayın tam bağlamını araştırmak için kullanır. veya çocuk görüntülemelerinin eyaletleri arasında yer almalıdır.

ziyaret edin.

Android platformu, AccessibilityService tarafından sorgulanabilir. oluşturan kullanıcı arayüzü bileşeni hakkında bilgi toplayarak, hem de etkinliği için geçerli olur. Bunu yapmak için, aşağıdaki satırı ayarlayın: aşağıdaki kodu kullanın:

android:canRetrieveWindowContent="true"

İşlem tamamlandığında getSource() kullanarak bir AccessibilityNodeInfo nesnesi alın. Bu çağrı yalnızca etkinliğin kaynağı olan pencerenin hale getirmemize yardımcı olur. Aksi takdirde null değerini döndürür. Bu nedenle, buna göre davranın.

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

  1. Etkinliğin gerçekleştiği görünümün üst öğesini hemen yakalar.
  2. Bu görünümde, alt görüntüleme olarak bir etiket ve onay kutusu arar.
  3. Bunları bulursa kullanıcıya raporlamak için bir dize oluşturur. Bu dize, ve işaretlenip işaretlenmediğini görebilirsiniz.

Görünüm hiyerarşisinden geçerken herhangi bir noktada null 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 çalışan bir erişilebilirlik hizmetinize sahipsiniz. Nasıl yapıldığını yapılandırmayı deneyin Android'in metin okuma özelliğini ekleyerek kullanıcıyla etkileşime girdiğini ve arama motoru veya dokunma teknolojisi sağlamak için Vibrator geri bildirim.

Metni işle

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlardan bazıları metin işleme özellikleri sayesinde artık ekranda görünen belirli metin birimlerini belirleyip bunlar üzerinde işlem yapabilir.

İpuçları

Android 9 (API düzeyi 28), şunlara erişmenizi sağlayan çeşitli özellikler sunar: ipuçlarını inceleyebilirsiniz. Tekliflerinizi otomatikleştirmek ve optimize etmek için getTooltipText() araç ipucu metnini okuyabilir ve ACTION_SHOW_TOOLTIP ve ACTION_HIDE_TOOLTIP View örneklerine ipuçlarını gösterme veya gizleme talimatı verin.

İpucu metni

Android'de 2017'den itibaren yeni bir cihazla etkileşimde bulunmak için metin tabanlı nesnenin ipucu metni:

  • İlgili içeriği oluşturmak için kullanılan isShowingHintText() ve setShowingHintText() yöntemleri, sırasıyla düğümün mevcut metninin content, düğümün ipucu metnini temsil eder.
  • getHintText() ipucu metninin kendisine erişim sağlar. Bir nesne gösterilmiyor olsa bile ipucu metni, getHintText() çağrısı başarılı olur.

Ekrandaki metin karakterlerinin konumları

Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazlarda erişilebilirlik hizmetleri her görünür karakterin sınırlayıcı kutusu için ekran koordinatlarını belirleyebilir TextView widget'ında bulabilirsiniz. Hizmetler bu koordinatları bulmak için refreshWithExtraData() pas EXTRA_DATA_TEXT_CHARACTER_LOCATION_KEY ilk bağımsız değişken ve bir Bundle nesnesi olarak kullanabilirsiniz. Yöntem yürütüldükçe, sistem Ayrıştırılabilir bir diziye sahip Bundle bağımsız değişkeni Rect nesne. Her bir Rect nesne belirli bir karakterin sınırlayıcı kutusunu temsil eder.

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

Bazı AccessibilityNodeInfo nesneleri AccessibilityNodeInfo.RangeInfo bir kullanıcı arayüzü öğesinin bir değer aralığı alabileceğini belirtmek için kullanılır. Bir şunun kullanılarak aralık: RangeInfo.obtain() veya uç nokta değerlerini almak için getMin() ve getMax(), Unutmayın, Android 8.0 (API düzeyi 26) ve sonraki sürümleri çalıştıran cihazların tek taraflı aralıklar standartlaştırılmıştır:

Erişilebilirlik etkinliklerine yanıt verme

Hizmetiniz etkinlikleri çalıştıracak ve dinleyecek şekilde ayarlandığına göre artık kod yazarak da , AccessibilityEvent geldiğinde ne yapacağını bilir. İlk olarak onAccessibilityEvent(AccessibilityEvent) yöntemidir. Bu yöntemde getEventType() ve durumu belirlemek için getContentDescription() öğesini tıklayarak etkinliği tetikleyen görünümle ilişkili herhangi bir etiket metnini çıkarı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 kaynaklara göz atın:

Kılavuzlar

Codelab'ler