如何解决打开coreldraw x6打开x7时报错38的问题

经验7812 米
在线时间251 小时
版本7.1.20
解答,是为了延续曾经被帮助的感动~
机型小米手机4
签到次数20
MIUI版本7.1.20
来自网页版
本帖最后由 浅蓝的灯 于
20:23 编辑
被封号不关楼主的事哈~~
360截图50963.jpg (142.3 KB, 下载次数: 1)
下载地址(附件):
游客,如果您要查看本帖隐藏内容请
配上这个 APP Sittings 禁止QQ的“检索正在运行程序” 权限效果更佳。
(166.94 KB, 下载次数: 1600)
20:23 上传
点击文件名下载附件
下载积分: 经验 -1 米
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
经验705 米
在线时间14 小时
版本V8.2.1.0.MBDCNDL
积分 829, 距离下一级还需 1171 积分
积分 829, 距离下一级还需 1171 积分
机型小米Max 高配版
签到次数13
MIUI版本V8.2.1.0.MBDCNDL
来自网页版
看看帖子里藏了啥好东西~~~
经验971 米
在线时间61 小时
版本V8.2.1.0.MBCCNDL
机型小米Max-全网通版
MIUI版本V8.2.1.0.MBCCNDL
来自网页版
不小,给男朋友留有很大的余地!
因为MIUI,所以米粉!
经验331 米
在线时间10 小时
版本7.1.12
积分 395, 距离下一级还需 105 积分
积分 395, 距离下一级还需 105 积分
机型红米手机4 高配版
MIUI版本7.1.12
经验331 米
在线时间10 小时
版本7.1.12
积分 395, 距离下一级还需 105 积分
积分 395, 距离下一级还需 105 积分
机型红米手机4 高配版
MIUI版本7.1.12
有没有小白鼠
经验243 米
在线时间6 小时
版本6.12.1
积分 259, 距离下一级还需 241 积分
积分 259, 距离下一级还需 241 积分
机型红米手机2 移动版
MIUI版本6.12.1
在线时间0 小时
积分 11, 距离下一级还需 39 积分
积分 11, 距离下一级还需 39 积分
经验353 米
在线时间366 小时
版本6.12.22
积分 792, 距离下一级还需 1208 积分
积分 792, 距离下一级还需 1208 积分
机型LG LU6200
MIUI版本6.12.22
来自网页版
经验1269 米
在线时间15 小时
版本V8.2.1.0.MBGCNDL
机型小米手机5SPlus
MIUI版本V8.2.1.0.MBGCNDL
经验219 米
在线时间2 小时
版本6.3.31
积分 250, 距离下一级还需 250 积分
积分 250, 距离下一级还需 250 积分
机型未知设备
MIUI版本6.3.31
灵魂画手勋章
参与灵魂画手活动
2017年小金鸡勋章
回复2016年度评选活动贴
圣诞节勋章
参与圣诞活动
APP 1000万
MIUI论坛APP注册用户突破1000万纪念勋章
小火箭勋章
神舟11号 话题活动
MIUI 300周
MIUI 300周更新纪念勋章
为奥运加油勋章
为奥运加油勋章
MIUI 8纪念勋章
MIUI 8纪念勋章
小米六周年
小米六周年米粉节
解答组专属勋章
解答组专属勋章
MIUI五周年
MIUI五周年纪念勋章
已关注微信
已关注极客秀微信
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
MIUI六周年
MIUI六周年纪念勋章
MIUI 2000万
MIUI 2000万发烧友纪念勋章
MIUI三周年
MIUI三周年纪念勋章
Copyright (C) 2016 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
你输入的邮箱还未注册
还没有帐号请点击
你输入的邮箱还未注册
又想起来了?
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系
抢红包还开外挂?别以为你的原理我不知道!
“ 抢个红包还开外挂的人最可恶了!诅咒你次次手气最烂!(小Q不会告诉你拉到最末有送书彩蛋滴~)2015年底,正当微信和支付宝摩拳擦掌,准备开启一场红包大战之时,突然抢红包神器凭空出现抢了它们的风头。它能自动帮你自动抢红包,不必每个群去蹲守,对于个人来说解放了生产力,但是破坏了抢红包的乐趣,甚至会引发矛盾。所谓的抢红包神器其实在15年早期就已经出现,但真正引起了大众的关注是在年底。抢红包神器是什么?红包插件与红包提醒助手:有些人可能把这两个名词混为一谈,但它们是不同的。红包插件就是能自动抢红包的工具。小米、魅族等厂商都推出了自己的红包助手,它们的功能一般包括:在红包来临时进行提醒,点击提醒直达红包页面。但是还是需要手动抢红包,这显然称不上是神器,也在红包平台的容忍范围内。随着红包插件的传播,关于它的传言也越来越离谱,比如抢了还能再抢,关机还能抢,抢了还能发个谢谢。到底实际情况如何?让我们来探索一下这类红包插件的原理。Android平台红包神器Android平台的开放给这类红包插件提供了许多机会。据笔者探索以及向一些开发者请教的结果,至少有三种理论上可行的技术:1. Android Accessibility ServiceAndroid Accessibility Service是Android系统为视力障碍人士提供的辅助功能,通过它可以获取页面的UI控件位置、内容等,并且模拟点击,通过编码实时监控UI变化,就可以实现针对某个控件自动点击。用在红包上就是,先获取系统推送通知的内容并进行分析,如果是红包,则进入有红包的页面,然后分析页面的元素,找到红包,自动点开。它的限制是需要保证屏幕常亮,在熄屏、解锁界面插件是不运行的。2. 神器XposedXposed是XDA社区开发的一个开源项目,它通过修改Android Dalvik运行时的Zygote进程,使用Xposed Bridge将第三方代码注入到Android应用的方法调用中,实现非侵入式的在运行期动态修改系统和应用行为的能力。用在红包上就是,先通过逆向工程手段找到红包对应的类和方法,然后通过Xposed注入到该类中,改变红包原有的逻辑,甚至可以实现不点开红包就抢红包。它的限制是需要Root,并且逆向工程的难度很高,还不一定能获得想要的信息。3. 安卓PC模拟器安卓PC模拟器是一种在PC上运行Android应用的工具,它们的始祖是BlueStacks,其原理是将Android系统API翻译成Windows API,从而实现模拟Android设备。不过抢红包还需要附加的工具,但PC上能做的事情太多了,就看每一款红火的网游几乎都有外挂,所以要实现在PC上抢红包想必有许多方法。不过,正因为PC的能力太强大,某些应用会对模拟器运行加以限制,就拿微信来说,一旦发现使用PC模拟器登录,账号会被永久封停。在这个基础上再加上抢红包的工具,想要避开官方的检测,其难度不比上面两种方法小。iOS平台红包神器iOS平台比Android平台要规范很多,特别是未越狱的设备,想要达成目的看上去是不可能的。但阿里的安全工程师蒸米给我们提供了一种方法,就是利用企业证书和未越狱应用Hook技术。企业证书是为了把红包插件安装到用户手机上,虽然开发者证书也能做到这一点,但有数量限制,并且过程稍麻烦。具体的原理(以微信为例)则是利用红包插件hook微信,逆向和分析手段获取接收微信消息的函数,然后判断消息中有没有红包,有的话就直接调用打开红包的函数即可。至于红包插件如何hook微信,在蒸米的文章有讲解。在越狱设备上,iOS能做的就要多多了,主要利用的是CydiaSubstrate,它类似于Android平台的Xposed,可以对已安装的App进行hook。然后同样需要进行逆向工程,步骤和上面讲述的差不多。在客户端上可能的红包插件就这么多了,还有人考虑说伪造微信消息,欺骗微信接口。但这只存在理论上的可能,微信使用的是自研加密协议,想要破解几乎是不可能的事情。还有一些奇葩的比如抢红包机器人,不过也就是逗个乐,实际的抢红包效率还不如人的双手。抢包虽然好,开挂需谨慎抢红包神器的风险来自于两方面,信息被盗和账号被封。信息被盗是因为这些第三方的红包插件多半需要很高的权限,能做的事情太多了,轻的只是收集一些用户的隐私信息,严重的甚至用户的支付账号密码都可能被盗。账号被封则是红包平台的反制措施,拿微信来说,一旦检测出抢红包的作弊行为,轻则禁止抢红包三天,重则永久封停账号,如今微信已经是人们非常依赖的社交工具,一旦微信被封停,损失甚至可能超过手机被盗。如何检测和防御红包插件对于这些不同实现的红包插件来说,实际上由于开发难度的不同,使用Accessibility的红包插件最为常见。而对于Accessibility的防御,饿了么移动技术部架构/框架组负责人王朝成介绍了他们的经验。虽然不是抢红包,但之前饿了么也遇到过利用Accessibility的恶意插件的困难,最后他们通过去掉对应的UI控件的辅助标识解决了这个问题。在一篇讲解微信抢红包外挂的文章里,作者自己开发了抢红包插件,也分享了一些防御措施:如何防止外挂在了解整个核心后,获取事件不外乎就是通过文本与id判断,那么就可以将文本改为图标方式,将id改为动态id(每次显示都是随机生成),这样一来就可以提高外挂的门槛。但是,去掉辅助标识,会对信息无障碍造成影响,违反了Android设置Accessibility的初衷,另外这也只能解决一个问题,另外使用注入、Xposed等插件的就无能为力了。笔者请教了微信安卓开发组组长赵原,他介绍微信的防御措施,是在后台对用户的行为策略进行分析,一旦发现疑似作弊就可以给予警告甚至封停账号。这种防御一是需要在客户端采集用户行为数据,二是需要在后端利用机器学习等分析出作弊行为的特征。总结抢红包插件,是移动设备上第三方应用侵入其它应用能力的一个标志,通过本文,你可以了解到恶意软件能对你的手机做些什么。同时,了解了抢红包插件的原理,所谓的抢红包神器也就不再神秘,希望能让你避免因为好奇心去下载它们,虽然开始可能多抢了几块钱的红包,但最后吃亏的还是你自己。读者朋友们对于这类所谓神器有何看法,对抢红包开挂的行为有何见地,不妨在评论区回复我们!扩展阅读阿里的安全工程师蒸米的博文,介绍了iOS非越狱应用Hook技术。/question/这个问题下面的回答解释了一些抢红包插件的原理。/ios-tweak-install-guide作者写了一个iOS越狱的抢红包插件,这是他写的插件的安装教程,还是挺复杂的。/geeeeeeeeek/WeChatLuckyMoney一个开源的抢红包插件,利用的原理是Accessibility。/index.php/archives/10/作者在2015年春节期间写了一个抢红包插件,这是他介绍其原理,用的也是Accessibility。彩蛋一:还没看过瘾?想看更多移动开发文章,想和更多移动同好交流?关注InfoQ垂直公众号「移动开发前线」(ID:bornmobile)回复关键词「抽奖」就有人邮出版社2016最新版移动领域好书相赠,《Android开发进阶:从小工到专家》、《iOS 9开发指南》免费得!Tips:有读者吐槽小Q说的每天抽奖10人送出10本书是骗人的,小Q表示天地良心啊!活动开始后的每日阅读原文处都有更新每日中奖名单的啊!不认真看的同学要拖出去打屁股的!彩蛋二:全球规模最大的云服务供应商之一的AWS,在过去的一年当中积累了相当丰富的云服务落地实践经验。在本期AWS迷你书《云计算让数据管理变得更轻松》中,InfoQ会将过去一年中AWS在数据存储与管理方面的案例与技术方案解析等内容进行整编之后再呈现给各位读者。扫描二维码或点击阅读原文免费下载本书。本文系InfoQ原创首发,未经授权谢绝转载。
15人赞过此文
浏览器扫一扫
分享到朋友圈
社会化媒体
了解更多>>
桂ICP备 号-1
桂公网安备 36号
阅读下一篇
昔我十年前,与君始相识。
Hi,看起来你很喜欢这些内容,但是你还没有登录!在你登录以后,就可以收藏感兴趣的内容,关注感兴趣的作者!经验1754 米
在线时间92 小时
版本7.1.20
机型小米手机4c
签到次数43
MIUI版本7.1.20
首先先感谢吴大的制作,红包插件需要XP框架配合使用,链接里有许多版本,根据自己的实际下载就行,但是最新版QQV6.6.6.3025还无法使用,也请大家留心等待
Screenshot_-08-33-05-077_com.wuxianlin.luckymoney.png (212.21 KB, 下载次数: 0)
Screenshot_-08-33-07-564_com.wuxianlin.luckymoney.png (203.42 KB, 下载次数: 0)
话不多说直接上图
链接:/share/link?shareid=&uk=
希望大家不要做伸手党。
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
在线时间1 小时
版本6.3.31
积分 64, 距离下一级还需 136 积分
积分 64, 距离下一级还需 136 积分
机型红米Note2 移动/标准
MIUI版本6.3.31
很给力支持一下
经验1799 米
在线时间28 小时
积分 2137, 距离下一级还需 2863 积分
积分 2137, 距离下一级还需 2863 积分
经验1754 米
在线时间92 小时
版本7.1.20
机型小米手机4c
签到次数43
MIUI版本7.1.20
希望大家支持
经验853 米
在线时间91 小时
版本6.8.11
积分 899, 距离下一级还需 1101 积分
积分 899, 距离下一级还需 1101 积分
机型小米手机2/2S
签到次数87
MIUI版本6.8.11
通过手机发布
经验1603 米
在线时间12 小时
版本V8.1.4.0.LXHCNDI
机型小米Note
签到次数21
MIUI版本V8.1.4.0.LXHCNDI
经验519 米
在线时间14 小时
版本V8.1.2.0.LXACNDI
积分 565, 距离下一级还需 1435 积分
积分 565, 距离下一级还需 1435 积分
签到次数17
MIUI版本V8.1.2.0.LXACNDI
来自网页版
在线时间8 小时
版本7.1.20
积分 82, 距离下一级还需 118 积分
积分 82, 距离下一级还需 118 积分
机型红米Pro
MIUI版本7.1.20
噢噢噢哦哦
在线时间7 小时
积分 60, 距离下一级还需 140 积分
积分 60, 距离下一级还需 140 积分
谢谢提供。
在线时间6 小时
积分 106, 距离下一级还需 94 积分
积分 106, 距离下一级还需 94 积分
看看看看看
2017年小金鸡勋章
回复2016年度评选活动贴
关注新浪微博
已关注新浪微博
已关注极客秀微信
已关注微信
关注腾讯微博
已关注腾讯微博
Copyright (C) 2016 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号从抢红包插件说AccessibilityService - 简书
从抢红包插件说AccessibilityService
微信红包自打出世以来就极其受欢迎,抢红包插件可谓红极一时.今天,我们重新谈谈抢红包插件的哪些事儿.本质上,抢红包插件的原理不难理解,其过程就是在收到红包时,自动模拟点击.做过自动化UI测试的童鞋应该非常熟悉了.
那么问题来了,我们怎么知道有没有红包,又怎么模拟点击操作呢?在PC端我们有按键精灵,那么在Android设备上呢?话说也偶然,Google为了让Android系统更实用,为用户提供了无障碍辅助服务---AccessibilityService.
AccessibilityService运行在后台,并且能够收到由系统发出的一些事件(AccessibilityEvent,这些事件表示用户界面一系列的状态变化),比如焦点改变,输入内容变化,按钮被点击了等等,该种服务能够请求获取当前活动窗口并查找其中的内容.
换言之,界面中产生的任何变化都会产生一个时间,并由系统通知给AccessibilityService.这就像监视器监视着界面的一举一动,一旦界面发生变化,立刻发出警报.
现在让我们来看看如何AccessibilityService的基本使用.
开发这种服务需要继承AccessibilityService,并实现其中的方法.
1. 创建服务类
编写自己的服务类,需要继承AccessibilityService类,如下:
public class RobService extends AccessibilityService {
public void onAccessibilityEvent(AccessibilityEvent event) {
public void onInterrupt() {
protected void onServiceConnected() {
这里我们简单的介绍一下该类常用的方法,更详细的内容参见
disableSelf()
禁用当前服务,也就是在服务可以通过该方法停止运行
findFoucs(int falg)
查找拥有特定焦点类型的控件
getRootInActiveWindow()
如果配置能够获取窗口内容,则会返回当前活动窗口的根结点
getSeviceInfo()
获取当前服务的配置信息
onAccessibilityEvent(AccessibilityEvent event)
有关AccessibilityEvent事件的回调函数.系统通过sendAccessibiliyEvent()不断的发送AccessibilityEvent到此处
performGlobalAction(int action)
执行全局操作,比如返回,回到主页,打开最近等操作
setServiceInfo(AccessibilityServiceInfo info)
设置当前服务的配置信息
getSystemService(String name)
获取系统服务
onKeyEvent(KeyEvent event)
如果允许服务监听按键操作,该方法是按键事件的回调,需要注意,这个过程发生了系统处理按键事件之前
onServiceConnected()
系统成功绑定该服务时被触发,也就是当你在设置中开启相应的服务,系统成功的绑定了该服务时会触发,通常我们可以在这里做一些初始化操作
2. 声明服务
像其他Service服务一样,需要在AndroidManifest.xml中声明.除此之外,该服务还必须配置以下两项:
配置&intent-filter&,其name为固定的android.accessibilityservice.AccessibilityService
声明BIND_ACCESSIBILITY_SERVICE权限,以便系统能够绑定该服务(4.1版本后要求)
注意:任何一点配置错误,系统都无反应,因此其基本配置如下:
android:name=".RobService"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"&
&intent-filter&
&action android:name="android.accessibilityservice.AccessibilityService"/&
&/intent-filter&
&/service&
3. 配置服务类
在AndroidManifest.xml声明了该服务之后,接下来就是需要对该服务进行一些参数设置了.该服务能够被配置用来接受指定类型的事件,监听指定package,检索窗口内容,获取事件类型的时间等等.目前有两种配置方法:
方法一:4.0之后提供了可以通过&meta-data&标签进行配置
方法二:通过setServiceInfo()进行配置
1. 通过&meta-data&进行配置
在manifest生命的servce中提供一个meta-data标签,然后通过android:resource指定相应的配置文件(在res目录下创建xml文件,并在其中创建配置文件accessibility.xml):
android:name=".RobService"
android:enabled="true"
android:exported="true"
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/accessibility"/&
&/service&
接下来我们来看accessibility.xml的相关配置:
&?xml version="1.0" encoding="utf-8"?&
&accessibility-service xmlns:android="/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" /&
后面,我们在只需要仿照该配置文件根据自己的需求进行修改即可.
2. 通过setServiceInfo(AccessibilityServiceInfo info)
也可以通过setServiceInfo(AccessibilityServiceInfo)为其配置信息,除此之外,通过该方法可以在运行期间动态修改服务配置.需要注意,该方法只能用来配置动态属性:eventTypes,feedbackType,flags,notificaionTimeout及packageNames.
这里我们简单的示例一下:
protected void onServiceConnected() {
AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();
serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
serviceInfo.packageNames = new String[]{"com.tencent.mm"};
serviceInfo.notificationTimeout=100;
setServiceInfo(serviceInfo);
AccessibilityServiceInfo该类被用于配置AccessibilityService信息,该类中包含了大量用于配置的常量字段及用来xml 属性,比如常见的:android:accessibilityEventTypes,android:canRequestFilterKeyEvents,android:packageNames等等,更多信息参见
这里简单的对重要属性进行说明:
accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,即哪些事件通知,比如窗口打开,滑动,焦点变化,长按等.具体的值可以在AccessibilityEvent类中查到,如typeAllMask表示接受所有的事件通知.
accessibilityFeedbackType:表示反馈方式,比如是语音播放,还是震动
canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容.也就是如果你希望在服务中获取窗体内容的化,则需要设置其值为true.
notificationTimeout:接受事件的时间间隔,通常将其设置为100即可.
packageNames:表示对该服务是用来监听哪个包的产生的事件
4. 启动服务
当我们做完以上操作,便可将app安装到手机.安装成功后,在设置-&辅助功能中便可以找到我们的服务.该服务默认处在关闭状态,需要手动开启.
5. 获取事件信息
上面我们说道,onAccessibilityEvent(AccessibilityEvent event)是该服务的核心方法,其中参数event封装来自界面相关事件的信息,比如我们可以获得该事件的事件类型,进而根据起类型选择不同的处理方式:
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_CLICKED:
//界面点击
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
//界面文字改动
这里我们对AccessibilityEvent进行简单的说明:当用户发生发生变化时,系统会发送一系列的AccessibilityEvent事件,比如按钮被电击时会发送TYPE_VIEW_CLICKED类型的事件.
getEventType()
getSource()
获取事件源对应的结点信息
getClassName()
获取事件源对应类的类型,比如点击事件是有某个Button产生的,那么此时获取的就是Button的完整类名
获取事件源的文本信息,比如事件是有TextView发出的,此时获取的就是TextView的text属性.如果该事件源是树结构,那么此时获取的是这个树上所有具有text属性的值的集合
isEnabled()
事件源(对应的界面控件)是否处在可用状态
getItemCount()
如果事件源是树结构,将返回该树根节点下子节点的数量
简单的介绍一下事件源
系统不断的产生各种事件,有些是界面控件产生的,有些是系统产生的.对于由界面控件的产生的事件,通常我们将该控件称之为事件源.并不是所有的事件都能通过getSource()方法获取到事件源,比如像通知消息类型的事件(TYPE_NOTIFICATION_STATE_CHANGED).
6. 获取窗口内容
仅仅知道事件的信息是不够的,我们还希望通过事件来获取发出该事件(事件源)的信息,比如Button按钮被点击时它的text.
一个服务可以配置为可以检索窗口内容,即获取窗口内容.整个窗口内容本质上是关于AccessibilityWindowInfo和AccessibilityNodeInfo的树结构,我称之为内容树.(类似View Tree,但由不完全相同)
需要注意,该服务可能配置了只检测了部分事件,而不是全部事件,这就意味着,当内容树发生变化后,该服务可能并不知道,即该服务无法及时的了解当前的内容树是否发生了变化.比如说,你的服务只检测了点击事件,但是此时界面的输入焦点已经变化,这样整个结点树也发生了变化,但是你的服务却不知道,此时你在结点中拿到的窗口内容可能已经不是最新的了.因此,如果你想及时的获知当前窗口的内容,那么就在配置的时候,设置监听全部事件.
现在来看看如何获取窗口内容?
正如上面所提到的,要想获取控件的相关信息,在配置AccessibilityService时需设置canRetrieveWindowContent为true.之后,便可以通过一下方法获取窗口内容:AccessibilityEvent.getSource(),findFocus(int),getWindow()或者getRootInActiveWindow()
7. 服务的生命周期
简单的介绍下该类型服务相关的生命周期问题,主要是以下三点:
该种服务完全由系统管理,并遵循已有的服务周期.
开启一个服务只能由用户在设置中打开,而关闭则只能由用户在设置中关闭或者服务本身通过diableSelf()方法关闭(当然,现在有些第三放软件也可以强制关闭该类型服务)
系统绑定该服务之后,会调用onServiceConnected()方法,这个方法可以被重写,在其中,你可以做一些初始化的操作.
8. 检测服务是否开启
介绍了一些AccessibilityService的基础知识之后,再补充一点关于检测某个服务是否开启的知识.通常来说大体有一下两种方法来检测:
方法一:借助服务管理器AccessibilityManager来判断,但是该方法不能检测app本身开启的服务.
private boolean enabled(String name) {
AccessibilityManager am = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
List&AccessibilityServiceInfo& serviceInfos = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
List&AccessibilityServiceInfo& installedAccessibilityServiceList = am.getInstalledAccessibilityServiceList();
for (AccessibilityServiceInfo info : installedAccessibilityServiceList) {
Log.d("MainActivity", "all --&" + info.getId());
if (name.equals(info.getId())) {
既然谈到了AccessibilityManager,那么在这里我们就做个简单的介绍:AccessibilityManager是系统级别的服务,用来管理AccessibilityService服务,比如分发事件,查询系统中服务的状态等等,更多信息参考
getAccessibilityServiceList()
获取服务列表(api 14之后废弃,用下面的方法代替)
getInstalledAccessibilityServiceList()
获取已安装到系统的服务列表
getEnabledAccessibilityServiceList(int feedbackTypeFlags)
获取已启用的服务列表
isEnabled()
判断服务是否启用
sendAccessibilityEvent(AccessibilityEvent event)
方法二:我们知道大部分的系统属性都在settings中进行设置,比如wifi,蓝牙状态等,而这些信息主要是存储在settings对应的的数据库中(system表和serure表),同样我们也可以通过直接读取setting设置来判断相关服务是否开启:
private boolean checkStealFeature1(String service) {
int ok = 0;
ok = Settings.Secure.getInt(getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED);
} catch (Settings.SettingNotFoundException e) {
TextUtils.SimpleStringSplitter ms = new TextUtils.SimpleStringSplitter(':');
if (ok == 1) {
String settingValue = Settings.Secure.getString(getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
if (settingValue != null) {
ms.setString(settingValue);
while (ms.hasNext()) {
String accessibilityService = ms.next();
if (accessibilityService.equalsIgnoreCase(service)) {
到现在有关AccessibilityService的一些知识,我们已经讲完,下面我们就看它的具体使用,其中典型的应用就是抢红包插件.另外,该服务不受系统重启的的影响.除非你手动关闭或者通过第三方安全软件将其强制关闭.
1. 抢红包插件
先回顾一下抢红包的的流程:
状态栏出现"[微信红包]"的消息提示,点击进入聊天界面
点击相应的红包信息,弹出抢红包界面
在抢红包界面点击"开",打开红包
在红包详情页面,查看详情,点击返回按钮返回微信聊天界面.
以上是不在微信聊天界面时的流程.如果你所在的微信聊天窗口出现红包,则不会执行步骤1,而是直接执行2,3,4.如果是在微信好友列表时,收到红包,则会在列表项中显示[微信红包],需要点即该列表项,进入聊天界面,随后执行2,3,4.为了方便演示,这里我们暂时不考虑好友列表时出现红包的情况.
明白了抢红包流程,之后我们通过AccessibilityService获取通知栏信息及微信聊天窗口界面,继而通过模拟点击实现打开红包,抢红包等操作.AccessibilityService配置如下:
&?xml version="1.0" encoding="utf-8"?&
&accessibility-service xmlns:android="/apk/res/android"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged|typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm" /&
具体实现代码如下:
public class RobService extends AccessibilityService {
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
handleNotification(event);
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
String className = event.getClassName().toString();
if (className.equals("com.tencent.mm.ui.LauncherUI")) {
getPacket();
} else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI")) {
openPacket();
} else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI")) {
* 处理通知栏信息
* 如果是微信红包的提示信息,则模拟点击
* @param event
private void handleNotification(AccessibilityEvent event) {
List&CharSequence& texts = event.getText();
if (!texts.isEmpty()) {
for (CharSequence text : texts) {
String content = text.toString();
//如果微信红包的提示信息,则模拟点击进入相应的聊天窗口
if (content.contains("[微信红包]")) {
if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {
Notification notification = (Notification) event.getParcelableData();
PendingIntent pendingIntent = notification.contentI
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
* 关闭红包详情界面,实现自动返回聊天窗口
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private void close() {
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
if (nodeInfo != null) {
//为了演示,直接查看了关闭按钮的id
List&AccessibilityNodeInfo& infos = nodeInfo.findAccessibilityNodeInfosByViewId("@id/ez");
nodeInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
* 模拟点击,拆开红包
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private void openPacket() {
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
if (nodeInfo != null) {
//为了演示,直接查看了红包控件的id
List&AccessibilityNodeInfo& list = nodeInfo.findAccessibilityNodeInfosByViewId("@id/b9m");
nodeInfo.recycle();
for (AccessibilityNodeInfo item : list) {
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
* 模拟点击,打开抢红包界面
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void getPacket() {
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
AccessibilityNodeInfo node = recycle(rootNode);
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
AccessibilityNodeInfo parent = node.getParent();
while (parent != null) {
if (parent.isClickable()) {
parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);
parent = parent.getParent();
* 递归查找当前聊天窗口中的红包信息
* 聊天窗口中的红包都存在"领取红包"一词,因此可根据该词查找红包
* @param node
public AccessibilityNodeInfo recycle(AccessibilityNodeInfo node) {
if (node.getChildCount() == 0) {
if (node.getText() != null) {
if ("领取红包".equals(node.getText().toString())) {
for (int i = 0; i & node.getChildCount(); i++) {
if (node.getChild(i) != null) {
recycle(node.getChild(i));
public void onInterrupt() {
protected void onServiceConnected() {
super.onServiceConnected();
上面的代码简单演示了抢红包的原理,为了方便起见,我直接通过findAccessibilityNodeInfosByViewId()获取制定id控件.在实际中,这种方法不太可靠,到目前为止,微信已经改过几次相关控件的id了.
有童鞋问,怎么样知道该控件的id呢.其实很简单,android中已经为我们提供了相关的工具:在Android Studio中开启Android Device Monitor,选择设备后点击Dump View Hierarchy for UI Automator,如下:
这里写图片描述
稍等片刻之后,便会出现当前设备的窗口,在该窗口中点击相关控件,便会显示该控件的属性.借助该工具,可以帮我们快速的分析界面结构,帮助我们从其他app布局策略中学习
这里写图片描述
我们用Dump View Hierarchy for UI Automator分析聊天界面微信红包信息:
这里写图片描述
抢红包界面:
这里写图片描述
2. App自动安装
讲完了微信红包插件的实现原理,不难发现其本质是根据相关的界面状态,模拟后续的操作(比如点击等).既然这样,那么我们完全可以利用该服务实现更多的功能,比如apk自动安装,传统的安装过程大概是如下流程:
点击apk文件,弹出安装信息界面,在该界面点击"下一步",然后在点击"安装",最后在安装完成界面点击"完成".
不难发现,该流程完全可以通过模拟点击操作完成.现在我们简单的讲一下AccessibilityService在这方面的具体应用.
我们知道系统的安装程序由PackageInstaller负责,其包名是com.android.packageinstaller,那么我们只需要监听该package下的安装信息界面和安装完成界面,并模拟点击"下一步","安装",完成""操作即可实现自动安装.
AccessibilityService配置如下:
&?xml version="1.0" encoding="utf-8"?&
&accessibility-service xmlns:android="/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/auto_service_des"
android:notificationTimeout="100"
android:packageNames="com.android.packageinstaller"/&
具体实现代码如下:
public class InstallService extends AccessibilityService {
public void onAccessibilityEvent(AccessibilityEvent event) {
Log.d("InstallService", event.toString());
checkInstall(event);
private void checkInstall(AccessibilityEvent event) {
AccessibilityNodeInfo source = event.getSource();
if (source != null) {
boolean installPage = event.getPackageName().equals("com.android.packageinstaller");
if (installPage) {
installAPK(event);
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void installAPK(AccessibilityEvent event) {
AccessibilityNodeInfo source = getRootInActiveWindow();
List&AccessibilityNodeInfo& nextInfos = source.findAccessibilityNodeInfosByText("下一步");
nextClick(nextInfos);
List&AccessibilityNodeInfo& installInfos = source.findAccessibilityNodeInfosByText("安装");
nextClick(installInfos);
List&AccessibilityNodeInfo& openInfos = source.findAccessibilityNodeInfosByText("打开");
nextClick(openInfos);
runInBack(event);
private void runInBack(AccessibilityEvent event) {
event.getSource().performAction(AccessibilityService.GLOBAL_ACTION_BACK);
private void nextClick(List&AccessibilityNodeInfo& infos) {
if (infos != null)
for (AccessibilityNodeInfo info : infos) {
if (info.isEnabled() && info.isClickable())
info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private boolean checkTilte(AccessibilityNodeInfo source) {
List&AccessibilityNodeInfo& infos = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("@id/app_name");
for (AccessibilityNodeInfo nodeInfo : infos) {
if (nodeInfo.getClassName().equals("android.widget.TextView")) {
public void onInterrupt() {
protected void onServiceConnected() {
Log.d("InstallService", "auto install apk");
3. 检测前台服务:
在很多情况下,我们需要检测自己的app是不是处在前台,借助该服务同样也能够完成该检测操作.下面,我们就演示一下如何实现:
AccessibilityService配置如下:
&?xml version="1.0" encoding="utf-8"?&
&accessibility-service xmlns:android="/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/auto_detection"
android:notificationTimeout="100"
具体实现代码如下:
public class DetectionService extends AccessibilityService {
private static volatile String foregroundPackageName = "error";
* 检测是否是前台服务
* @param packagenName
public static boolean isForeground(String packagenName) {
return foregroundPackageName.equals(packagenName);
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
foregroundPackageName = event.getPackageName().toString();
public void onInterrupt() {
在使用时,需要引导用户开启该服务,之后通过调用DetectionService.isForeground()即可.
4. 窃取信息
上面的所有示例演示的都是AccessibilityService在具体应用中发挥的良好作用.但是该服务也存在一定的风险,很多人利用该服务做一些"坏事",比如窃取短信验证码,窃取短信内容,想要看看自己女朋友最近在和谁聊QQ等等.
你现在是不是想能否借助该服务直接获取一些app的密码呢?凡是EditText中设置inputType为password类型的,都无法获取其输入值.除此之外,大多数软件都针对该中风险做了提前的防范.因此,你想要借助该服务来实现窃取密码还是比较有难度的,所以,少年觉悟吧.
暂时先到这里,后面再补充其他的吧.其实该服务能做的事情远不止这些,比如也可以通过该服务获取微信公众号的key,进而爬去文章阅读数等,UI自动化测试等.

我要回帖

更多关于 coreldraw x6 错误1 的文章

 

随机推荐