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<AccessibilityNodeInfo> 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<AccessibilityNodeInfo> 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<AccessibilityNodeInfo> 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);
|
}
|
}
|