您的位置:首页 > 移动开发 > 微信开发

使用AccessibilityService带你自动安装软件以及自动添加微信好友

2016-07-10 01:57 501 查看
今天我们来做apk自动安装和微信自动添加好友。自动安装功能我们需要监听每个手机的安装app包名,安装app包名是下载好apk后手机系统会默认打开文件进入安装界面的应用,也就是说这个安装界面也是属于某个应用的,那么它必须有一个包名,大部分手机的安装包名都是:com.android.packageinstaller,剩下的还有一些不同的,所以我们监听的包名要有多个包名:com.lenovo.security,com.lenovo.safecenter.

现在我们配置AccessibilityService,如果你对AccessibilityService这个不熟悉的话可以先看看《AccessibilityService详解》

apk自动安装执行步骤:

1.配置监控安装应用:com.android.packageinstaller、com.lenovo.security、com.lenovo.safecenter

2.界面调用时候回调onAccessibilityEvent,在onAccessibilityEvent这个函数我们要执行安装流程,首先执行下一步或继续安装,执行安装,执行打开

3.流程到执行打开流程后将文件删除
public class IAccessbilityService extends AccessibilityService {
// 大多数的手机包名一样,联想部分机型的手机不一样
private String[] packageNames = { "com.android.packageinstaller", "com.lenovo.security", "com.lenovo.safecenter" };

/**
* 此方法是accessibility service的配置信息 写在java类中是为了向下兼容
*/
@Override
protected void onServiceConnected() {
super.onServiceConnected();
AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo();
// 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等)
mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
// 反馈给用户的类型,这里是语音提示
mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
// 过滤的包名
mAccessibilityServiceInfo.packageNames = packageNames;
setServiceInfo(mAccessibilityServiceInfo);
}

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
installApplication(event);
}

@Override
public void onInterrupt() {

}

/**
* 查找关键字并执行点击按钮的操作
*
* @param event
*/
private void installApplication(AccessibilityEvent event) {
if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {
// 点击“下一步”节点
findNodesByText(event, "下一步");
// 点击“继续安装”节点
findNodesByText(event, "继续安装");
// 点击“安装”节点
findNodesByText(event, "安装");
// 点击“打开”节点
findNodesByText(event, "打开");
}
}

/**
* 判断包名
*
* @param str
*            当前界面包名
* @return
*/
private boolean isContainInPackages(String str) {
boolean flag = false;
for (int i = 0; i < packageNames.length; i++) {
if ((packageNames[i]).equals(str)) {
flag = true;
return flag;
}
}
return flag;
}

/**
* 根据文字寻找节点
*
* @param event
* @param text
*            文字
*/
private void findNodesByText(AccessibilityEvent event, String text) {
List<AccessibilityNodeInfo> nodes = event.getSource().findAccessibilityNodeInfosByText(text);

if (nodes != null && !nodes.isEmpty()) {
for (AccessibilityNodeInfo info : nodes) {
if (info.isClickable()) {// 只有根据节点信息是下一步,安装,完成,打开,且是可以点击的时候,才执行后面的点击操作
if (text.equals("打开")) {
File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");
if (file.exists()) {
file.delete();
} else {
info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
}
}
}

}


这个类主要的作用是当服务被打开后调用onServiceConnected函数然后setServiceInfo设置监听窗口的信息与包名
private String[] packageNames = { "com.android.packageinstaller", "com.lenovo.security", "com.lenovo.safecenter" };
@Override
protected void onServiceConnected() {
super.onServiceConnected();
AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo();
// 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等)
mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
// 反馈给用户的类型,这里是语音提示
mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
// 过滤的包名
mAccessibilityServiceInfo.packageNames = packageNames;
setServiceInfo(mAccessibilityServiceInfo);
}
监听到安装包被安装的时候就会被调用onAccessibilityEvent这个函数
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
installApplication(event);
}
接下来是操作apk安装,流程是:点击下一步或点击继续安装->点击安装->点击完成->打击打开应用
if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {

// 点击“下一步”节点
findNodesByText(event, "下一步");
// 点击“继续安装”节点
findNodesByText(event, "继续安装");
// 点击“安装”节点
findNodesByText(event, "安装");

// 点击“打开”节点
findNodesByText(event, "打开");

}

当点击打开节点时则表示安装已完成那么我们应该要把apk删除

if (text.equals("打开")) {
File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");
if (file.exists()) {
file.delete();
}
}
源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: