自研功能在适配TalkBack时遇到一些问题,特殊场景下需要判断此功能是否开启再做对应处理。判断代码如下,亲测可用。
public static boolean getTalkBackState(Context context) {
String TalkBackpackageName = "com.google.android.marvin.talkback";
String TalkBackServiceName = "com.google.android.marvin.talkback.TalkBackService";
final boolean accessibilityEnabled = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1;
Set<ComponentName> enabledServices = getEnabledServicesFromSettings(context, UserHandle.myUserId());
boolean talkBackState = accessibilityEnabled && enabledServices.contains(new ComponentName(TalkBackpackageName, TalkBackServiceName));
return talkBackState;
}
public static Set<ComponentName> getEnabledServicesFromSettings(Context context, int userId) {
final String enabledServicesSetting = Settings.Secure.getStringForUser(
context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
userId);
if (enabledServicesSetting == null) {
return Collections.emptySet();
}
final Set<ComponentName> enabledServices = new HashSet<>();
final TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');
colonSplitter.setString(enabledServicesSetting);
while (colonSplitter.hasNext()) {
final String componentNameString = colonSplitter.next();
final ComponentName enabledService = ComponentName.unflattenFromString(
componentNameString);
if (enabledService != null) {
enabledServices.add(enabledService);
}
}
return enabledServices;
}
在需要判断的地方直接调用 getTalkBackState 方法即可。可以记录下状态,尽量避免多次判断耗时。