上一篇博客里面介绍了AccessibilityService的用法http://blog.csdn.net/u014310722/article/details/50563160

下面我们主要来介绍一下利用AccessibilityService实现自动安装的功能:

MainActivity的主要代码:

public class MainActivity extends Activity {/*** 下载文件的button*/private Button mDownLoadFileBtn;/*** 广播接收者*/private DownloadFileCompleteReceiver mDownloadFileCompleteReceiver;/*** 获取安装包信息*/private PackageInfo mPackageInfo;/*** 判断是否安装了魔秀主题,true表示安装*/private boolean isThemeIntalled = false;/*** 用来显示悬浮窗的service*/private Intent service;// 用来判断是否从设置页面返回private final int INTENT_TO_SETTING = 0;private SharedPreferences mSharedPreferences;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViews();initOnListener();}@Overrideprotected void onResume() {super.onResume();initBtnText();}/*** 初始化下载按钮显示的字体,如果安装了魔秀主题则显示打开魔秀主题,则显示打开魔秀主题,否则显示下载文件*/private void initBtnText() {try {mPackageInfo = this.getPackageManager().getPackageInfo("com.moxiu.launcher", 0);} catch (NameNotFoundException e) {mPackageInfo = null;e.printStackTrace();}if (mPackageInfo == null) {isThemeIntalled = false;mDownLoadFileBtn.setText(getString(R.string.download_file));} else {isThemeIntalled = true;mDownLoadFileBtn.setText(getString(R.string.open_theme));}}/*** 通过ID得到控件* */private void findViews() {mDownLoadFileBtn = (Button) findViewById(R.id.btn_download);}/*** 设置监听事件*/private void initOnListener() {// 引导用户打开辅助功能// 下载按钮的监听事件mDownLoadFileBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (isThemeIntalled) {OpenOtherApp.openApp(MainActivity.this,"com.moxiu.launcher");// 根据包名打开魔秀主题} else {downLoadFile();}}});}@Overrideprotected void onDestroy() {super.onDestroy();if (mDownloadFileCompleteReceiver != null) {unregisterReceiver(mDownloadFileCompleteReceiver);}}/*** 下载文件*/private void downLoadFile() {DownloadFile.downloadFile(MainActivity.this,"http://a1.33lc.com:801/small/moxiuzhuomian_33lc.apk","mxtheme");}}

下载文件的主要代码:

public class DownloadFile {public static void downloadFile(Context context, String fileUrl, String saveFilePath) {File file = new File(Environment.getExternalStorageDirectory() + "/" + saveFilePath + "/mxtheme.apk");if (!file.exists()) {try {file.getParentFile().mkdirs();} catch (SecurityException se) {se.printStackTrace();}}else{file.delete();}DownloadManager.Request request = new DownloadManager.Request(Uri.parse(fileUrl));request.setAllowedNetworkTypes(Request.NETWORK_WIFI);request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);request.setTitle(context.getString(R.string.download_file));request.setDescription(context.getString(R.string.download_mxtheme));request.setAllowedOverRoaming(false);// 设置文件存放目录request.setDestinationUri(Uri.fromFile(file));DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);downloadManager.enqueue(request);}
}

下载完成的监听事件,因为DownloadManager下载完成后,会自动发一个广播,所以我们只要监听该广播的状态就行了:主要代码如下

public class DownloadFileCompleteReceiver extends BroadcastReceiver {private final static String FILE_PATH = Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk";private SharedPreferences mSharedPreferences;private Editor mEditor;@Overridepublic void onReceive(Context context, Intent intent) {// TODO Auto-generated method stubif (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {Toast.makeText(context, context.getString(R.string.download_completed), Toast.LENGTH_SHORT).show();//下载完成将自动安装设置成true,为的是区分我们自己下载的app和其它出处的appmSharedPreferences = context.getSharedPreferences(MxAutomaticinstallation.APP_NAME, Context.MODE_PRIVATE);mEditor = mSharedPreferences.edit();mEditor.putBoolean(MxAutomaticinstallation.IS_AUTO_INSTALL, true);mEditor.commit();// 调用安装器去安装我们的apk 一键安装开始啦,如果用户把那个服务打开了的话。File file = new File(FILE_PATH);Intent intentInstall = new Intent(android.content.Intent.ACTION_VIEW);intentInstall.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");intentInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intentInstall);}}}

AutomaticInstallationService类的主要代码:

