package com.auto.lyric.service; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.SuppressLint; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Build; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; import android.widget.Toast; import java.util.List; /** * Created by Runt (qingingrunt2010@qq.com) on 2022/3/20. */ public class AutoInputService extends AccessibilityService { final String TAG = "AutoInputService"; public static final int ACTION_SEND = 1001,//发送 ACTION_PASTE = 1002;//粘贴 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int action = intent.getIntExtra("action", 0); Log.e(TAG, "onReceive action: " + action); switch (action){ case ACTION_SEND: //List nodeInfos = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.ss.android.ugc.aweme:id/llp"); AccessibilityNodeInfo sendNode = getViewByDesc(getRootInActiveWindow(),"发送"); Log.e(TAG, "ACTION_SEND nodeInfos: " + sendNode); if(sendNode != null){ Log.e(TAG, "ACTION_SEND nodeInfos: " + sendNode.getClassName()); sendNode.performAction(AccessibilityNodeInfo.ACTION_CLICK); }else{ printView(getRootInActiveWindow()," "); Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show(); } break; case ACTION_PASTE: List list = getRootInActiveWindow().findAccessibilityNodeInfosByText("说点什么..."); Log.e(TAG, "ACTION_PASTE nodeInfos: " + list.size()); printView(getRootInActiveWindow()," "); AccessibilityNodeInfo editNode = getView(getRootInActiveWindow(),"android.widget.EditText"); if(editNode != null){ Log.e(TAG, "ACTION_PASTE nodeInfos: " + editNode.getClassName()); editNode.performAction(AccessibilityNodeInfo.ACTION_PASTE); }else{ Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show(); } break; } } }; static boolean flag = false , isFront; @Override public void onAccessibilityEvent(AccessibilityEvent event) { int eventType = event.getEventType(); Log.d(TAG," text:" + event.getText()+" class:"+event.getClassName() +" action:" + event.getAction() +" windowId:"+ event.getWindowId()); Log.d(TAG,"event:"+event ); Log.d(TAG,"ParcelableData:"+event.getParcelableData() ); AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); AccessibilityNodeInfo source = event.getSource();//当前界面的可访问节点信息 if(source != null){ //printView(source,"source == "); } Log.d(TAG,"source:"+(source == null? null : source.getClassName()) ); Log.d(TAG,"nodeInfo:"+ (nodeInfo == null? null : nodeInfo.getClassName()) ); switch (eventType) { case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED://界面变化事件 Log.e(TAG, "TYPE_WINDOW_CONTENT_CHANGED " ); break; case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED://界面变化事件 Log.e(TAG, "TYPE_WINDOW_STATE_CHANGED " ); if(source != null && event.getClassName().toString().equals("com.ss.android.ugc.aweme.live.LivePlayActivity")){ List list = getRootInActiveWindow().findAccessibilityNodeInfosByText("说点什么..."); Log.e(TAG,"获取到控件 "+list.size()); if (list != null && list.size() > 0 && flag) { //模拟第三方点击事件 //找到你的节点以后 就直接点击他就行了 //AccessibilityNodeInfo node = list.get(0); list.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { Log.e(TAG,"执行点击 "+list.get(0).getPaneTitle()); } }else if(flag){ Toast.makeText(getBaseContext(),"未找到控件",Toast.LENGTH_SHORT).show(); } } if(event.getText().contains("更多选项") ){ //printView(nodeInfo," "); //performGlobalAction(GLOBAL_ACTION_RECENTS); // 任务管理器 //performGlobalAction(GLOBAL_ACTION_BACK); // 返回安装页面 } break; case AccessibilityEvent.TYPE_VIEW_FOCUSED://焦点变更 Log.e(TAG, "TYPE_VIEW_FOCUSED ResourceName:" +( source == null ? null : source.getParent())); if(event.getClassName().equals("android.widget.EditText") && source != null){ //source.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK); //source.performAction(AccessibilityNodeInfo.ACTION_PASTE);//粘贴 } break; case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: Log.e(TAG, "TYPE_VIEW_LONG_CLICKED ResourceName:" +( source == null ? null : source.getParent())); break; case AccessibilityEvent.TYPE_VIEW_CLICKED: Log.e(TAG, "TYPE_VIEW_CLICKED " ); if(nodeInfo != null) { Log.e(TAG, "TYPE_VIEW_CLICKED source:" + nodeInfo.getText() + " " + nodeInfo.getClass()); } /**/ //界面点击 break; case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: //界面文字改动 Log.e(TAG, "TYPE_VIEW_TEXT_CHANGED " ); break; } } @SuppressLint("NewApi") private void printView(AccessibilityNodeInfo node, String space){ Log.e(TAG,space +node+" id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getPaneTitle()); if(node.getChildCount() > 0){ for(int i = 0 ; i < node.getChildCount() ; i ++){ if(node.getChild(i) != null) { printView(node.getChild(i), space + " \t"); } } } } @SuppressLint("NewApi") private AccessibilityNodeInfo getView(AccessibilityNodeInfo node, String className){ Log.e(TAG,className +" id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getPaneTitle()); if(node.getChildCount() > 0){ for(int i = 0 ; i < node.getChildCount() ; i ++){ if(node.getChild(i) != null) { AccessibilityNodeInfo nodeInfo = getView(node.getChild(i), className); if(nodeInfo != null){ return nodeInfo; } } } }else if(node.getClassName().equals(className)){ return node; } return null; } @SuppressLint("NewApi") private AccessibilityNodeInfo getViewByDesc(AccessibilityNodeInfo node, String desc){ Log.e(TAG,desc +" getViewByDesc id:"+node.getViewIdResourceName() +" class:"+node.getClassName()+" text:"+node.getText()+" "+node.getContentDescription()); Log.e(TAG,"getViewByDesc node:"+node); if(node.getChildCount() > 0){ for(int i = 0 ; i < node.getChildCount() ; i ++){ if(node.getChild(i) != null) { AccessibilityNodeInfo nodeInfo = getViewByDesc(node.getChild(i), desc); if(nodeInfo != null){ return nodeInfo; } } } }else if(node != null && node.getContentDescription() != null && node.getContentDescription().equals(desc)){ return node; } return null; } private void printWindow(AccessibilityWindowInfo window, String space){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Log.e(TAG,space +" id:"+window.getId() +" class:"+window.getClass().getName()+" text:"+window.getTitle()+" "+window.getRoot()); printView(window.getRoot()," window node "); } if(window.getChildCount() > 0){ for(int i = 0 ; i < window.getChildCount() ; i ++){ if(window.getChild(i) != null) { printWindow(window.getChild(i),space + " \t"); } } } } @Override public void onInterrupt() { unregisterReceiver(receiver); } @Override protected void onServiceConnected() { AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo(); serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; serviceInfo.packageNames = new String[]{/*"com.tencent.mm",*/"com.ss.android.ugc.aweme"/*,"com.runt.autotext"*/}; serviceInfo.notificationTimeout=100; serviceInfo.flags = AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS; setServiceInfo(serviceInfo); IntentFilter filter = new IntentFilter(); filter.addAction(AutoInputService.class.getName()); registerReceiver(receiver,filter); } }