基于AccessibilityService实现的虚拟导航
.
简介
AccessibilityService(无障碍服务) 的设计初衷是提供给无法和界面进行交互的残疾用户,用来协助和帮助他们进行交互操作,比如:点击,返回,长按 和 获取屏幕信息内容等能力。
但现在AccessibilityService已经基本偏离了它设计的初衷,至少在国内是这样,越来越多的App借用AccessibilityService来实现了一些其它功能,甚至是灰色产品。
因为AccessibilityService服务会在后台运行,并在
AccessibilityEvents
被触发时接收系统回调。此类事件通常表示用户界面中的某些状态转换,例如,焦点已更改,按钮已被单击等。也可以可选地请求查询活动窗口的内容。
.
.
AccessbilityService的常用方法介绍
1. disableSelf()方法
作用: 禁用当前服务,也就是说关闭当服务
2. dispatchGesture(gesture,callback,handler)方法
作用: 将手势发送到触摸屏
3. findFocus(int focus)方法
作用: 寻找到具有指定焦点类型的视图
4. getRootInActiveWindow()方法
作用: 获取当前活动窗口中的根节点
5. getServiceInfo()方法
作用: 获取当前服务的配置信息
6. getSystemService(String name)方法
作用: 获取系统服务
7. getWindows()方法
作用: 获取屏幕上的窗口
8. performGlobalAction(int action)方法
作用: 执行全局操作:比如返回,回到主页,打开最近等操作
9. setServiceInfo(AccessibilityServiceInfo info)方法
作用: 设置当前服务的配置信息
10. getAccessibilityButtonController()方法
作用: 返回系统导航区域内辅助功能按钮的控制器
11. getFingerprintGestureController()方法
作用: 获取指纹手势的控制器
12. getMagnificationController()方法
作用: 返回放大器控制器,可用于查询和修改显示放大率的状态
13. getSoftKeyboardController()方法
作用: 返回软键盘控制器,可用于查询和修改软键盘显示模式
.
.
虚拟导航的实现
1. 创建AccessibilitySetting类并继承AccessibilityService
说明: 我这里没有进行任何的逻辑代码处理,只是单纯的想和AccessibilityService服务的对象,目的是通过这个对象调用其中的方法。服务启动的时候会默认开启一个 Notification(通知)。目的是让
AccessibilitySetting
在后台存活更长的时间。
public class AccessibilitySetting extends AccessibilityService {
private static AccessibilityService service;
public static AccessibilityService getService() {
if (service == null) {
return null;
}
return service;
}
@Override
public void onCreate() {
super.onCreate();
//服务创建时创建前台通知
Notification notification = createForegroundNotification(getResources().getString(R.string.app_name),"App正在运行",R.mipmap.ic_launcher);
//启动前台服务
startForeground(1,notification);
}
//服务销毁时
@Override
public void onDestroy(){
//在服务被销毁时,关闭前台服务
stopForeground(true);
super.onDestroy();
}
public AccessibilitySetting() {
service = this;
}
/**
* 当启动服务的时候就会被调用
*/
@Override
protected void onServiceConnected() {
super.onServiceConnected();
}
/**
* 监听窗口变化的回调
*/
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
/**
* 中断服务的回调
*/
@Override
public void onInterrupt() {
}
//创建前台通知,可写成方法体,也可单独写成一个类
public Notification createForegroundNotification(String title, String content, int smallIcon){
//前台通知的id名,任意
String channelId = "AccessibilityService";
//发送通知的等级,此处为高,根据业务情况而定
int importance = NotificationManager.IMPORTANCE_HIGH;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel channel = new NotificationChannel("AccessibilityService","AccessibilityService",importance);
channel.setLightColor(Color.BLUE);
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);