I\'m developing an application that uses TalkBack to guide people through it. However, in those situations I want to have some subtile differences in the layout of the appli
You can create an inline function in kotlin like:
fun Context.isScreenReaderOn():Boolean{
val am = getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
if (am != null && am.isEnabled) {
val serviceInfoList =
am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN)
if (!serviceInfoList.isEmpty())
return true
}
return false}
And then you can just call it whenever you need it like:
if(context.isScreenReaderOn()){
...
}
Tested and works fine for now.
Open system setting and go to accessibility and tap to off Talk back option
Novoda have released a library called accessibilitools which does this check. It queries the accessibility manager to check if there are any accessibility services enabled that support the "spoken feedback" flag.
AccessibilityServices services = AccessibilityServices.newInstance(context);
services.isSpokenFeedbackEnabled();
AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (am != null && am.isEnabled()) {
List<AccessibilityServiceInfo> serviceInfoList = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
if (!serviceInfoList.isEmpty())
return true;
}
return false;
For me, I solved this problem in this way , it works well in my project:
The detailed code below:
private static final String TALKBACK_SETTING_ACTIVITY_NAME = "com.android.talkback.TalkBackPreferencesActivity";
public static boolean accessibilityEnable(Context context) {
boolean enable = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
try {
AccessibilityManager manager = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> serviceList = manager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN);
for (AccessibilityServiceInfo serviceInfo : serviceList) {
String name = serviceInfo.getSettingsActivityName();
if (!TextUtils.isEmpty(name) && name.equals(TALKBACK_SETTING_ACTIVITY_NAME)) {
enable = true;
}
}
} catch (Exception e) {
if (Logging.isDebugLogging()) {
e.printStackTrace();
}
}
}
return enable;
}
For an example, look at isScreenReaderActive()
in HomeLauncher.java file in the Eyes-Free shell application (via groups thread).
To sum up: you detect all screen readers with Intents, then query the status provider of each to see if it is active.
If you really want to limit it to TalkBack only, you could try checking the ResolveInfo.serviceInfo.packageName
for each result returned from queryIntentServices()
to see if it matches the TalkBack package.