如何知道Android TalkBack是否处于活动状态?

时间:2011-02-25 11:49:18

标签: android accessibility talkback android-accessibility

我正在开发一个使用TalkBack引导人们通过它的应用程序。但是,在这些情况下,我希望在应用程序的布局中存在一些微妙的差异,因此导航更容易,并且还有额外的语音输出(使用TextToSpeech)来帮助指导用户。

我的问题是,如果用户激活了TalkBack,我只需要这些更改和额外输出。

有没有办法知道它是不是?我没有找到任何直接访问TalkBack设置的具体内容,但我希望有某种形式的访问通用手机设置可以让我知道我需要什么。

提前致意并表示感谢。

8 个答案:

答案 0 :(得分:54)

建议的方法是在AccessibilityManager查询已启用的辅助功能服务状态。

AccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE);
boolean isAccessibilityEnabled = am.isEnabled();
boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled();

答案 1 :(得分:5)

Novoda已经发布了一个名为accessibilitools的库来执行此检查。它会查询辅助功能管理器,以检查是否启用了支持“语音反馈”标记的辅助功能服务。

AccessibilityServices services = AccessibilityServices.newInstance(context);
services.isSpokenFeedbackEnabled();

答案 2 :(得分:4)

您可以在kotlin中创建内联函数,例如:

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}

然后您可以在需要时随时调用它,例如:

if(context.isScreenReaderOn()){
...
}

经过测试,目前可以正常运行。

答案 3 :(得分:3)

例如,请查看HomeLauncher.java file in the Eyes-Free shell application中的isScreenReaderActive()(通过groups thread)。

总结:您使用Intents检测所有屏幕阅读器,然后查询每个屏幕阅读器的状态提供程序以查看它是否处于活动状态。

如果您确实只想将其限制为TalkBack,可以尝试检查从ResolveInfo.serviceInfo.packageName返回的每个结果的queryIntentServices(),看它是否与TalkBack包匹配。

答案 4 :(得分:0)

对我而言,我以这种方式解决了这个问题,它在我的项目中运作良好:

  1. 使用getEnabledAccessibilityServiceList()获取所有辅助功能服务,状态为打开的服务将在此列表中
  2. 对讲包含一个名为com.android.talkback.TalkBackPreferencesActivity的活动,您可以遍历列表以查找对讲服务是否已打开
  3. 详细代码如下:

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

答案 5 :(得分:0)

    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;

答案 6 :(得分:0)

感谢@ david-z回答(https://stackoverflow.com/a/41357058/2713403),我采用这种方法来了解是否启用了Google提供的Android无障碍套件

/**
 * This method checks if Google Talkback is enabled by using the [accessibilityManager]
 */
private fun isGoogleTalkbackActive(accessibilityManager : AccessibilityManager) : Boolean
{
    val accessibilityServiceInfoList = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_SPOKEN)
    for (accessibilityServiceInfo in accessibilityServiceInfoList)
    {
        if ("com.google.android.marvin.talkback".equals(accessibilityServiceInfo.resolveInfo.serviceInfo.processName))
        {
            return true
        }
    }
    return false
}

请记住,将Google URI注册为常量:)并按@caseyburkhardt所说(https://stackoverflow.com/a/12362545/2713403)获取Accessibility Manager实例。 @ david-z答案的区别在于,我得到了Android Accessibility Suite软件包名称而不是其应用程序名称,因为它更安全。如果您要检查此检查后是否检查了是否启用了另一个辅助功能套件(例如Samsung屏幕阅读器),则可以检查 if (accessibilityManager.isTouchExplorationEnabled)

干杯!

答案 7 :(得分:-4)

打开系统设置并转到辅助功能,然后点按关闭对话选项