我最后自己做了这个:

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

从API级别14开始,还可以通过AccessibilityManager获取正在运行的辅助function服务:

public static boolean isAccessibilityEnabled(Context context, String id) { AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE); List runningServices = am .getEnabledAccessibilityServiceList(AccessibilityEvent.TYPES_ALL_MASK); for (AccessibilityServiceInfo service : runningServices) { if (id.equals(service.getId())) { return true; } } return false; }

要找出您的和所有安装的辅助function服务的标识,您可以运行以下代码片段:

public static void logInstalledAccessiblityServices(Context context) { AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE); List runningServices = am .getInstalledAccessibilityServiceList(); for (AccessibilityServiceInfo service : runningServices) { Log.i(TAG, service.getId()); } }

在我的例子中,ID看起来像org.your.package / .YourAccessibilityService。

到目前为止,该方法工作可靠。

检查服务是否启用

/** * Based on {@link com.android.settingslib.accessibility.AccessibilityUtils#getEnabledServicesFromSettings(Context,int)} * @see AccessibilityUtils */ 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);

检测何时启用或禁用服务

进行callback:

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

请注意,这不适用于getEnabledAccessibilityServiceList()方法,因为它的值与Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES值不同步。 这就是为什么我认为使用Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES是一个更好的“一刀切”的方法。

你能跟踪服务是否正在运行吗? 如果无障碍服务启用不应该也运行?

public class MyAccessibilityService extends AccessibilityService{ public static boolean isEnabled = false; @Override public void onServiceConnected() { isEnabled = true; } @Override public void onDestroy(){ isEnabled = false; }

当您的活动服务刚刚开始时获取ID。 在您的Activity服务OnSeriviceCeonnected后,所有的初始化调用。 用这个…

AccessibilityServiceInfo serviceInfo = this.getServiceInfo(); String accessibilityId = serviceInfo.getId();

需要Jelly Bean API

然后,您可以使用Martin的代码(isAccessibilityEnabled)来检查正在运行的服务。

这需要更多的时间

AccessibilityManager am = (AccessibilityManager) context .getSystemService(Context.ACCESSIBILITY_SERVICE);

AccessibilityManager accessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE); List 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会在状态改变的时候被调用,你可以跟踪布尔值来检查权限,这是迄今为止最简单和最轻的解决scheme来检查权限

android从服务检查,android开发分享Android:你如何检查是否启用了特定的AccessibilityService...相关推荐

  1. android 碎片技术,【移动开发】Android中强大的适配功能----Fragment(碎片)总结

    [移动开发]Android中强大的适配功能----Fragment(碎片)总结 发布时间:2020-06-27 00:32:58 来源:51CTO 阅读:10233 作者:zhf651555765 作 ...

  2. android平台安全支付服务(msp)应用开发接口,Android接入支付宝和微信支付的方法...

    前言 很多APP都需要支付功能,国内一般就是支付宝和微信了.目前这2种接入方式对于APP端来说都已经比较方便了,因为大部分的安全校验之类的逻辑都在服务端. APP端总结起来就是三步走: 接入支付的库 ...

  3. android开发分享Android实现手写板功能

    笔画为一次down-move-up的集合撤销笔画并非一次path的动作撤销 应该也是一次down-move -up的撤销为了更好的笔画需要使用贝塞尔曲线来完成 手写板文件:url80.ctfile.c ...

  4. android版音乐播放器开发教程,Android音乐播放器开发文档(20200907152026).pdf

    Android 音乐播放器 撰写人:张 XX 2011-3-15 一. 问题定义 本软件是为了用户智能手机 Android 而开发的一套智能软件, 提供在线 下载音乐,在线播放音乐,读取 SD 卡音乐 ...

  5. android关键应用程序,安卓开发:Android应用程序的四个关键点

    核心提示:本教程为大家介绍在安卓开发中我们应该关注那几点. 对于一个Android应用程序来说,是由四种关键构造块组织而成的,这四种构造块分别是:Activity.Intent Receiver.Se ...

  6. android webview定位权限,混合开发安Android webview使用内置浏览器定位的权限

    具体步骤: 一.添加权限: 二.设置webview.setting WebSettings settings = webView.getSettings(); settings.setGeolocat ...

  7. android framework,GitHub - zhaozepeng/Android_framework: android framework 用来快速开发的android框架...

    android_framework an android framework in order for rapid development ##1.开发环境## 环境为android studio + ...

  8. android企业手机安全软件开发,基于Android的手机安全管理软件的设计与实现毕业论文.doc...

    本资源来源于互联网,版权为原作者所有.若侵犯到您的版权,请提出指正,我们将立即删除. PAGE 2 年年青岛农业大学 毕 业 论 文(设计) 题 目: 基于Android的手机安全管理软件的 设计与实 ...

  9. android开启服务应用禁止被杀死,Android Service服务如何不被杀死

    第一章 Service介绍 service服务是一个应用程序的四大组件之一,可以再后台执行长时间运行的操作,不提供用户界面.一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切到另一个应用 ...

最新文章

  1. 增长率高达40%!物联网平台如何拉动产业马车飞速狂奔
  2. 计算机网络:WebSocket协议详解
  3. php post请求后端拿不到值_[精选] uniapp实现多端开发,与PHP是如何结合的
  4. 51单片机——My-Clock项目
  5. Cover the Tree(2020多校第二场C)
  6. 什么是光纤放大器?光放大器的原理是什么?
  7. 来,我们一起学Hibernate
  8. 利用SmsManager发送短信
  9. Windows中安装 Redis 解压版
  10. 5. Document open() 方法
  11. java中NULL与 的区别
  12. 我的Android进阶之旅------>解决:Failed to create ‘XXX\build\outputs\apk\xxx.apks‘: 拒绝访问。
  13. 如何彻底删掉360安全卫士(全是干货!!!)
  14. 单片机仿真软件proteus8安装与使用
  15. python svm参数_python SVM 案例,sklearn.svm.SVC 参数说明
  16. ManjaroLinux安装NVIDIA驱动
  17. The field file exceeds its maximum permitted size of 1048576 bytes
  18. 搜狗推送工具之泛站程序实现泛收录
  19. 开始数据治理时三个常见的陷阱和解决方法
  20. java波斯王子武者之心,波斯王子2:武者之心通关攻略

热门文章

  1. react中规范类型接口的使用
  2. 一般二叉树的顺序存储Java_100-顺序存储二叉树思路图解
  3. app获取个人信息是否合法_重拳出击!42款APP过度收集用户信息被点名
  4. python二叉树去重_python二叉树学习分享
  5. python期中考试知识点_大学期末考试,有哪些高效复习的技巧?
  6. Nexus 3.31.1-01搭建 maven 私服 windows
  7. mybatisplus 一次性执行多条SQL语句
  8. Hadoop集群安装部署_伪分布式集群安装_02
  9. maven打包时跳过测试
  10. 第五篇:Spring Boot整合filter