吉品易购,重生之积木,杜汶泽回应被王晶绝交
最近遇到一个需求,要求写一个小插件,能够自动在微信的页面弹出一个窗口,展示用户的相关信息(与我们公司有关的信息,方便运营快速了解用户信息)。
当时我第一反应是不可能,如果能够在别的app中获取对应的信息,那岂不是太不安全了。直到我知道了accessibilityservice这个东西。
利用accessibilityservice服务来获取到微信页面的页面信息,并获取到用户的微信号,有了微信号一切都好办了。
由于获取用户好友微信号和获取本人微信号的方法相同,因此此篇文章主要介绍的是如何通过accessibilityservice来获取本人的微信号。
在你的手机更多设置或者高级设置中,我们会发现有个无障碍的功能,很多人不知道这个功能具体是干嘛的,其实这个功能是为了增强用户界面以帮助残障人士,或者可能暂时无法与设备充分交互的人们。
它的具体实现是通过accessibilityservice服务运行在后台中,通过accessibilityevent接收指定事件的回调。这样的事件表示用户在界面中的一些状态转换,例如:焦点改变了,一个按钮被点击,等等。这样的服务可以选择请求活动窗口的内容的能力。简单的说accessibilityservice就是一个后台监控
服务,当你监控的内容发生改变时,就会调用后台服务的回调方法。
实现一个自己的accessibilityservice,需要继承accessibilityservice类,并至少实现onaccessibilityevent和oninterrupt方法:
1 public class myaccessibilityservice extends accessibilityservice { 2 3 final string tag = "myaccessibilityservice"; 4 5 /** 6 * 当服务启动的时候会被调用 7 */ 8 @override 9 protected void onserviceconnected() { 10 super.onserviceconnected(); 11 log.d(tag, "connected"); 12 } 13 14 /** 15 * 监听窗口变化的回调 16 */ 17 @override 18 public void onaccessibilityevent(accessibilityevent event) { 19 log.d(tag, event.getpackagename() + ""); 20 } 21 22 /** 23 * 中断服务的回调 24 */ 25 @override 26 public void oninterrupt() { 27 log.d(tag, "oninterrupt"); 28 } 29 }
accessibilityservice中的一些常用方法:
声明该服务:
1 <service 2 android:name=".myaccessibilityservice" 3 android:enabled="true" 4 android:exported="true" 5 android:label="这是一个用户测试的无障碍服务" 6 android:permission="android.permission.bind_accessibility_service"> 7 <intent-filter> 8 <action android:name="android.accessibilityservice.accessibilityservice" /> 9 </intent-filter> 10 </service>
配置服务参数:
主要是用于声明该服务的一些配置参数,现在有两种配置服务参数的方法:在安卓4.0之后可以通过meta-data标签来在xml中配置,也可以通过动态代码直接配置。这里我们通过xml进行配置。
首先在res下的xml文件夹下创建配置文件,
1 <?xml version="1.0" encoding="utf-8"?> 2 <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 3 android:accessibilityeventtypes="typeallmask" 4 android:accessibilityfeedbacktype="feedbackallmask" 5 android:canretrievewindowcontent="true" 6 android:notificationtimeout="100" 7 android:packagenames="com.tencent.mm" 8 android:description="@string/description" />
然后将配置文件添加到清单文件中,
1 <service 2 android:name=".myaccessibilityservice" 3 android:enabled="true" 4 android:exported="true" 5 android:label="这是一个用户测试的无障碍服务" 6 android:permission="android.permission.bind_accessibility_service"> 7 <intent-filter> 8 <action android:name="android.accessibilityservice.accessibilityservice" /> 9 </intent-filter> 10 <meta-data 11 android:name="android.accessibilityservice" 12 android:resource="@xml/config_accessibility" /> 13 </service>
下面对xml中的一些参数进行介绍:
以小米手机为例,在设置中打开更多设置,进入无障碍。然后打开之前声明的服务即可。
这里主要利用accessibilitynodeinfo的findaccessibilitynodeinfosbyviewid(string viewid)方法,该方法用于根据控件标识来获取到整个控件。
那么问题来了,如何知道微信该控件的标识呢?这里可以通过sdk的工具ddms工具。
进入sdk目录的tools目录,找到monitor.bat文件,双击即可。
进入ddms界面后,选中微信的包名,并点击如下所示按钮即可分析当前微信页面的布局信息:
如下图,可以发现该控件的标识为:com.tencent.mm:id/czz
因此,即可通过如下方法获取到该控件的值:
1 @override 2 public void onaccessibilityevent(accessibilityevent event) { 3 log.d(tag, event.getpackagename() + ""); 4 5 if (android.os.build.version.sdk_int >= android.os.build.version_codes.jelly_bean_mr2) { 6 // 通过id获取到微信号的view 7 list<accessibilitynodeinfo> nodeinfolist = getrootinactivewindow().findaccessibilitynodeinfosbyviewid("com.tencent.mm:id/czz"); 8 string wxcode; 9 if (nodeinfolist != null && nodeinfolist.size() > 0) { 10 wxcode = nodeinfolist.get(0).gettext().tostring(); 11 log.d(tag, wxcode); 12 } 13 } 14 15 }
运行结果如下:
大家如果有什么疑问或者建议可以通过评论或者的方式联系我,欢迎大家的评论~
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android Manifest中meta-data扩展元素数据的配置与获取方式
Android实现获取meta-data和build.gradle的值
Android获取清单文件中的meta-data,解决碰到数值为null的问题
解决webview 第二次调用loadUrl页面不刷新的问题
解决Android WebView拦截url,视频播放加载失败的问题
Android webview加载https链接错误或无响应的解决
网友评论