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:
android:description
android:packageNames
android:accessibilityEventTypes
android:accessibilityFlags
android:accessibilityFeedbackType
android:notificationTimeout
android:canRetrieveWindowContent
android:settingsActivity
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ığındaAccessibilityEvent
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şkiliAccessibilityEvent
öğ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 veyaAccessibilityServiceInfo.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 kullanarakAccessibilityServiceInfo.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:
USE_BIOMETRIC
beyan edin veCAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES
olanağı sunar.FLAG_REQUEST_FINGERPRINT_GESTURES
ayarını yapın.android:accessibilityFlags
özelliğine eklenmelidir.registerFingerprintGestureCallback()
üzerinden geri arama için kaydolun.
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()
vegetRecord(int)
: bu yöntemler,AccessibilityRecord
tarafından size iletilenAccessibilityEvent
'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 birAccessibilityNodeInfo
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.
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:
- Etkinliğin gerçekleştiği görünümün üst öğesini hemen yakalar.
- Bu görünümde, alt görüntüleme olarak bir etiket ve onay kutusu arar.
- 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()
vesetShowingHintText()
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:
- Minimum değer olmayan aralıklar için
Float.NEGATIVE_INFINITY
minimum değeri temsil eder. - Maksimum değer olmayan aralıklar için
Float.POSITIVE_INFINITY
maksimum değeri temsil eder.
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: