@
liyafe1997 #13 如果你指的是直接检测,给个 true or false 的结果,那么暂时是不太可行的。但是还是有比较方便的方法来测试。
假设张三希望在某 app 进行自动登陆,通过无障碍服务实现,找到 ID 为 abc 的 textview 就准备往里填写用户名。
而目标应用为了避免这种情况,只需要代码里 new TextView ,并赋 id 为 abc ,并不需要真的 attach 到 View ,调用类似这样的代码
textView.sendAccessibilityEvent(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
如果最后 textview 里真的有值了,那么就是有无障碍服务操作,因为此时这个组件并不在用户可见的视图,类似的变种,比如视图先放到可视区域以外,size 先做的很小。透明度调低等等,开动小脑袋瓜,还有不少。
accessibilityManager.getInstalledAccessibilityServiceList()[*].packageNames 也可以知道哪些无障碍服务正在辅助自己,packageNames 为 null 或者自己的包名,那么都是自己的专辅。
同时目前 Android 上无障碍服务的正经应用并不多,建立个白名单并不困难。除了少数几个正经应用,其他我不认识的应用,还在辅助我,风控等级就往上调就行了。