采用AccessibilityService实现安卓中的类静默安装

时间:2021-06-20 22:36:52

简介

AccessibilityService是一个辅助类,可以监听我们手机的焦点,窗口变化,按钮点击等等。实现它的服务需要在手机设置里面->辅助功能在这里面找到你自己实现的辅助类,然后打开它就可以进行我们一系列的监听了。

意义

开发者可以利用这些服务使得程序更好用。开发者可以搭建自己的Accessibility服务,这可以加强可用性,例如声音提示,物理反馈,和其他可选的操作模式。Accessibility服务可以为所有的应用程,一组应用程序或单个应用程序提供这些增强功能。

使用

现在我们要实现这样一个功能,当用户点击了安装包过后自动完成安装,即实现了类似静默安装的功能,因为在系统中,点击过安装包过后会弹出一个确认安装的选择界面。我们需要做的就是监听到安装的窗口弹出来过后就模拟用户点击确定操作,最后点击安装完成。这个过程j就需要用到我们的AccessibilityService来操作。

1、新建一个类继承AccessibilityService,并在AndroidManifest文件里注册

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

.................

<service
android:name=".TamicInstallService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>

<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/auto_install_accessibility_service" />
</service>
</application>

在<application>标签下添加继承了的子类TamicInstallService,同时加入相应的权限。注:从Android4.0开始,开发者可以通过在AndroidManifest里添加<meta-data>标签,在标签里指出配置文件的位置,android:resource当打开自定义的辅助服务时的描述,具体如下:

<?xml version="1.0" encoding="utf-8"?>
<!--
android:accessibilityEventTypes这个属性主要是配置监控的对象,
android:accessibilityFeedbackType这个属性配置手机用什么方式将信息反馈给用户,语音震动等等,这里默认;
android:description这个可以看第一个上图,那么description文字就是这个描述。
android:canRetrieveWindowContent它是获取窗口上的对象的值,由于要获取窗口上的值,所以这个属性必须填写。
notificationTimeout这个是设置超时的时间。
android:packageNames这个是监控应用包名,这个包名是数组,可以监控多个应用。
-->
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/description_auto_install_accessibility_service"
android:notificationTimeout="100" />

2、在子类MyAccessibilityService里实现几个重要的重载方法:
onServiceConnected() - 可选。系统会在成功连接上你的服务的时候调用这个方法,在这个方法里你可以做一下初始化工作,例如设备的声音震动管理,也可以调用setServiceInfo()进行配置工作。

onAccessibilityEvent() - 必须。通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的。
onInterrupt() - 必须。这个在系统想要中断AccessibilityService返给的响应时会调用。在整个生命周期里会被调用多次。
onUnbind() - 可选。在系统将要关闭这个AccessibilityService会被调用。在这个方法中进行一些释放资源的工作。

关键代码如下:

/**
* 监听窗口变化的回调
* 必须。通过这个函数可以接收系统发送来的AccessibilityEvent,接收来的AccessibilityEvent是经过过滤的,过滤是在配置工作时设置的
*/
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
{
if (event.getSource() == null)
{
return;
}
switch (INVOKE_TYPE)
{
case TYPE_INSTALL_APP:
try
{
processAccessibilityEvent(event);
}
catch (Exception e)
{
e.printStackTrace();
}
break;
case TYPE_UNINSTALL_APP:
//processUninstallApplication(event);
break;
case TYPE_INSTALL_APP_FINISH:
AccessibilityNodeInfo targetNode = event.getSource();
if (performClickActionWithFindNode(targetNode,
null,
this.getString(R.string.btn_accessibility_sure),
false))
{
Log.e(LOG_TAG, "---closed permission activity---");
}
break;
default:
break;
}
}
}

缺陷

实现此类功能会有兼容性的问题,因此难点儿就在于如何做好适配,鉴于只是学习一下安卓中的AccessibilityService功能,所以本文并没有做很好的适配,不过亲测在三星Galaxy上是可以完成预期的功能的,即实现静默安装,小米上仍是有问题的。点击下载源码