public class AutomaticInstallationService extends AccessibilityService {// 大多数的手机包名一样,联想部分机型的手机不一样private String[] packageNames = { "com.android.packageinstaller", "com.lenovo.security", "com.lenovo.safecenter" };// 偏好设置文件,用来存取服务是否开启private SharedPreferences mSharedPreferences;private Editor mEditor;/*** 此方法是accessibility service的配置信息 写在java类中是为了向下兼容*/@Overrideprotected void onServiceConnected() {super.onServiceConnected();AccessibilityServiceInfo mAccessibilityServiceInfo = new AccessibilityServiceInfo();// 响应事件的类型,这里是全部的响应事件(长按,单击,滑动等)mAccessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;// 反馈给用户的类型,这里是语音提示mAccessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;// 过滤的包名mAccessibilityServiceInfo.packageNames = packageNames;// 开启服务后,在偏好设置文件中将"isAllowAutoInstallation"的值设为truemSharedPreferences = getSharedPreferences(MxAutomaticinstallation.APP_NAME, Context.MODE_PRIVATE);mEditor = mSharedPreferences.edit();mEditor.putBoolean(MxAutomaticinstallation.IS_ALLOW_AUTO_INSTALLATION, true);mEditor.commit();setServiceInfo(mAccessibilityServiceInfo);}@Overridepublic boolean onUnbind(Intent intent) {// 服务断开后,在偏好设置文件中将"isAllowAutoInstallation"的值设为falsemSharedPreferences = getSharedPreferences(MxAutomaticinstallation.APP_NAME, Context.MODE_PRIVATE);mEditor = mSharedPreferences.edit();mEditor.putBoolean(MxAutomaticinstallation.IS_ALLOW_AUTO_INSTALLATION, false);mEditor.commit();return super.onUnbind(intent);}@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {installApplication(event);}@Overridepublic void onInterrupt() {}/*** 查找关键字并执行点击按钮的操作* * @param event*/@SuppressLint("NewApi")private void installApplication(AccessibilityEvent event) {mSharedPreferences = getSharedPreferences(MxAutomaticinstallation.APP_NAME, Context.MODE_PRIVATE);boolean isAutoInstall = mSharedPreferences.getBoolean(MxAutomaticinstallation.IS_AUTO_INSTALL, false);// 若是true,是我们自己下载的app,可以执行自动安装,否则为普通安装if (isAutoInstall == true) {if (event.getSource() != null && isContainInPackages(event.getPackageName().toString())) {// 得到“下一步”节点findNodesByText(event, "下一步");// 得到“安装”节点findNodesByText(event, "安装");// 得到“完成”节点findNodesByText(event, "完成");// 得到“打开”节点findNodesByText(event, "打开");}}}/*** 根据文字寻找节点* * @param event* @param text*            文字*/@SuppressLint("NewApi")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("完成") || text.equals("打开")) {// 如果安装完成,点击任意一个按钮把允许自动装的值改为falsemSharedPreferences = getSharedPreferences(MxAutomaticinstallation.APP_NAME,Context.MODE_PRIVATE);mEditor = mSharedPreferences.edit();mEditor.putBoolean(MxAutomaticinstallation.IS_AUTO_INSTALL, false);mEditor.commit();File file = new File(Environment.getExternalStorageDirectory() + "/mxtheme/mxtheme.apk");if (file.exists()) {file.delete();}} else {info.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}}}/*** 判断包名* * @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;}
}

在完成这个功能的过程中,自己也遇到一些问题:解决方法如下:

一:在自动安装的服务开启后,你通过别的路径路径下载的apk文件,点击安装的时候也会自动安装。

原因:AutomaticInstallationService监听的包名是全系统的,他无法判断你是不是在本应用汇总安装

解决办法:在SharedPrefrence里面存储一个boolean型变量,如果是从本应用中进入安装界面时,则赋值true,安装完成后赋值false,其他地方进入赋值false,安装的时候,读取该值,如果为true,则自动安装,否则不自动安装

二:在AutomaticInstallationService类中,重写onAccessibilityEvent(AccessibilityEvent event)时,event.getSource()一直返回为空

原因:没有配置AutomaticInstallationService的canRetrieveWindowContent属性:

解决方法:在配置AutomaticInstallationService的xml文件中,增加该属性,并设置为true:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:canRetrieveWindowContent="true"android:description="@string/description"android:notificationTimeout="100"/>

