AccessibilityService模擬點擊

 #模擬點擊,自動生成某寶二維碼,下面是一種方法,更優化的需要自己去改進,我在這裏寫一下最基礎的
 ##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);

發佈了45 篇原創文章 · 獲贊 22 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章