From 9aeecdbe43d4c4601710b6c7b301f41f55c07746 Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Tue, 29 Mar 2022 15:54:33 +0000 Subject: [PATCH] 路径修改,部分功能类添加和修改 --- app/src/main/java/com/auto/lyric/MainActivity.java | 84 +++++++++++++- app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java | 14 +- app/src/main/java/com/auto/lyric/vm/MainViewModel.java | 9 + app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java | 8 app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java | 2 app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java | 7 app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java | 2 app/src/main/java/com/auto/lyric/util/MyLog.java | 2 app/src/main/java/com/auto/lyric/service/AutoInputService.java | 210 +++++++++++++++++++++++++++++++++++ 9 files changed, 315 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/auto/lyric/MainActivity.java b/app/src/main/java/com/auto/lyric/MainActivity.java index ec4e9ce..0340eef 100644 --- a/app/src/main/java/com/auto/lyric/MainActivity.java +++ b/app/src/main/java/com/auto/lyric/MainActivity.java @@ -1,14 +1,86 @@ package com.auto.lyric; -import androidx.appcompat.app.AppCompatActivity; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; -import android.os.Bundle; +import com.auto.lyric.base.activities.BaseActivity; +import com.auto.lyric.databinding.ActivityMainBinding; +import com.auto.lyric.service.AutoInputService; +import com.auto.lyric.vm.MainViewModel; -public class MainActivity extends AppCompatActivity { +public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> { + + Intent service = new Intent(getApplicationContext(), AutoInputService.class); @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); + public void initViews() { + } + + @Override + protected void onResume() { + super.onResume(); + + //申请权限 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + //开启悬浮窗 + if(!Settings.canDrawOverlays(getApplicationContext())) { + //启动Activity让用户授权 + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); + intent.setData(Uri.parse("package:" + getPackageName())); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK ); + startActivity(intent); + }else if(!isAccessibilitySettingsOn()){//辅助权限 + Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK ); + startActivity(intent); + }else{//开启监听服务 + startService(service); + } + } + } + + public boolean isAccessibilitySettingsOn() { + int accessibilityEnabled = 0; + final String service = getPackageName() + "/" + AutoInputService.class.getCanonicalName(); + try { + accessibilityEnabled = Settings.Secure.getInt( + this.getApplicationContext().getContentResolver(), + android.provider.Settings.Secure.ACCESSIBILITY_ENABLED); + Log.v(TAG, "accessibilityEnabled = " + accessibilityEnabled); + } catch (Settings.SettingNotFoundException e) { + Log.e(TAG, "Error finding setting, default accessibility to not found: " + + e.getMessage()); + } + TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':'); + + if (accessibilityEnabled == 1) { + Log.v(TAG, "***ACCESSIBILITY IS ENABLED*** -----------------"); + String settingValue = Settings.Secure.getString( + getApplicationContext().getContentResolver(), + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); + if (settingValue != null) { + mStringColonSplitter.setString(settingValue); + while (mStringColonSplitter.hasNext()) { + String accessibilityService = mStringColonSplitter.next(); + + Log.v(TAG, "-------------- > accessibilityService :: " + accessibilityService + " " + service); + if (accessibilityService.equalsIgnoreCase(service)) { + Log.v(TAG, "We've found the correct setting - accessibility is switched on!"); + return true; + } + } + } + } else { + Log.v(TAG, "***ACCESSIBILITY IS DISABLED***"); + } + + return false; + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java index e853910..8b5af59 100644 --- a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java +++ b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/EncryptInterceptor.java @@ -1,7 +1,7 @@ package com.auto.lyric.retrofit.Interceptor; -import com.runt.open.mvvm.retrofit.utils.RSAUtils; +import com.auto.lyric.retrofit.utils.RSAUtils; import org.json.JSONObject; diff --git a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java index 6355bf8..d75056a 100644 --- a/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java +++ b/app/src/main/java/com/auto/lyric/retrofit/Interceptor/HttpLoggingInterceptor.java @@ -2,10 +2,10 @@ import android.util.Log; -import com.runt.open.mvvm.retrofit.net.NetWorkCost; -import com.runt.open.mvvm.retrofit.net.NetWorkListenear; -import com.runt.open.mvvm.retrofit.utils.HttpPrintUtils; -import com.runt.open.mvvm.util.GsonUtils; +import com.auto.lyric.retrofit.net.NetWorkCost; +import com.auto.lyric.retrofit.net.NetWorkListenear; +import com.auto.lyric.retrofit.utils.HttpPrintUtils; +import com.auto.lyric.util.GsonUtils; import org.json.JSONObject; diff --git a/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java b/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java index 61cc267..4bf4ece 100644 --- a/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java +++ b/app/src/main/java/com/auto/lyric/retrofit/observable/HttpObserver.java @@ -4,7 +4,7 @@ import androidx.lifecycle.MutableLiveData; -import com.runt.open.mvvm.data.BaseApiResult; +import com.auto.lyric.data.BaseApiResult; import java.lang.reflect.ParameterizedType; import java.net.SocketTimeoutException; diff --git a/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java b/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java index f33776c..4b0e3df 100644 --- a/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java +++ b/app/src/main/java/com/auto/lyric/retrofit/utils/HttpPrintUtils.java @@ -1,8 +1,9 @@ package com.auto.lyric.retrofit.utils; -import com.runt.open.mvvm.BuildConfig; -import com.runt.open.mvvm.util.GsonUtils; -import com.runt.open.mvvm.util.MyLog; + +import com.auto.lyric.BuildConfig; +import com.auto.lyric.util.GsonUtils; +import com.auto.lyric.util.MyLog; import java.io.EOFException; import java.util.ArrayList; diff --git a/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java b/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java index 5010d05..ca63fbf 100644 --- a/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java +++ b/app/src/main/java/com/auto/lyric/retrofit/utils/RetrofitUtils.java @@ -1,12 +1,12 @@ package com.auto.lyric.retrofit.utils; -import com.runt.open.mvvm.BuildConfig; -import com.runt.open.mvvm.retrofit.Interceptor.EncryptInterceptor; -import com.runt.open.mvvm.retrofit.Interceptor.HttpLoggingInterceptor; -import com.runt.open.mvvm.retrofit.api.CommonApiCenter; -import com.runt.open.mvvm.retrofit.converter.DecryptGsonConverterFactory; -import com.runt.open.mvvm.retrofit.net.NetWorkListenear; +import com.auto.lyric.BuildConfig; +import com.auto.lyric.retrofit.Interceptor.EncryptInterceptor; +import com.auto.lyric.retrofit.Interceptor.HttpLoggingInterceptor; +import com.auto.lyric.retrofit.api.CommonApiCenter; +import com.auto.lyric.retrofit.converter.DecryptGsonConverterFactory; +import com.auto.lyric.retrofit.net.NetWorkListenear; import java.util.Collections; import java.util.concurrent.TimeUnit; @@ -108,7 +108,7 @@ //设置OKHttpClient .client(client) //设置baseUrl,注意,baseUrl必须后缀"/" - .baseUrl(BuildConfig.ENVIRONMENT.equals("develop")?HOST_IP_ADDR:BuildConfig.HOST_IP_ADDR) + //.baseUrl(BuildConfig.ENVIRONMENT.equals("develop")?HOST_IP_ADDR:BuildConfig.HOST_IP_ADDR) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); } diff --git a/app/src/main/java/com/auto/lyric/service/AutoInputService.java b/app/src/main/java/com/auto/lyric/service/AutoInputService.java new file mode 100644 index 0000000..73c3ea9 --- /dev/null +++ b/app/src/main/java/com/auto/lyric/service/AutoInputService.java @@ -0,0 +1,210 @@ +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); + } +} diff --git a/app/src/main/java/com/auto/lyric/util/MyLog.java b/app/src/main/java/com/auto/lyric/util/MyLog.java index 5fc42ee..2d4b65e 100644 --- a/app/src/main/java/com/auto/lyric/util/MyLog.java +++ b/app/src/main/java/com/auto/lyric/util/MyLog.java @@ -2,7 +2,7 @@ import android.util.Log; -import com.runt.open.mvvm.BuildConfig; +import com.auto.lyric.BuildConfig; /** diff --git a/app/src/main/java/com/auto/lyric/vm/MainViewModel.java b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java new file mode 100644 index 0000000..395a607 --- /dev/null +++ b/app/src/main/java/com/auto/lyric/vm/MainViewModel.java @@ -0,0 +1,9 @@ +package com.auto.lyric.vm; + +import com.auto.lyric.base.model.BaseViewModel; + +/** + * Created by Runt (qingingrunt2010@qq.com) on 2022/3/20. + */ +public class MainViewModel extends BaseViewModel { +} -- Gitblit v1.9.1