前言
看完你也可以写一个烟花,给家人或者女盆友或者男朋友放一场环保的烟花。看了,岂不很浪漫。没有女盆友的就放给家人看吧!没有男盆友的,这点我可以帮助一下你。
先看个效果吧
是不是看着好像手动一样。哈哈,但是要是一直发100条,就不一样了。
下载地址
需要去github下载 助手apk地址
《青玉案·元夕》
宋·辛弃疾
东风夜放花千树,更吹落,星如雨。宝马雕车香满路。
凤箫声动,玉壶光转,一夜鱼龙舞。
蛾儿雪柳黄金缕,笑语盈盈暗香去。
众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。
其中东风夜放花千树,更吹落,星如雨。就是描写烟花的。
使用方法,我相信很多人根本不关心是如何实现的,因为我也一样。
进入主界面,去开启无障碍服务,不同品牌可能开启的页面不一样,注意到是放烟花那个服务开启就好,可以参考一下我的小米手机。
app界面
单位为秒是发送烟花间隔时间
放烟花次数这个就是发送烟花的次数
去打开烟花
开启成功后
开启成功后
使用方法就是在输入框里面输入开始放烟花啦,就可以开始发送烟火了,由于是监控输入框,可能不太及时,多试二次就好。遇到问题或在下方评论。
唠叨
本来早早就要写的了,出于种种原因没有写,问就是懒。当然也有一个原因,一直没办法拿到微信的聊天记录,那些聊天就是是一个view,没有文字。在微信8.0上,写了一个放烟花辅助,当然放炸弹也行。这里我就不从入门开始写了,因为我不擅长写入门文章,好吧!归根到底是我懒。
AccessibilityService
AccessibilityService设计初衷在于帮助残障用户使用android设备和应用,在后台运行,可以监听用户界面的一些状态转换,例如页面切换、焦点改变、通知、Toast等,并在触发AccessibilityEvents时由系统接收回调。后来被开发者另辟蹊径,用于一些插件开发,比如自动聊天助手,微信红包助手,这个我相信很多人都用过,小米开源了红包助手,把AccessibilityService推向了高潮。
开始吧
起初我想拿到微信聊天记录来触发放烟火的,由于一直拿不到微信的聊天记录。我只能退而求次,换个思路出发了。后面想想,think again ,think again ,think again.想到监听输入框来当命令吧。
android 工具uiautomatorviewer
这个工具是用来获取页面的布局数据的,工具在你的androidSdk\SDK\tools\bin(具体得你的安装目录)
第一步先监听触发命令
监听输入框,把输入框文字作为命令。代码写的挺简单的,没啥水平,也很急。所以凑合看吧。 这里步骤主要是
1,查找输入框节点,这个查找输入框节点下面说。
2,监听输入框。
3,消息发出去。
4,触发烟花发送。
5,重置一下数据。
private fun listenerInputCmd() {
if (isStart) return
val editText = findInput() ?: return
if (editText.text.isNullOrEmpty()) return
if ("开始放烟花啦" != editText.text.toString()) {
Log.d(TAG, "AccessibilityEvent editText1:" + editText.text)
return
}
//寻找发送按钮
val sendBtn = findSendButton() ?: return
//把消息发出去,然后开始!
val isSuccess = sendBtn.performAction(AccessibilityNodeInfo.ACTION_CLICK)
if (!isSuccess) return
reSet()
isStart = true
}
我们使用工具uiautomatorviewer能分析到输入框的节点,如图所示,我们知道输入框节点为com.tencent.mm:id/auj了,那么我们就可以开始写代码了。
/**
* 查找输入框
*/
private fun findInput(): AccessibilityNodeInfo? {
//查找节点
val input = rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/auj")
if (input.isNullOrEmpty()) {
return null
}
if (input[input.size - 1].className != "android.widget.EditText") {
return null
}
return input[input.size - 1]
}
把烟花设置到输入框中,接着就按下发送按钮。
烟花设置到输入框中
来让我看看,是怎么把内容设置进去的。这块支持还是很多api的玩法。直接调用AccessibilityNodeInfo的performAction来设置内容。
val arguments = Bundle()
arguments.putCharSequence(
AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "[庆祝]" )
val editText = findInput()
//输入框中输入礼花
editText.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)
按下发送按钮
第一步我们要查找按钮,找到发送按钮的节点。如图中所示:
接着我们就知道按钮的节点ID是com.tencent.mm:id/ay5,那么我们就可以去调戏它了。还是利用findAccessibilityNodeInfosByViewId去准确定位节点。跟上面差不多的,我相信聪明的你一看就懂了。不懂可以私聊我。
private fun findSendButton(): AccessibilityNodeInfo? {
//消息发送按钮的节点。
val sendButton =
rootInActiveWindow.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/ay5")
if (sendButton.isNullOrEmpty()) {
return null
}
sendButton.forEach {
//匹配button
if (it.className == "android.widget.Button") {
Log.d(TAG, "found send button!")
return it
}
}
return null
}
历经千辛万苦,要进入发礼花的主题了
其实这个比较简单,这里忽略一下细节的判断,就从大的方面出发,我们分几步走。
1,发送休眠时间,发送太频繁,是发送不成功的,因为服务器受不了。这里建议休眠0.8秒浮动。
2,点击按钮发送按钮
3,查找输入框,设置礼花。
4,发送礼花到达最大次数,发送结束,重置参数。
//进入循环
while (count < maxSendMessageCount) {
if (!isStart) return
Thread.sleep(sleepTime.toLong())
val isSuccess = sendBtn?.performAction(AccessibilityNodeInfo.ACTION_CLICK)
Log.d(TAG, "startFireworks: //ing$count--- $isSuccess")
if (isSuccess!!) {
count++
}
val arguments = Bundle()
//输入框中输入礼花
arguments.putCharSequence(
AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,
"[庆祝]"
)
val editText = findInput()
if (editText == null) {
runningType = 0
return
}
editText.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)
}
//重置参数
reSet()
当然代码中还有一些细节这里没有说,可自行看代码去,比如发送次数的判断,还是防止多次进去的判断。
apk下载地址
需要去github下载
完整代码地址
总结
本来想写红包助手的,哈哈,由于时间(其实是我写不出来),变成了礼花助手。思路都多变的,举一反三,还可以变成朋友圈点赞助手。
本人知识有限,如有描述错误之处,愿虎正。
你看这个像不像你欠我的赞。
谢谢大家。祝大家新年快乐,如果快乐不易,那我祝你平安。你的赞就像冬日暖阳,温暖心窝。