Android利用AccessibilityService实现自动装总结(二)相关推荐

  1. Android利用AccessibilityService实现自动装总结(一)

    最近一直在做Android自动安装的利用,下面的内容主要是最近自己在完成这个功能的一些心得,以及一些源码. 下面就先介绍一下AccessibilityService: 在google官网上面对Acce ...

  2. Android利用AccessibilityService自动获取微信号

    前言: 最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息). 当时我第一反应是不可能,如果能够在别的app中获取 ...

  3. android 短信验证码自动填写的二种方法

    转载自:https://blog.csdn.net/VirusDerekRuler/article/details/78506522 现在开发越来越注重用户体验了,现今Android基本都有短信验证功 ...

  4. Android利用zxing用相机扫描识别二维码(添加闪光灯和本地二维码)超详细教程

    之前写了怎么用zxing的jar包进行简单的识别和生成二维码,以及生成带图片的二维码. 接下来单独说说怎么用相机扫描二维码,用相机扫描二维码相对于前面的生成二维码,识别二维码来说要麻烦一点,网上的教程 ...

  5. 利用 Android AccessibilityService 实现自动加好友,拉人进群聊

    WechatHelper 项目地址:coder-pig/WechatHelper 简介: 利用 Android AccessibilityService 实现自动加好友,拉人进群聊 更多:作者   提 ...

  6. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生成apk文件...

    原创,转载请注明:http://www.cnblogs.com/ycxyyzw/p/4555328.html  之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量 ...

  7. 使用Android辅助功能AccessibilityService实现微信自动聊天【外挂插件】

    本文是使用Android辅助功能AccessibilityService实现微信自动聊天demo: 只是为了跟深入的了解Android辅助功能, 提高自身的动手能力. 请勿用于商用,或非法用途. 动手 ...

  8. linux下ant编译android,linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生...

    之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量多渠道,打包生成apk文件>,关于ant打包原理,请先阅读这篇文章.再次不再赘述. 我使用的Linux环境 ...

  9. linux(以ubuntu为例)下Android利用ant自动编译、修改配置文件、批量多渠道,打包生...

    之前写过一篇<windows下Android利用ant自动编译.修改配置文件.批量多渠道,打包生成apk文件>,关于ant打包原理,请先阅读这篇文章.再次不再赘述. 我使用的Linux环境 ...

最新文章

  1. Android之使用IDA Pro静态分析so文件
  2. 【杭电多校2020】Total Eclipse【贪心】【并查集】
  3. java开发工程师学什么专业,Java核心知识点
  4. 容器编排技术 -- Kubernetes 为 Namespace 配置Pod配额
  5. adroid 中公里除时间_全长210.72公里!这条高速有望年底通车…(视频图文)
  6. 不用更改注册表就可以更改桌面所在的位置
  7. 20191024:单调栈问题的引出
  8. phpmyadmin的config-default-php文件中各个配置参数的详细说明
  9. 苹果mac视频剪辑软件:Final Cut Pro
  10. 由内而外 多项国产自主先进设计
  11. 该更新一下你的密码字典了
  12. 二层协议--LACP协议总结
  13. 读取QQ ClientKey C++版本
  14. 【贵州大学计算机考研1】三本学生考研上岸贵州大学软件工程专硕(附带真题与答案)
  15. wps居中对齐不在中间_如何解决wps表格居中调整
  16. excel 语法大全
  17. 后摩尔时代新星之自旋电子器件
  18. microsoftfixitoffice官方清理软件_电脑卡?试试这几款电脑必备清理优化软件
  19. Is necessary to close fille in python?
  20. 探索 TDengine在《图码联侦》项目中的应用可行性及实践研究

热门文章

  1. python3.7输出语句_python3测试工具开发快速入门教程7输入和输出
  2. 拒绝不合理,不可能完成的任务
  3. InkCollector Signiture Made Easy
  4. 肩背劳损,咽喉炎,耳鸣,头晕 的自我康复
  5. iOS CPU架构(ARM指令集)
  6. BillGates要走了,微软将继续前进
  7. WSL2占据过大磁盘空间解决办法
  8. 【mba市场营销论文】MP公司人工关节植入物的市场营销分析(节选)
  9. 编解码持续升级,「硬」实力铸就视频云最优解
  10. 双系统下ubuntu18.04装拓展显示屏血泪史