我正在开发使用话语提示,通过它来引导人们的应用程序。然而,在这些情况下,我想在应用程序的布局有些微妙的差异,以便导航更容易,也有额外的声音输出(有文字转语音),以帮助引导用户。
我的问题是,我只希望这些变化和额外的输出,如果用户有话语提示活跃。
有没有办法知道它是什么?我没有找到具体的直接访问话语提示设置什么,但我希望有某种形式的访问一般手机设置,可以让我知道我需要什么的。
问候和感谢提前。
举一个例子,请看isScreenReaderActive()
在HomeLauncher.java file in the Eyes-Free shell application(经由groups thread)。
综上所述:你发现所有的屏幕阅读器的Intent,然后查询每个状态提供,看它是否处于活动状态。
如果你真的想限制它只能话语提示,您可以尝试检查来自ResolveInfo.serviceInfo.packageName
回来,看它是否在话语提示包匹配每个结果的queryIntentServices()
。
这样做的推荐方法是查询AccessibilityManager
为无障碍服务的启用状态。
AccessibilityManager am = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE);
boolean isAccessibilityEnabled = am.isEnabled();
boolean isExploreByTouchEnabled = am.isTouchExplorationEnabled();
Novoda已经发布了库调用accessibilitools其执行此检查。它查询可访问管理器检查是否有支持“语音反馈”标志启用任何无障碍服务。
AccessibilityServices services = AccessibilityServices.newInstance(context);
services.isSpokenFeedbackEnabled();
对于我来说,我解决这样这个问题,它运作良好,在我的项目:
下面的详细代码:
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;
}
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;
打开系统设置并进入可及性和挖掘,以关再说回来选项