我编写了一款需要使用AccessibilityService
的Android应用。
我知道如何检查手机上是否启用了辅助功能,但我无法确定是否已在辅助功能菜单中专门启用了我的应用。
如果AccessibilityService
没有运行,我想提示用户,但是找不到这样做的好方法。
是否有任何我可能缺少的API方法可以让我知道设备上启用了哪些辅助功能服务?
答案 0 :(得分:65)
我最终自己解决了这个问题:
public boolean isAccessibilityEnabled(){
int accessibilityEnabled = 0;
final String LIGHTFLOW_ACCESSIBILITY_SERVICE = "com.example.test/com.example.text.ccessibilityService";
boolean accessibilityFound = false;
try {
accessibilityEnabled = Settings.Secure.getInt(this.getContentResolver(),android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
Log.d(LOGTAG, "ACCESSIBILITY: " + accessibilityEnabled);
} catch (SettingNotFoundException e) {
Log.d(LOGTAG, "Error finding setting, default accessibility to not found: " + e.getMessage());
}
TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
if (accessibilityEnabled==1){
Log.d(LOGTAG, "***ACCESSIBILIY IS ENABLED***: ");
String settingValue = Settings.Secure.getString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
Log.d(LOGTAG, "Setting: " + settingValue);
if (settingValue != null) {
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
splitter.setString(settingValue);
while (splitter.hasNext()) {
String accessabilityService = splitter.next();
Log.d(LOGTAG, "Setting: " + accessabilityService);
if (accessabilityService.equalsIgnoreCase(ACCESSIBILITY_SERVICE_NAME)){
Log.d(LOGTAG, "We've found the correct setting - accessibility is switched on!");
return true;
}
}
}
Log.d(LOGTAG, "***END***");
}
else{
Log.d(LOGTAG, "***ACCESSIBILIY IS DISABLED***");
}
return accessibilityFound;
}
答案 1 :(得分:46)
自API Level 14起,还可以通过AccessibilityManager
获取已启用的辅助功能服务:
public static boolean isAccessibilityServiceEnabled(Context context, Class<? extends AccessibilityService> service) {
AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
for (AccessibilityServiceInfo enabledService : enabledServices) {
ServiceInfo enabledServiceInfo = enabledService.getResolveInfo().serviceInfo;
if (enabledServiceInfo.packageName.equals(context.getPackageName()) && enabledServiceInfo.name.equals(service.getName()))
return true;
}
return false;
}
用法:
boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
答案 2 :(得分:17)
/**
* Based on {@link com.android.settingslib.accessibility.AccessibilityUtils#getEnabledServicesFromSettings(Context,int)}
* @see <a href="https://github.com/android/platform_frameworks_base/blob/d48e0d44f6676de6fd54fd8a017332edd6a9f096/packages/SettingsLib/src/com/android/settingslib/accessibility/AccessibilityUtils.java#L55">AccessibilityUtils</a>
*/
public static boolean isAccessibilityServiceEnabled(Context context, Class<?> accessibilityService) {
ComponentName expectedComponentName = new ComponentName(context, accessibilityService);
String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (enabledServicesSetting == null)
return false;
TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':');
colonSplitter.setString(enabledServicesSetting);
while (colonSplitter.hasNext()) {
String componentNameString = colonSplitter.next();
ComponentName enabledService = ComponentName.unflattenFromString(componentNameString);
if (enabledService != null && enabledService.equals(expectedComponentName))
return true;
}
return false;
}
用法:
boolean enabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
进行回调:
ContentObserver observer = new ContentObserver() {
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
boolean accessibilityServiceEnabled = isAccessibilityServiceEnabled(context, MyAccessibilityService.class);
//Do something here
}
};
订阅:
Uri uri = Settings.Secure.getUriFor(Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
context.getContentResolver().registerContentObserver(uri, false, observer);
完成后取消订阅:
context.getContentResolver().unregisterContentObserver(observer);
请注意,这不适用于the getEnabledAccessibilityServiceList()
approach ,因为其值与Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
值不同步。这就是为什么我认为使用Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
是一种更好的“一刀切”方法。
答案 3 :(得分:6)
您能跟踪这项服务是否正在运行吗?如果启用了辅助功能服务,它是否也应该运行?
public class MyAccessibilityService extends AccessibilityService{
public static boolean isEnabled = false;
@Override
public void onServiceConnected() {
isEnabled = true;
}
@Override
public void onDestroy(){
isEnabled = false;
}
答案 4 :(得分:2)
在您的活动服务刚刚启动时获取ID。 在所有初始化调用之后的Activity服务OnSeriviceCeonnected中。使用这个......
AccessibilityServiceInfo serviceInfo = this.getServiceInfo();
String accessibilityId = serviceInfo.getId();
需要Jelly Bean API
然后您可以使用Martin的代码(isAccessibilityEnabled)来检查正在运行的服务。
答案 5 :(得分:0)
也许为时已晚,但是这是我检查无障碍服务状态的方法:
$ adb shell dumpsys accessibility
结果:
ACCESSIBILITY MANAGER (dumpsys accessibility)
User state[attributes:{id=0, currentUser=true, accessibilityEnabled=false, touchExplorationEnabled=false, displayMagnificationEnabled=false}
services:{}]
答案 6 :(得分:-1)
AccessibilityManager accessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> runningservice = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);
accessibilityManager.addAccessibilityStateChangeListener(new AccessibilityManager.AccessibilityStateChangeListener() {
@Override
public void onAccessibilityStateChanged(boolean b) {
Toast.makeText(MainActivity.this, "permission "+b, Toast.LENGTH_SHORT).show();
}
});
只要状态发生变化,就会调用Listner 你可以跟踪布尔值来检查权限 这是迄今为止最简单,最轻便的检查权限的解决方案
答案 7 :(得分:-3)
这需要更多次
AccessibilityManager am = (AccessibilityManager) context
.getSystemService(Context.ACCESSIBILITY_SERVICE);