本文共 3944 字,大约阅读时间需要 13 分钟。
今天我们来做apk自动安装和微信自动添加好友。自动安装功能我们需要监听每个手机的安装app包名,安装app包名是下载好apk后手机系统会默认打开文件进入安装界面的应用,也就是说这个安装界面也是属于某个应用的,那么它必须有一个包名,大部分手机的安装包名都是:com.android.packageinstaller,剩下的还有一些不同的,所以我们监听的包名要有多个包名:com.lenovo.security,com.lenovo.safecenter. 现在我们配置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" };
-
-
-
-
- @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() {
-
- }
-
-
-
-
-
-
- private void installApplication(AccessibilityEvent event) {
- if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {
-
- findNodesByText(event, "下一步");
-
- findNodesByText(event, "继续安装");
-
- findNodesByText(event, "安装");
-
- findNodesByText(event, "打开");
- }
- }
-
-
-
-
-
-
-
-
- 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;
- }
-
-
-
-
-
-
-
-
- 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();
- }
- }
转载地址:http://mjpr.baihongyu.com/