【10】AccessibilityService实现探探app的自动化喜欢和不喜欢+ [as 3.0如何打开层级调用uiautomatorviewer]
目前版本3.1.8 仅供学习使用!!!!!切勿用作非法用途,否则后果自负!
直接写这个东西 可能是有些唐突
因为你们可能不知道这是一个什么玩意 如果你想看过于这个Accessibility服务的一些资料
可以到 我的分类 下面去看
下面将直接进入正题
AccessibilityService 的出现原本为了帮助盲人 来那啥那啥和那啥的
没想到却被我们那啥那啥和那啥了
他使用方法需要手动到无障碍里面去开启 开启成功以后代码就开始运行了
集成的一般步骤就是
创建服务 继承AccessibilityService实现相关方法
package com.example.liuan.test;import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.graphics.Rect;
import android.os.Environment;
import android.os.IBinder;
import android.util.Log;
import android.view.KeyEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;import java.io.DataOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Random;public class MyService extends AccessibilityService {private static final String TAG = "MyService";// 大多数的手机包名一样,联想部分机型的手机不一样private String[] packageNames = {"com.p1.mobile.putong"};int startFlag = 0;AccessibilityNodeInfo[] noteInfo = new AccessibilityNodeInfo[2];@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {if (event.getSource() != null) {findNodesByText(event, "继续探索");}switch (event.getEventType()) {case AccessibilityEvent.TYPE_VIEW_CLICKED:if (SpUtils.getBoolean(this, "reSet", false)) {SpUtils.putBoolean(this, "reSet", false);startFlag = 0;}if (startFlag == 0) {//记录正确startFlag = 1;noteInfo[0] = event.getSource();} else if (startFlag == 1) {//记录错误 只记录一次即可startFlag = 2;noteInfo[1] = event.getSource();}if (startFlag == 2) {autoClick();}break;}}private void autoClick() {try {String time = SpUtils.getString(this, "time", "1000");Thread.sleep(Integer.parseInt(time));} catch (InterruptedException e) {e.printStackTrace();}String time = SpUtils.getString(this, "like", "50");int percent = Integer.parseInt(time);
//随机数字 是1-100int random = new Random().nextInt(100) + 1;
//如果设置了百分之50 那么就是各一半
//如果设置了百分之10 那么就是点第一个 8 10Log.e(TAG, "onAccessibilityEvent:random " + random);Log.e(TAG, "onAccessibilityEvent:percent " + percent);if (random <= percent) {//第一次按键noteInfo[0].performAction(AccessibilityNodeInfo.ACTION_CLICK);} else {noteInfo[1].performAction(AccessibilityNodeInfo.ACTION_CLICK);}}@Overridepublic void onInterrupt() {startFlag = 0;}@Overridepublic void onDestroy() {super.onDestroy();startFlag = 0;}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 ("继续探索".equals(text)) {info.performAction(AccessibilityNodeInfo.ACTION_CLICK);}}}}}private boolean isTextExist(AccessibilityEvent event, String text) {List<AccessibilityNodeInfo> nodes = event.getSource().findAccessibilityNodeInfosByText(text);if (nodes != null && !nodes.isEmpty()) {for (AccessibilityNodeInfo info : nodes) {if (info.isClickable()) {// 只有根据节点信息是下一步,安装,完成,打开,且是可以点击的时候,才执行后面的点击操作if ("继续探索".equals(text)) {return true;}}}}return false;}}
我的思路 我简单来说一下 因为就算你层级用的没问题 但是却获取不到id
我就急中生智 使用了event.getSource() 把这个保存到数组 让自己点两下 然后开始模仿我的点击
这个方法不仅仅使用与这里 可以用作好多的地方
AccessiblityServices 要比脚本稳定 脚本存在一种情况就是脚本会崩溃 或者由于某个地方的偏移导致点击错误
这个从节点点击 彻底的解决了这个问题 无论开发者怎么骚操作 这里都可以点击 好气的
获取那个文件的id 或者文字什么的 用到了studio工具中的(本文代码风骚 没有用到这个)
G:\android\sdk\tools\bin\uiautomatorviewer.bat
as 3.0居然丧尽天良把他搞没了 反正我没找到 可能是没了
只能去sdk 目录下去找了 如果你记忆力够好的话找到你曾经安装的sdk目录
如果记忆力不够好 可以在alt+ctrl+s System Settings-->Android SDK看到你的sdk目录 找到打开即可
具体使用方法这里不做教程
四大组件逃不过的清单文件
application节点下
<serviceandroid:name=".MyService"android:enabled="true"android:exported="true"android:label="探探点击"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility" /></service>
res/xml/accessibility.xml 没有这个目录请自行创建
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagDefault"android:canRetrieveWindowContent="true"android:description="@string/des"android:notificationTimeout="100"android:packageNames="com.p1.mobile.putong" />
<resources>
<string name="app_name">Test</string>
<string name="des">仅供学习使用,切勿乱搞,否则后果自负</string>
</resources>
MainActivity
package com.example.liuan.test;import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "MainActivity";private Button mBtOpen;private EditText mEtDelay;private EditText mEtLike;/*** 保存配置*/private Button mBtReset;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
// String apkRoot="chmod 777 "+getPackageCodePath();
//
// SystemManager.RootCommand(apkRoot);initView();initData();}private void initData() {SpUtils.putString(this, "time", mEtDelay.getText().toString().trim());SpUtils.putString(this, "like", mEtLike.getText().toString().trim());SpUtils.putBoolean(MainActivity.this, "reSet", true);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {Toast.makeText(MainActivity.this, "半径", Toast.LENGTH_LONG);switch (keyCode) {case KeyEvent.KEYCODE_VOLUME_DOWN:case KeyEvent.KEYCODE_VOLUME_UP:Toast.makeText(MainActivity.this, "半径", Toast.LENGTH_LONG);mBtOpen.setText("已经关闭");return true;}return super.onKeyDown(keyCode, event);}private void initView() {mBtOpen = (Button) findViewById(R.id.bt_open);mBtOpen.setOnClickListener(this);mEtDelay = (EditText) findViewById(R.id.et_delay);mEtLike = (EditText) findViewById(R.id.et_like);mEtLike.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {initData();}});mEtDelay.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {initData();}});mBtReset = (Button) findViewById(R.id.bt_reset);mBtReset.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {default:break;case R.id.bt_open:initData();Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);startActivity(intent);break;case R.id.bt_reset:initData();break;}}
}
SpUtils
package com.example.liuan.test;import android.content.Context;
import android.content.SharedPreferences;/*** Created by liuan on 2018-04-28.*/public class SpUtils {private static SharedPreferences sp;public static void getSharedPreference(Context context){if(sp==null){sp=context.getSharedPreferences("config",context.MODE_PRIVATE);}}public static void putString(Context context,String key,String value){getSharedPreference(context);sp.edit().putString(key,value).commit();}public static String getString(Context context,String key,String defValue){getSharedPreference(context);return sp.getString(key,defValue);}public static boolean getBoolean(Context context,String key,boolean defValue){getSharedPreference(context);return sp.getBoolean(key,false);}public static void putBoolean(Context context,String key,boolean value){getSharedPreference(context);sp.edit().putBoolean(key,value).commit();}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/bt_open"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="开启/关闭服务" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/bt_reset"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="保存配置" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="60sp"android:layout_height="wrap_content"android:gravity="center"android:text="延时:s"android:textColor="@android:color/holo_red_dark" /><EditTextandroid:id="@+id/et_delay"android:layout_width="match_parent"android:layout_height="match_parent"android:inputType="number"android:text="6000" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="60sp"android:layout_height="wrap_content"android:gravity="center"android:text="喜欢:x/%"android:textColor="@android:color/holo_red_dark" /><EditTextandroid:id="@+id/et_like"android:layout_width="match_parent"android:layout_height="match_parent"android:inputType="number"android:text="94" /></LinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:gravity="center"android:text="本软件仅供学习使用~!!!!\n开启服务 点击一个喜欢 再点击一个不喜欢 就开始了,如果点击喜欢 出现了继续探索,要进主页点重新设置 再点击 喜欢 和不喜欢~"android:textColor="@android:color/holo_red_dark"android:textSize="22sp" />
</LinearLayout>
开始方法 并不是直接点开启就开启了
第一步 开启探探点击的服务
第二步 打开探探先把其他的第一次引导的东西点完 然后 点一个喜欢 点一个不喜欢 再然后就能看到神奇的自动了
那天我本来想写了按音量键暂停的方法 后来发现没必要 暂停服务就行了
【10】AccessibilityService实现探探app的自动化喜欢和不喜欢+ [as 3.0如何打开层级调用uiautomatorviewer]相关推荐
- 探探自动右滑_利用AccessibilityService实现探探自动右划
核心类: AccessibiliiiiiiiityService 简单的说,AccessibilityService 为了方便残障人士实现操作,可以监控app的运行,在界面上实现一些自动操作. 而 A ...
- 趣店探探等30款APP违规收集个人信息被通报
[TechWeb]7月11日消息,全国信息安全标准化技术委员会.中国消费者协会.中国互联网协会.中国网络空间安全协会成立App专项治理工作组,对用户数量大.与民众生活密切相关的App隐私政策和个人信息 ...
- linux上的社交软件下载,探探交友app免费版-探探交友真实app下载v4.2.9.2-Linux公社...
探探交友app是一款非常好用的社交聊天平台,使用方法非常简单,喜欢的话可以将名片向右滑,不喜欢的话就向左滑,只有相互喜欢的两人才可以开始聊天,避免了很多陌生人的消息,减少骚扰,探探交友app免费版非常 ...
- iOS APP开发项目案例(仿探探优化)--FaceFriend
源码请到Github上下载Github源码. ios开发的基本知识:OC语言基础.Foundation基础框架.各个控件的UI界面编程(UITableView.UINavigationControll ...
- 继安卓市场下架后 探探App也在苹果商店下架
[TechWeb]此前,陌生社交App探探遭遇各大安卓应用市场下架处理,原因是传播淫秽色情等违规违法信息. 目前,探探在苹果商店也遭到下架处理,苹果用户也搜索不到该App. 下架处理后,探探方面曾回应 ...
- 探探php模板下载,C3+H5+jQuery仿探探APP手机滑动切换特效
C3+H5+jQuery仿探探APP手机滑动切换特效 这是一款很不错的jQuery仿探探APP手机滑动切换特效,手机端网页滑动翻页上一页下一页切换代码 /*移动动画*/ animateMove:fun ...
- 【SwiftUI模块】0004、SwiftUI-<探探App>喜欢手势卡片
SwiftUI小功能模块系列 0001.SwiftUI自定义Tabbar动画效果 0002.SwiftUI自定义3D动画导航抽屉效果 0003.SwiftUI搭建瀑布流-交错网格-效果 0004.Sw ...
- 社交通讯产品-app榜单第三:探探
一.产品介绍 1. 产品名称:探探 2. 产品版本:2.4.1 3. 体验平台:iPhone 6s 4. 体验系统:IOS 9.3.5 5. 产品定位: 探探是一种全新的相遇方式.以双向的&quo ...
- iOS:仿写探探App动画
一.简单介绍 探探动画比较新颖,这也是它在众多交友软件中火热的一个特色.实现这种动画的方式可以有两种方式实现: 1.使用转场动画实现 2.使用CollectionView自定义布局实现, 此处我提供 ...
最新文章
- java 数据结构 无向图_数据结构-无向图
- 根据PI/4 = 1 - 1/3 +1/5-1/7+1/9求圆周率
- IHttpHandler的学习(0-2)
- windows10访问ubuntu samba共享文件夹报错:不允许一个用户使用一个以上用户与服务器多重连接(没解决)
- 机器学习之路:python k近邻回归 预测波士顿房价
- OAuth 2.0 的探险之旅
- 【Python 必会技巧】对字典按照键(key)或者值(value)排序
- AI时代的交换机什么样?华为CloudEngine 16800告诉你!
- 商品详情页html,天天生鲜商品详情页HTML+css
- jQuery教程06-基本筛选选择器
- python获取html文本框内容_Python3处理HTML获取所需内容
- 准备系统地学习一下Python
- 【资源】About Face4交互设计精髓,英文原版,彩色pdf下载
- factory setup 序列号_麻烦哪位大侠帮我把改一下setup factory 中生成16位注册码的脚本,(在线等)急!!!...
- PDF文件有密码怎么办?
- Android技巧之相对高度使用
- 微信小程序 - 引入第三方字体(使用网络字体艺术字)
- IT行业里的热门技术和项目分享
- JFrog Artifactory的数据备份与恢复教程
- 所谓的SaaS服务到底是什么?