#模擬點擊,自動生成某寶二維碼,下面是一種方法,更優化的需要自己去改進,我在這裏寫一下最基礎的
##AccessibilityService 這個方法是爲殘疾準備的,所以需要開啓"無障礙開關來監聽界面的窗口",可以模仿點擊登錄、搶紅包、刷票、各種你想不到的。
###findAccessibilityNodeInfosByViewId 裏面的id需要用AndroidStudio的 AndroidDeviceMonitor 截取
###findAccessibilityNodeInfosByViewText 裏面直接寫需要點擊的控件名字,比如"登錄"
1:首先要寫一個服務實現##AccessibilityService;如下
public class AutoClickService extends AccessibilityService {
private static final String TAG = "GK";
public static boolean state1=false;
public static boolean state2=false;
public static boolean state3=false;
public static boolean state4=false;
public static boolean state5=false;
public static boolean state6=false;
public static boolean alipayType=true;
@Override
protected void onServiceConnected() {
super.onServiceConnected();
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
AccessibilityNodeInfo rootInfo = getRootInActiveWindow();
AccessibilityNodeInfo mNodeInfo = event.getSource();
switch (eventType) {
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: //收到通知欄消息
Log.e("收到通知欄消息","收到通知欄消息");
break;
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: //界面狀態改變
Log.e("界面狀態改變","界面狀態改變");
break;
case AccessibilityEvent.TYPE_VIEW_CLICKED: //點擊事件
Log.e("點擊事件","點擊事件");
break;
case AccessibilityEvent.CONTENT_CHANGE_TYPE_TEXT: //文本改變
Log.e("文本改變","文本改變");
break;
case AccessibilityEvent. TYPE_VIEW_HOVER_EXIT: //
Log.e("最後一個窗口","最後一個窗口");
break;
}
try {
if (rootInfo != null) {
collectMoney(mNodeInfo);//點擊收錢
// settingMoney(mNodeInfo);//點擊設置金額
// setMoney(mNodeInfo,"0.01");//輸入金額
// addReceiptCause(mNodeInfo);//點擊添加收款理由
// setCauser(mNodeInfo,"錢太多WJ");//設置理由
// clickCommit(mNodeInfo);//點擊確定按鈕
// savePhoto(mNodeInfo);//保存圖片
// rePhotoCode();//解析二維碼
bank(mNodeInfo);//返回按鈕
}
}
catch (Exception e) {
}
}
@Override
public void onInterrupt() {
Log.e("-onInterrupt-","onInterrupt");
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("-onUnbind-","onUnbind");
return super.onUnbind(intent);
}
/**
* 點擊收款
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void collectMoney(AccessibilityNodeInfo mNodeInfo) {
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
// Log.e("===點擊收款===", infos.size() + "");
// rootInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
if (state1){
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
state1=false;
}
}
}
/**
* 點擊設置金額
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void settingMoney(AccessibilityNodeInfo mNodeInfo) {
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
// Log.e("===點擊設置金額===", infos.size() + "");
// rootInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
if (state2){
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
state2=false;
}
}
}
/**
* 點擊添加收款理由
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void addReceiptCause(AccessibilityNodeInfo mNodeInfo) {
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
// Log.e("===點擊添加收款理由===", infos.size() + "");
// rootInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
if (state3){
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
state3=false;
}
}
}
/**
* 點擊確點按鈕
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void clickCommit(AccessibilityNodeInfo mNodeInfo) {//
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
// Log.e("===點擊確點按鈕===", infos.size() + "");
// rootInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
if (state4){
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
state4=false;
}
}
}
/**
* 點擊保存圖片
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void savePhoto(AccessibilityNodeInfo mNodeInfo) {
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
// Log.e("===點擊保存圖片===", infos.size() + "");
// rootInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
if (state5){
timePhoto = (System.currentTimeMillis()+"").substring(0,10);
Log.e("當前的時間戳截取後=",timePhoto);//1540470311571
Log.e("當前的時間戳跳轉前=",System.currentTimeMillis()+"");
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
Log.e("當前的時間戳跳轉後=",System.currentTimeMillis()+"");
state5=false;
}
}
}
/**
* 點擊收款記錄
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void record(AccessibilityNodeInfo mNodeInfo) {
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
// Log.e("===點擊收款記錄===", infos.size() + "");
// rootInfo.recycle();
for (AccessibilityNodeInfo item : infos) {
if (state6){
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
state6=false;
}
}
}
/**
* 點擊返回
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void bank(AccessibilityNodeInfo mNodeInfo) {
List<AccessibilityNodeInfo> infos = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
Log.e("===點擊返回===", infos.size() + "");
// rootInfo.recycle();
for (final AccessibilityNodeInfo item : infos) {
if (state7<2){
state7++;
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
item.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}, 4000);//3秒後執行Runnable中的run方法
}
}
}
/**
* 設置金額
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void setMoney(AccessibilityNodeInfo mNodeInfo,String money) {//
// Log.e("===寫入金額===", "**");
final List<AccessibilityNodeInfo> list = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
if (list != null && !list.isEmpty()) {
AccessibilityNodeInfo info = list.get(0);
//粘貼板
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", money);
clipboard.setPrimaryClip(clip);
CharSequence txt = info.getText();
if (txt == null) txt = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
Bundle arguments = new Bundle();
arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, txt.length());
info.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
info.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments);
info.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
}
}
/**
* 設置理由
*
* @param mNodeInfo
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
public void setCauser(AccessibilityNodeInfo mNodeInfo,String str) {
// Log.e("===寫入理由===", "**");
final List<AccessibilityNodeInfo> list = mNodeInfo.findAccessibilityNodeInfosByViewId("xx.xx.xx");
if (list != null && !list.isEmpty()) {
AccessibilityNodeInfo info = list.get(1);
//粘貼板
ClipboardManager clipboard = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("label", str);
clipboard.setPrimaryClip(clip);
CharSequence txt = info.getText();
if (txt == null) txt = "";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
Bundle arguments = new Bundle();
arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, 0);
arguments.putInt(AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, txt.length());
info.performAction(AccessibilityNodeInfo.ACTION_FOCUS);
info.performAction(AccessibilityNodeInfo.ACTION_SET_SELECTION, arguments);
info.performAction(AccessibilityNodeInfo.ACTION_PASTE);
}
}
}
/**
* 解析二維碼
*/
private void rePhotoCode(){
file_ = new File(Environment.getExternalStorageDirectory()+"/DCIM"+"/Camera/");
File[] files = file_.listFiles();
if (files != null) {
int count = files.length;
if(count>0){
for (int i = 0; i < count; i++) {
File file = files[i];
if (i==count-1){
photoString = QRCodeDecoder.syncDecodeQRCode(file.getAbsolutePath());
Log.e("解析到的圖片內容爲=", photoString);
file.delete(); // 刪除所有文件
}
}
}
}
}
/**
* 滑動
* 滑動比例 0~20
*/
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)
private void slideVertical() {
int screenHeight = ScreenUtils.getScreenHeight(getApplicationContext());
int screenWidth = ScreenUtils.getScreenWidth(getApplicationContext());
Log.e("屏幕:" + (screenHeight - (screenHeight / 10)) + "/" +
(screenHeight - (screenHeight - (screenHeight / 10))) + "/" + screenWidth / 2,"");
Path path = new Path();
int start = (screenHeight / 20) * 1;
int stop = (screenHeight / 20) * 2;
path.moveTo(screenWidth / 2, start);//如果只是設置moveTo就是點擊
path.lineTo(screenWidth / 2, stop);//如果設置這句就是滑動
GestureDescription.Builder builder = new GestureDescription.Builder();
GestureDescription gestureDescription = builder
.addStroke(new GestureDescription.
StrokeDescription(path,
200,
200))
.build();
dispatchGesture(gestureDescription, new GestureResultCallback() {
@Override
public void onCompleted(GestureDescription gestureDescription) {
super.onCompleted(gestureDescription);
Log.e("滑動結束","" + gestureDescription.getStrokeCount());
// next(next, nextTime);
}
@Override
public void onCancelled(GestureDescription gestureDescription) {
super.onCancelled(gestureDescription);
Log.e("滑動取消","");
}
}, null);
}
}
2:配置服務
<service
android:name="xx.xx.xx.service.AutoClickService"
android:exported="false"
android:label="OTCPay"
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/accessible_service_config" />
</service>
3: @xml/accessible_service_config 文件內容
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:notificationTimeout="0"
android:description="@string/description" //名字隨便起
android:packageNames="com.xx.xx.xx" //想要點擊的應用包名
/>
4: //跳轉系統打開自己app名字的無障礙開關
Intent intent2 = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent2);