From 3764c45d81ef5e641c9cd4bce939f9f1d37e58fc Mon Sep 17 00:00:00 2001 From: wming-black <3055464370@qq.com> Date: Tue, 7 Dec 2021 15:09:26 +0800 Subject: [PATCH] WeChat --- .../fisherbone/fuzhu/utils/DeviceUtils.java | 5 +- wechat/build.gradle | 9 +- wechat/src/main/AndroidManifest.xml | 88 ++- wechat/src/main/debug/AndroidManifest.xml | 89 ++- .../derry/wechat/Activity/W_MainActivity.java | 128 ++++ .../Activity/WeChatChannelActivity.java | 89 +++ .../wechat/Activity/WeChatControlWindow.java | 65 ++ .../derry/wechat/Activity/WeChatPlate.java | 30 + .../java/com/derry/wechat/TestAblStep2.java | 14 - .../java/com/derry/wechat/W_MainActivity.java | 113 ---- .../java/com/derry/wechat/WeChatConfig.java | 18 + .../java/com/derry/wechat/WeChatPlate.java | 49 -- .../com/derry/wechat/abllib/AblConfig.java | 89 +++ .../com/derry/wechat/abllib/AblService.java | 64 ++ .../com/derry/wechat/abllib/AblStepBase.java | 12 + .../derry/wechat/abllib/AblStepHandler.java | 215 +++++++ .../com/derry/wechat/abllib/AblSteps.java | 234 +++++++ .../wechat/abllib/FindViewCountDown.java | 166 +++++ .../wechat/abllib/callback/AniCallBack.java | 16 + .../wechat/abllib/callback/AnisCallBack.java | 20 + .../abllib/callback/GestureCallBack.java | 15 + .../derry/wechat/abllib/utils/AblUtil.java | 255 ++++++++ .../wechat/abllib/utils/AblViewUtil.java | 603 ++++++++++++++++++ .../wechat/debug/Login_DebugActivity.java | 135 ++-- .../wechat/{ => steps}/TestAblStep1.java | 16 +- .../com/derry/wechat/steps/TestAblStep2.java | 159 +++++ .../com/derry/wechat/steps/TestAblStep3.java | 30 + .../wechat/weutil/WeChatDeviceUtils.java | 152 +++++ .../derry/wechat/weutil/WeChatSPUtils.java | 55 ++ .../java/com/derry/wechat/weutil/WeData.java | 44 ++ wechat/src/main/res/drawable/btn_style.xml | 18 + wechat/src/main/res/drawable/wechat.png | Bin 0 -> 2750 bytes .../res/layout/activity_we_chat_channel.xml | 18 + .../main/res/layout/layout_wechatplate.xml | 164 +---- wechat/src/main/res/layout/view_test_w.xml | 34 +- .../src/main/res/layout/w_activity_debug.xml | 225 +++++-- .../src/main/res/layout/w_activity_main.xml | 225 +++++-- wechat/src/main/res/values/colors.xml | 1 + wechat/src/main/res/xml/abl_service.xml | 12 + 39 files changed, 3156 insertions(+), 518 deletions(-) create mode 100644 wechat/src/main/java/com/derry/wechat/Activity/W_MainActivity.java create mode 100644 wechat/src/main/java/com/derry/wechat/Activity/WeChatChannelActivity.java create mode 100644 wechat/src/main/java/com/derry/wechat/Activity/WeChatControlWindow.java create mode 100644 wechat/src/main/java/com/derry/wechat/Activity/WeChatPlate.java delete mode 100644 wechat/src/main/java/com/derry/wechat/TestAblStep2.java delete mode 100644 wechat/src/main/java/com/derry/wechat/W_MainActivity.java create mode 100644 wechat/src/main/java/com/derry/wechat/WeChatConfig.java delete mode 100644 wechat/src/main/java/com/derry/wechat/WeChatPlate.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/AblConfig.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/AblService.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/AblStepBase.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/AblStepHandler.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/AblSteps.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/FindViewCountDown.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/callback/AniCallBack.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/callback/AnisCallBack.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/callback/GestureCallBack.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/utils/AblUtil.java create mode 100644 wechat/src/main/java/com/derry/wechat/abllib/utils/AblViewUtil.java rename wechat/src/main/java/com/derry/wechat/{ => steps}/TestAblStep1.java (93%) create mode 100644 wechat/src/main/java/com/derry/wechat/steps/TestAblStep2.java create mode 100644 wechat/src/main/java/com/derry/wechat/steps/TestAblStep3.java create mode 100644 wechat/src/main/java/com/derry/wechat/weutil/WeChatDeviceUtils.java create mode 100644 wechat/src/main/java/com/derry/wechat/weutil/WeChatSPUtils.java create mode 100644 wechat/src/main/java/com/derry/wechat/weutil/WeData.java create mode 100644 wechat/src/main/res/drawable/btn_style.xml create mode 100644 wechat/src/main/res/drawable/wechat.png create mode 100644 wechat/src/main/res/layout/activity_we_chat_channel.xml create mode 100644 wechat/src/main/res/xml/abl_service.xml diff --git a/app/src/main/java/com/fisherbone/fuzhu/utils/DeviceUtils.java b/app/src/main/java/com/fisherbone/fuzhu/utils/DeviceUtils.java index 59dff6a..4036cd4 100644 --- a/app/src/main/java/com/fisherbone/fuzhu/utils/DeviceUtils.java +++ b/app/src/main/java/com/fisherbone/fuzhu/utils/DeviceUtils.java @@ -1,6 +1,7 @@ package com.fisherbone.fuzhu.utils; import android.Manifest; +import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; @@ -78,12 +79,12 @@ public class DeviceUtils { return UUIDStr; } } else { - TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(context.TELEPHONY_SERVICE); + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { return TODO; } - String imei = telephonyManager.getDeviceId(); + @SuppressLint("MissingPermission") String imei = telephonyManager.getDeviceId(); return imei; } diff --git a/wechat/build.gradle b/wechat/build.gradle index cb8d750..7447df2 100644 --- a/wechat/build.gradle +++ b/wechat/build.gradle @@ -59,10 +59,15 @@ android { } } } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.google.android.material:material:1.3.0' /*implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'*/ @@ -89,6 +94,8 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' - implementation 'com.github.Levine1992:Abllib:V1.0' implementation 'com.getbase:floatingactionbutton:1.9.0' + //noinspection GradleCompatible + implementation 'com.android.support:appcompat-v7:28.0.0' + api 'com.blankj:utilcode:1.23.7' } diff --git a/wechat/src/main/AndroidManifest.xml b/wechat/src/main/AndroidManifest.xml index 7959da0..5a42fc1 100644 --- a/wechat/src/main/AndroidManifest.xml +++ b/wechat/src/main/AndroidManifest.xml @@ -1,22 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + android:enabled="true" + android:theme="@style/Theme.Design.NoActionBar"> + + + - - + + - + + + + + + + + \ No newline at end of file diff --git a/wechat/src/main/debug/AndroidManifest.xml b/wechat/src/main/debug/AndroidManifest.xml index 55848a8..50418cb 100644 --- a/wechat/src/main/debug/AndroidManifest.xml +++ b/wechat/src/main/debug/AndroidManifest.xml @@ -1,14 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:theme="@style/Theme.Design.NoActionBar"> + + @@ -16,6 +87,18 @@ + + + + + + + \ No newline at end of file diff --git a/wechat/src/main/java/com/derry/wechat/Activity/W_MainActivity.java b/wechat/src/main/java/com/derry/wechat/Activity/W_MainActivity.java new file mode 100644 index 0000000..34a0529 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/Activity/W_MainActivity.java @@ -0,0 +1,128 @@ +package com.derry.wechat.Activity; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.PopupWindow; + +import androidx.appcompat.app.AppCompatActivity; + +import com.blankj.utilcode.util.ToastUtils; + +import com.derry.wechat.steps.TestAblStep1; + +import com.derry.wechat.abllib.AblConfig; +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.abllib.AblSteps; +import com.derry.wechat.abllib.utils.AblUtil; +import com.derry.wechat.debug.R; +import com.derry.wechat.steps.TestAblStep2; +import com.xiangxue.arouter_annotation.ARouter; + +import io.reactivex.disposables.Disposable; + +/** + * xiaoading + * @author Administrator + * DYX 2021-12-2 + */ +@ARouter(path = "/wechat/W_MainActivity") +public class W_MainActivity extends AppCompatActivity { + public static String APP_PACKAGE_NAME = "com.tencent.mm"; + private PopupWindow mPopCut; + private Disposable mdDisposable; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.w_activity_main); + //透明状态栏 + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + + AblConfig.Builder() + .setMonitoringPackageNames("com.tencent.mm")//微信包 + .setLogTag("DDD")//logtag,不设置默认是abllib + .setStepMsgDelayMillis(3000)//步骤延迟时间 + .setFindViewMillisInFuture(10000)//寻找界面超时时间 + .setFindViewCountDownInterval(200)//寻找界面间隔时间 + .build().init(); + AblStepHandler.getInstance().initStepClass(new TestAblStep1() , new TestAblStep2()); + + AblUtil.getPermissions(W_MainActivity.this); + + //adb shell pm grant com.derry.wechat android.permission.WRITE_SECURE_SETTINGS + Settings.Secure.putString(getContentResolver(), + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.derry.wechat/com.derry.wechat.abllib.AblService"); + Settings.Secure.putString(getContentResolver(), + Settings.Secure.ACCESSIBILITY_ENABLED, "1");//1表示开启 + if (AblUtil.isAccessibilityServiceOpen(W_MainActivity.this)) { + // Log.e("TIAOSHI###", "无障碍服务正常"); + ToastUtils.showShort( "无障碍服务正常"); + }else { + ToastUtils.showShort( "无障碍服务异常"); + Settings.Secure.putString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.derry.wechat/com.derry.wechat.abllib.AblService"); + Settings.Secure.putString(getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, "0");//1表示开启 + } + + + /** + * 底部导航栏 + */ + Button mBtnCut = findViewById(R.id.cut); + mBtnCut.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + @SuppressLint("InflateParams") View v = getLayoutInflater().inflate(R.layout.layout_pop,null); + mPopCut = new PopupWindow(v, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); + mPopCut.setTouchable(true); + mPopCut.setFocusable(true); + mPopCut.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM,0,0); + } + }); + + /** + * 菜单 + */ + Button mBtnRecommend = findViewById(R.id.recommed); + mBtnRecommend.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(W_MainActivity.this, WeChatPlate.class); + startActivity(intent); + } + }); + Button mBtnChannel = findViewById(R.id.channel); + mBtnChannel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(W_MainActivity.this,WeChatChannelActivity.class); + startActivity(intent); + } + }); + + } + @Override + public void onDestroy() { + super.onDestroy(); + Settings.Secure.putString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.fisherbone.fuzhu/com.fisherbone.fuzhu.abllib.AblService"); + Settings.Secure.putString(getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, "0");//1表示开启 + + if (mdDisposable != null) { + mdDisposable.dispose(); + } + } +} diff --git a/wechat/src/main/java/com/derry/wechat/Activity/WeChatChannelActivity.java b/wechat/src/main/java/com/derry/wechat/Activity/WeChatChannelActivity.java new file mode 100644 index 0000000..3a05305 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/Activity/WeChatChannelActivity.java @@ -0,0 +1,89 @@ +package com.derry.wechat.Activity; + +import static com.derry.wechat.Activity.W_MainActivity.APP_PACKAGE_NAME; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; + +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.abllib.AblSteps; +import com.derry.wechat.abllib.utils.AblUtil; +import com.derry.wechat.abllib.utils.AblViewUtil; +import com.derry.wechat.debug.R; + +/** + * @author Administrator + * Dyx 2021-12-2 + */ +public class WeChatChannelActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_we_chat_channel); + //透明状态栏 + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + + + WeChatControlWindow weChatControlWindow = new WeChatControlWindow(WeChatChannelActivity.this); + Button mBtnChannelStart = findViewById(R.id.wechat_channel_start); + mBtnChannelStart.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (AblUtil.isAccessibilityServiceOpen(WeChatChannelActivity.this)) { + AblStepHandler.getInstance().setStop(false); + //AblUtil.addSuspensionWindowView(WeChatChannelActivity.this,weChatControlWindow.initWindowView()); + launchapp(WeChatChannelActivity.this); + AblViewUtil.mySleep(5); + AblStepHandler.sendMsg(AblSteps.STEP_10); + } else { + AblUtil.openAccessibilitySettings(); + //ToastUtils.showShort("请先开启辅助服务"); + } + } + }); + } + + + + + //跳转页面的方法 + private void launchapp(Context context) { + //判断当前手机是否有要跳入的app + if (isAppInstalled(context)){ + //如果有根据包名跳转 + context.startActivity(context.getPackageManager().getLaunchIntentForPackage(APP_PACKAGE_NAME)); + }else{ + //如果没有,走进入系统商店找到这款APP,提示你去下载这款APP的程序 + goToMarket(context); + } + } + //这里是进入应用商店,下载指定APP的方法。 + private void goToMarket(Context context) { + Uri uri = Uri.parse("market://details?id=" + W_MainActivity.APP_PACKAGE_NAME); + Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); + try { + context.startActivity(goToMarket); + } catch (Exception e) { + e.printStackTrace(); + } + } + //这里是判断APP中是否有相应APP的方法 + private boolean isAppInstalled(Context context) { + try { + context.getPackageManager().getPackageInfo(W_MainActivity.APP_PACKAGE_NAME,0); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } +} \ No newline at end of file diff --git a/wechat/src/main/java/com/derry/wechat/Activity/WeChatControlWindow.java b/wechat/src/main/java/com/derry/wechat/Activity/WeChatControlWindow.java new file mode 100644 index 0000000..dd96fd6 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/Activity/WeChatControlWindow.java @@ -0,0 +1,65 @@ +package com.derry.wechat.Activity; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.WindowManager; + +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.debug.R; + +/** + * @author Administrator + * DYX 2021-12-3 + */ +public class WeChatControlWindow { + Context mContext; + public WeChatControlWindow (Context mContext){ + this.mContext=mContext; + } + public View initWindowView(){//悬浮窗 + + LayoutInflater inflater = (LayoutInflater)mContext.getSystemService + (Context.LAYOUT_INFLATER_SERVICE); + View view = View.inflate(mContext, R.layout.view_test_w, null); +// view.findViewById(R.id.fu_btn_1).setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View view) { +// if (AblUtil.isAccessibilityServiceOpen(W_MainActivity.this)) { +// AblStepHandler.getInstance().setStop(false); +// AblStepHandler.sendMsg(AblSteps.STEP_1); +// } else { +// ToastUtils.showShort("请先开启辅助服务"); +// } +// } +// }); + view.findViewById(R.id.fu_btn_2).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + WindowManager windowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); + windowManager.removeView(view); + + } + }); + view.findViewById(R.id.fu_btn_3).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + AblStepHandler.getInstance().setStop(true); + } + }); + view.findViewById(R.id.fu_btn_4).setOnClickListener(new View.OnClickListener() { + @SuppressLint("ObsoleteSdkInt") + @Override + public void onClick(View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + AblService.getInstance().disableSelf(); + } + } + }); + + return view; + } +} diff --git a/wechat/src/main/java/com/derry/wechat/Activity/WeChatPlate.java b/wechat/src/main/java/com/derry/wechat/Activity/WeChatPlate.java new file mode 100644 index 0000000..00d3238 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/Activity/WeChatPlate.java @@ -0,0 +1,30 @@ +package com.derry.wechat.Activity; + + +import android.os.Bundle; + +import android.view.WindowManager; + + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import com.derry.wechat.debug.R; + + +/** + * @author Administrator + */ +public class WeChatPlate extends AppCompatActivity { + + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.layout_wechatplate); + //透明状态栏 + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + + } +} diff --git a/wechat/src/main/java/com/derry/wechat/TestAblStep2.java b/wechat/src/main/java/com/derry/wechat/TestAblStep2.java deleted file mode 100644 index 468c6e6..0000000 --- a/wechat/src/main/java/com/derry/wechat/TestAblStep2.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.derry.wechat; - -import android.os.Message; - -import com.levine.abllib.AblStepBase; - -public class TestAblStep2 extends AblStepBase { - @Override - public void onStep(int step, Message msg) { - switch (step){ - - } - } -} diff --git a/wechat/src/main/java/com/derry/wechat/W_MainActivity.java b/wechat/src/main/java/com/derry/wechat/W_MainActivity.java deleted file mode 100644 index e242a6f..0000000 --- a/wechat/src/main/java/com/derry/wechat/W_MainActivity.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.derry.wechat; - -import android.content.Context; -import android.os.Build; -import android.os.Bundle; -import android.view.View; -import android.view.WindowManager; - -import androidx.appcompat.app.AppCompatActivity; - -import com.blankj.utilcode.util.ToastUtils; - -import com.levine.abllib.AblConfig; -import com.levine.abllib.AblService; -import com.levine.abllib.AblStepHandler; -import com.levine.abllib.AblSteps; -import com.levine.abllib.utils.AblUtil; -import com.xiangxue.arouter_annotation.ARouter; - -/** - * xiaoading - */ -@ARouter(path = "/wechat/W_MainActivity") -public class W_MainActivity extends AppCompatActivity { - - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.w_activity_main); - AblConfig.Builder() - .setMonitoringPackageNames("com.tencent.mm")//微信包 - .setLogTag("DDD")//logtag,不设置默认是abllib - .setStepMsgDelayMillis(3000)//步骤延迟时间 - .setFindViewMillisInFuture(10000)//寻找界面超时时间 - .setFindViewCountDownInterval(200)//寻找界面间隔时间 - .build().init(); - AblStepHandler.getInstance().initStepClass(new TestAblStep1()); - findViewById(R.id.btn_1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblUtil.openAccessibilitySettings(); - } - }); - findViewById(R.id.btn_2).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblUtil.addSuspensionWindowView(W_MainActivity.this,initWindowView()); - } - }); - findViewById(R.id.btn_3).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblUtil.openDrawOverlaysAnth(W_MainActivity.this); - } - }); - findViewById(R.id.btn_4).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (AblUtil.isAccessibilityServiceOpen(W_MainActivity.this)) { - AblStepHandler.getInstance().setStop(false); - AblStepHandler.sendMsg(AblSteps.STEP_1); - } else { - ToastUtils.showShort("请先开启辅助服务"); - } - } - }); - findViewById(R.id.btn_5).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblStepHandler.getInstance().setStop(true); - } - }); - - } - private View initWindowView(){//悬浮窗 - View view = View.inflate(this, R.layout.view_test_w, null); - view.findViewById(R.id.fu_btn_1).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (AblUtil.isAccessibilityServiceOpen(W_MainActivity.this)) { - AblStepHandler.getInstance().setStop(false); - AblStepHandler.sendMsg(AblSteps.STEP_1); - } else { - ToastUtils.showShort("请先开启辅助服务"); - } - } - }); - view.findViewById(R.id.fu_btn_2).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); - windowManager.removeView(view); - } - }); - view.findViewById(R.id.fu_btn_3).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblStepHandler.getInstance().setStop(true); - } - }); - view.findViewById(R.id.fu_btn_4).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - AblService.getInstance().disableSelf(); - } - } - }); - - return view; - } -} diff --git a/wechat/src/main/java/com/derry/wechat/WeChatConfig.java b/wechat/src/main/java/com/derry/wechat/WeChatConfig.java new file mode 100644 index 0000000..a388777 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/WeChatConfig.java @@ -0,0 +1,18 @@ +package com.derry.wechat; + +/** + * @author Administrator + * DYX 2021-12-3 + */ +public class WeChatConfig { + /** + * 设备id + */ + public static String KEY_DEVICE_ID = "device_id"; + + /** + * 设备是否已激活 + * 设备是否已激活 0是激活 1是未激活 + */ + public static String IS_ACTIVATION = "activation"; +} diff --git a/wechat/src/main/java/com/derry/wechat/WeChatPlate.java b/wechat/src/main/java/com/derry/wechat/WeChatPlate.java deleted file mode 100644 index c1576fe..0000000 --- a/wechat/src/main/java/com/derry/wechat/WeChatPlate.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.derry.wechat; - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.os.Bundle; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.Button; -import android.widget.PopupWindow; - -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; - - - -public class WeChatPlate extends AppCompatActivity { - private PopupWindow mPopCut; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.layout_wechatplate); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); - getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); - - Button mBtnCut = findViewById(R.id.cut); - mBtnCut.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - @SuppressLint("InflateParams") View v = getLayoutInflater().inflate(R.layout.layout_pop,null); - mPopCut = new PopupWindow(v, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); - mPopCut.setTouchable(true); - mPopCut.setFocusable(true); - mPopCut.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM,0,0); - } - }); - - Button mBtnRecommend = findViewById(R.id.recommed); - mBtnRecommend.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(WeChatPlate.this,W_MainActivity.class); - startActivity(intent); - } - }); - } -} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/AblConfig.java b/wechat/src/main/java/com/derry/wechat/abllib/AblConfig.java new file mode 100644 index 0000000..c25fe0b --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/AblConfig.java @@ -0,0 +1,89 @@ +package com.derry.wechat.abllib; + +import com.blankj.utilcode.util.LogUtils; + +/** + * 2019/4/21 + * 17:49 + * Levine + * wechat 1483232332 + * @author Administrator + * DYX 2021-11-30 + */ +public class AblConfig { + + private String mLogTag; + private boolean mIsLog; + private long mStepMsgDelayMillis;//消息延迟发送时间 + private long findViewMillisInFuture;//查找view倒计时总时长 + private long findViewCountDownInterval;//查找view检查间隔时间 + /** + * 所监测的APP包名,如果不设置将会监听整个系统的界面变化,如果设置后只会监听指定包名的APP + * 【暂时不用】 + */ + public static String[] sMonitoringPackageNames; + + private AblConfig(Builder builder) { + mLogTag = builder.mLogTag; + mIsLog = builder.mIsLog; + sMonitoringPackageNames = builder.mMonitoringPackageNames; + mStepMsgDelayMillis = builder.mStepMsgDelayMillis; + findViewCountDownInterval = builder.findViewCountDownInterval; + findViewMillisInFuture = builder.findViewMillisInFuture; + } + + public void init() { + LogUtils.getConfig().setGlobalTag(mLogTag); + LogUtils.getConfig().setLogSwitch(mIsLog); + AblStepHandler.getInstance().setStepMsgDelayMillis(mStepMsgDelayMillis); + FindViewCountDown.countDownInterval = findViewCountDownInterval; + FindViewCountDown.millisInFuture = findViewMillisInFuture; + } + + public static Builder Builder() { + return new Builder(); + } + + public static class Builder { + private String mLogTag = "abllib"; + private boolean mIsLog = true; + private String[] mMonitoringPackageNames; + private long mStepMsgDelayMillis = 2000;//步骤延迟发送时间 + private long findViewMillisInFuture = 10000;//查找view倒计时总时长 + private long findViewCountDownInterval = 500;//查找view检查间隔时间 + + public Builder setLogTag(String logTag) { + mLogTag = logTag; + return this; + } + + public Builder setLog(boolean log) { + mIsLog = log; + return this; + } + + public Builder setMonitoringPackageNames(String... monitoringPackageNames) { + mMonitoringPackageNames = monitoringPackageNames; + return this; + } + + public Builder setStepMsgDelayMillis(long stepMsgDelayMillis) { + mStepMsgDelayMillis = stepMsgDelayMillis; + return this; + } + + public Builder setFindViewMillisInFuture(long findViewMillisInFuture) { + this.findViewMillisInFuture = findViewMillisInFuture; + return this; + } + + public Builder setFindViewCountDownInterval(long findViewCountDownInterval) { + this.findViewCountDownInterval = findViewCountDownInterval; + return this; + } + + public AblConfig build() { + return new AblConfig(this); + } + } +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/AblService.java b/wechat/src/main/java/com/derry/wechat/abllib/AblService.java new file mode 100644 index 0000000..ec1697c --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/AblService.java @@ -0,0 +1,64 @@ +package com.derry.wechat.abllib; + +import android.accessibilityservice.AccessibilityService; +import android.accessibilityservice.AccessibilityServiceInfo; +import android.view.accessibility.AccessibilityEvent; + +import com.blankj.utilcode.util.LogUtils; + + +/** + * 2019/4/21 + * 11:29 + * Levine + * wechat 1483232332 + * @author Administrator + * + * DYX 2021-11-30 + */ +public class AblService extends AccessibilityService { + + private static AblService mAblService; + + public static AblService getInstance() { + if (mAblService == null) { + throw new NullPointerException("AblService辅助服务未开启"); + } + return mAblService; + } + + @Override + public void onCreate() { + super.onCreate(); + mAblService = this; + init(); + } + private void init() { + + } + @Override + protected boolean onGesture(int gestureId) { + return super.onGesture(gestureId); + } + @Override + protected void onServiceConnected() { + super.onServiceConnected(); + LogUtils.v("onServiceConnected"); + AccessibilityServiceInfo config = new AccessibilityServiceInfo(); + //配置监听的事件类型为界面变化|点击事件 + config.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED | AccessibilityEvent.TYPE_VIEW_CLICKED; + config.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; + config.flags = AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY; + setServiceInfo(config); + } + + @Override + public void onAccessibilityEvent(AccessibilityEvent event) { +// LogUtils.v(event.getPackageName() + ""); + } + + @Override + public void onInterrupt() { + + } +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/AblStepBase.java b/wechat/src/main/java/com/derry/wechat/abllib/AblStepBase.java new file mode 100644 index 0000000..80e5fe4 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/AblStepBase.java @@ -0,0 +1,12 @@ +package com.derry.wechat.abllib; + +/** + * 2019/4/21 + * 16:44 + * Levine + * wechat 1483232332 + * @author Administrator + * DYX 2021-12-1 + */ +public abstract class AblStepBase implements AblStepHandler.StepListener { +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/AblStepHandler.java b/wechat/src/main/java/com/derry/wechat/abllib/AblStepHandler.java new file mode 100644 index 0000000..e326cc2 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/AblStepHandler.java @@ -0,0 +1,215 @@ +package com.derry.wechat.abllib; + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import androidx.annotation.NonNull; + +import com.blankj.utilcode.util.LogUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * 2019/4/21 + * 14:36 + * Levine + * wechat 1483232332 + * @author Administrator + * DYX 2021-12-2 + */ +public class AblStepHandler extends Handler { + + private static AblStepHandler instance; + private List mStepListeners = new ArrayList<>(); + private boolean isStop = true;//是否停止 + private String[] mDatas;//数据 + private long mStepMsgDelayMillis = 2000;//消息延迟发送时间 + private List mInitializedSteps = new ArrayList<>();//已经初始化过的步骤 + + private AblStepHandler() { + super(Looper.getMainLooper()); + } + + public static AblStepHandler getInstance() { + if (instance == null) { + synchronized (AblStepHandler.class) { + if (instance == null) { + instance = new AblStepHandler(); + } + } + } + return instance; + } + + /** + * 发送handler执行消息 + * + * @param step 步骤 + * @param delayMillis 延迟时间 + * @param datas 数据 + */ + public static void sendMsg(int step, long delayMillis, String... datas) { + AblStepHandler ablStepHandler = AblStepHandler.getInstance(); + if (datas != null && datas.length > 0) { + ablStepHandler.setDatas(datas); + } + ablStepHandler.sendEmptyMessageDelayed(step, delayMillis); + } + + /** + * 发送handler执行消息 + * + * @param step 步骤 + * @param delayMillis 延迟时间 + */ + public static void sendMsg(int step, long delayMillis) { + sendMsg(step, delayMillis, new String[]{}); + } + + /** + * 发送handler执行消息 + * + * @param step 步骤 + * @param datas 数据 + */ + public static void sendMsg(int step, String... datas) { + sendMsg(step, AblStepHandler.getInstance().getStepMsgDelayMillis(), datas); + } + + /** + * 发送handler执行消息 + * + * @param step 步骤 + */ + public static void sendMsg(int step) { + sendMsg(step, AblStepHandler.getInstance().getStepMsgDelayMillis(), new String[]{}); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param millisInFuture view查找超时时间 + * @param countDownInterval 查找间隔时间 + * @param step 步骤 + */ + public static void sendMsgByView( + long millisInFuture, + long countDownInterval, + int step, + String... nextMsgViewIdOrText + ) { + FindViewCountDown.start(millisInFuture, countDownInterval, step, nextMsgViewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param millisInFuture view查找超时时间 + * @param countDownInterval 查找间隔时间 + * @param callBack 回调,注:如果回调不为空将不发送消息,要发送消息就自己在成功的回调里发送 + * @param viewIdOrText viewid或者文字内容 + */ + public static void sendMsgByView( + long millisInFuture, + long countDownInterval, + @NonNull FindViewCountDown.CallBack callBack, + String... viewIdOrText + ) { + FindViewCountDown.start(millisInFuture, countDownInterval, callBack, viewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param step 步骤 + * @param viewIdOrText viewid或者文字内容 + */ + public static void sendMsgByView( + int step, + String... viewIdOrText + ) { + FindViewCountDown.start(step, viewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param callBack 回调,注:如果回调不为空将不发送消息,要发送消息就自己在成功的回调里发送 + * @param viewIdOrText viewid或者文字内容 + */ + public static void sendMsgByView( + @NonNull FindViewCountDown.CallBack callBack, + String... viewIdOrText + ) { + FindViewCountDown.start(callBack, viewIdOrText); + } + + + public String[] getDatas() { + return mDatas; + } + + public void setDatas(String... datas) { + mDatas = datas; + } + + public long getStepMsgDelayMillis() { + return mStepMsgDelayMillis; + } + + public void setStepMsgDelayMillis(long msgDelayMillis) { + mStepMsgDelayMillis = msgDelayMillis; + } + + public boolean isStop() { + + return isStop; + } + + public void setStop(boolean stop) { + isStop = stop; + } + + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + if (isStop) { + return; + } + LogUtils.v("step", msg.what); + for (StepListener stepListener : mStepListeners) { + stepListener.onStep(msg.what, msg); + } + } + + private void addStepListener(StepListener handleMessageListener) { + mStepListeners.add(handleMessageListener); + } + + public void removeStepListener(StepListener handleMessageListener) { + mStepListeners.remove(handleMessageListener); + } + + /** + * 初始化步骤实现类 + * + * @param ablStepBases 继承了StepBase的实现类 + */ + public void initStepClass(AblStepBase... ablStepBases) { + for (AblStepBase ablStepBase : ablStepBases) { + if (mInitializedSteps.contains(ablStepBase.getClass().getName())) { + LogUtils.e(ablStepBase.getClass().getName() + "已经初始化,请勿重复初始化"); + continue; + } + addStepListener(ablStepBase); + mInitializedSteps.add(ablStepBase.getClass().getName()); + } + } + + public interface StepListener { + void onStep(int step, Message msg); + } + +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/AblSteps.java b/wechat/src/main/java/com/derry/wechat/abllib/AblSteps.java new file mode 100644 index 0000000..4c23c5d --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/AblSteps.java @@ -0,0 +1,234 @@ +package com.derry.wechat.abllib; + +/** + * 2019/4/21 + * 18:33 + * Levine + * wechat 1483232332 + * @author Administrator + * DYX 2021-12-2 + */ +public class AblSteps { + /** + * 全局静态常量步骤标识1~200,不够自己再加,从200开始加,基本应该都是够的了 + */ + public final static int STEP_1 = 1; + public final static int STEP_2 = 2; + public final static int STEP_3 = 3; + public final static int STEP_4 = 4; + public final static int STEP_5 = 5; + public final static int STEP_6 = 6; + public final static int STEP_7 = 7; + public final static int STEP_8 = 8; + public final static int STEP_9 = 9; + /*****************************************/ + public final static int STEP_10 = 10; + public final static int STEP_11 = 11; + public final static int STEP_12 = 12; + public final static int STEP_13 = 13; + public final static int STEP_14 = 14; + public final static int STEP_15 = 15; + public final static int STEP_16 = 16; + public final static int STEP_17 = 17; + public final static int STEP_18 = 18; + public final static int STEP_19 = 19; + /*****************************************/ + public final static int STEP_20 = 20; + public final static int STEP_21 = 21; + public final static int STEP_22 = 22; + public final static int STEP_23 = 23; + public final static int STEP_24 = 24; + public final static int STEP_25 = 25; + public final static int STEP_26 = 26; + public final static int STEP_27 = 27; + public final static int STEP_28 = 28; + public final static int STEP_29 = 29; + /*****************************************/ + public final static int STEP_30 = 30; + public final static int STEP_31 = 31; + public final static int STEP_32 = 32; + public final static int STEP_33 = 33; + public final static int STEP_34 = 34; + public final static int STEP_35 = 35; + public final static int STEP_36 = 36; + public final static int STEP_37 = 37; + public final static int STEP_38 = 38; + public final static int STEP_39 = 39; + /*****************************************/ + public final static int STEP_40 = 40; + public final static int STEP_41 = 41; + public final static int STEP_42 = 42; + public final static int STEP_43 = 43; + public final static int STEP_44 = 44; + public final static int STEP_45 = 45; + public final static int STEP_46 = 46; + public final static int STEP_47 = 47; + public final static int STEP_48 = 48; + public final static int STEP_49 = 49; + /*****************************************/ + public final static int STEP_50 = 50; + public final static int STEP_51 = 51; + public final static int STEP_52 = 52; + public final static int STEP_53 = 53; + public final static int STEP_54 = 54; + public final static int STEP_55 = 55; + public final static int STEP_56 = 56; + public final static int STEP_57 = 57; + public final static int STEP_58 = 58; + public final static int STEP_59 = 59; + /*****************************************/ + public final static int STEP_60 = 60; + public final static int STEP_61 = 61; + public final static int STEP_62 = 62; + public final static int STEP_63 = 63; + public final static int STEP_64 = 64; + public final static int STEP_65 = 65; + public final static int STEP_66 = 66; + public final static int STEP_67 = 67; + public final static int STEP_68 = 68; + public final static int STEP_69 = 69; + /*****************************************/ + public final static int STEP_70 = 70; + public final static int STEP_71 = 71; + public final static int STEP_72 = 72; + public final static int STEP_73 = 73; + public final static int STEP_74 = 74; + public final static int STEP_75 = 75; + public final static int STEP_76 = 76; + public final static int STEP_77 = 77; + public final static int STEP_78 = 78; + public final static int STEP_79 = 79; + /*****************************************/ + public final static int STEP_80 = 80; + public final static int STEP_81 = 81; + public final static int STEP_82 = 82; + public final static int STEP_83 = 83; + public final static int STEP_84 = 84; + public final static int STEP_85 = 85; + public final static int STEP_86 = 86; + public final static int STEP_87 = 87; + public final static int STEP_88 = 88; + public final static int STEP_89 = 89; + /*****************************************/ + public final static int STEP_90 = 90; + public final static int STEP_91 = 91; + public final static int STEP_92 = 92; + public final static int STEP_93 = 93; + public final static int STEP_94 = 94; + public final static int STEP_95 = 95; + public final static int STEP_96 = 96; + public final static int STEP_97 = 97; + public final static int STEP_98 = 98; + public final static int STEP_99 = 99; + /*****************************************/ + public final static int STEP_100 = 100; + public final static int STEP_101 = 101; + public final static int STEP_102 = 102; + public final static int STEP_103 = 103; + public final static int STEP_104 = 104; + public final static int STEP_105 = 105; + public final static int STEP_106 = 106; + public final static int STEP_107 = 107; + public final static int STEP_108 = 108; + public final static int STEP_109 = 109; + /*****************************************/ + public final static int STEP_110 = 110; + public final static int STEP_111 = 111; + public final static int STEP_112 = 112; + public final static int STEP_113 = 113; + public final static int STEP_114 = 114; + public final static int STEP_115 = 115; + public final static int STEP_116 = 116; + public final static int STEP_117 = 117; + public final static int STEP_118 = 118; + public final static int STEP_119 = 119; + /*****************************************/ + public final static int STEP_120 = 120; + public final static int STEP_121 = 121; + public final static int STEP_122 = 122; + public final static int STEP_123 = 123; + public final static int STEP_124 = 124; + public final static int STEP_125 = 125; + public final static int STEP_126 = 126; + public final static int STEP_127 = 127; + public final static int STEP_128 = 128; + public final static int STEP_129 = 129; + /*****************************************/ + public final static int STEP_130 = 130; + public final static int STEP_131 = 131; + public final static int STEP_132 = 132; + public final static int STEP_133 = 133; + public final static int STEP_134 = 134; + public final static int STEP_135 = 135; + public final static int STEP_136 = 136; + public final static int STEP_137 = 137; + public final static int STEP_138 = 138; + public final static int STEP_139 = 139; + /*****************************************/ + public final static int STEP_140 = 140; + public final static int STEP_141 = 141; + public final static int STEP_142 = 142; + public final static int STEP_143 = 143; + public final static int STEP_144 = 144; + public final static int STEP_145 = 145; + public final static int STEP_146 = 146; + public final static int STEP_147 = 147; + public final static int STEP_148 = 148; + public final static int STEP_149 = 149; + /*****************************************/ + public final static int STEP_150 = 150; + public final static int STEP_151 = 151; + public final static int STEP_152 = 152; + public final static int STEP_153 = 153; + public final static int STEP_154 = 154; + public final static int STEP_155 = 155; + public final static int STEP_156 = 156; + public final static int STEP_157 = 157; + public final static int STEP_158 = 158; + public final static int STEP_159 = 159; + /*****************************************/ + public final static int STEP_160 = 160; + public final static int STEP_161 = 161; + public final static int STEP_162 = 162; + public final static int STEP_163 = 163; + public final static int STEP_164 = 164; + public final static int STEP_165 = 165; + public final static int STEP_166 = 166; + public final static int STEP_167 = 167; + public final static int STEP_168 = 168; + public final static int STEP_169 = 169; + /*****************************************/ + public final static int STEP_170 = 170; + public final static int STEP_171 = 171; + public final static int STEP_172 = 172; + public final static int STEP_173 = 173; + public final static int STEP_174 = 174; + public final static int STEP_175 = 175; + public final static int STEP_176 = 176; + public final static int STEP_177 = 177; + public final static int STEP_178 = 178; + public final static int STEP_179 = 179; + /*****************************************/ + public final static int STEP_180 = 180; + public final static int STEP_181 = 181; + public final static int STEP_182 = 182; + public final static int STEP_183 = 183; + public final static int STEP_184 = 184; + public final static int STEP_185 = 185; + public final static int STEP_186 = 186; + public final static int STEP_187 = 187; + public final static int STEP_188 = 188; + public final static int STEP_189 = 189; + /*****************************************/ + public final static int STEP_190 = 190; + public final static int STEP_191 = 191; + public final static int STEP_192 = 192; + public final static int STEP_193 = 193; + public final static int STEP_194 = 194; + public final static int STEP_195 = 195; + public final static int STEP_196 = 196; + public final static int STEP_197 = 197; + public final static int STEP_198 = 198; + public final static int STEP_199 = 199; + public final static int STEP_200 = 200; +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/FindViewCountDown.java b/wechat/src/main/java/com/derry/wechat/abllib/FindViewCountDown.java new file mode 100644 index 0000000..74b3e6c --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/FindViewCountDown.java @@ -0,0 +1,166 @@ +package com.derry.wechat.abllib; + +import android.os.CountDownTimer; +import android.view.accessibility.AccessibilityNodeInfo; + +import androidx.annotation.NonNull; + +import com.derry.wechat.abllib.utils.AblViewUtil; + + +/** + * 寻找界面倒计时 + * 2019/4/21 + * 15:21 + * Levine + * wechat 1483232332 + * @author Administrator + * DYX 2021-11-30 + */ +public class FindViewCountDown { + + private static DownTimer mDownTimer; + public static long millisInFuture = 10000;//默认倒计时总时长 + public static long countDownInterval = 500;//间隔时间 + + private static class DownTimer extends CountDownTimer { + + private String[] mMsgViewIdOrText; + private int mStep; + private CallBack mCallback; + + public DownTimer( + long millisInFuture, + long countDownInterval, + int step, CallBack callback, + String... viewIdOrText + ) { + super(millisInFuture, countDownInterval); + mMsgViewIdOrText = viewIdOrText.clone(); + mStep = step; + mCallback = callback; + } + + @Override + public void onTick(long l) { + if (AblStepHandler.getInstance().isStop()) { + cancel(); + return; + } + for (String string : mMsgViewIdOrText) { + AccessibilityNodeInfo fromId = AblViewUtil.findById(string, 0); + AccessibilityNodeInfo fromText = AblViewUtil.findByText(string, 0); + if (fromId != null || fromText != null) { + cancel(); + if (mCallback != null) { + mCallback.succ(); + } else { + AblStepHandler.sendMsg(mStep); + } + return; + } + } + } + + @Override + public void onFinish() { + if (mCallback != null) { + mCallback.fail(); + } + } + } + + public interface CallBack { + void succ(); + + default void fail() { + } + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param millisInFuture view查找超时时间 + * @param countDownInterval 查找间隔时间 + * @param step 步骤 + * @param viewIdOrText viewid或者文字内容 + */ + public static void start( + long millisInFuture, + long countDownInterval, + int step, + String... viewIdOrText + ) { + start(millisInFuture, countDownInterval, step, null, viewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param millisInFuture view查找超时时间 + * @param countDownInterval 查找间隔时间 + * @param callBack 回调,注:如果回调不为空将不发送消息,要发送消息就自己在成功的回调里发送 + * @param viewIdOrText viewid或者文字内容 + */ + public static void start( + long millisInFuture, + long countDownInterval, + @NonNull CallBack callBack, + String... viewIdOrText + ) { + start(millisInFuture, countDownInterval, 0, callBack, viewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param callBack 回调,注:如果回调不为空将不发送消息,要发送消息就自己在成功的回调里发送 + * @param viewIdOrText viewid或者文字内容 + */ + public static void start( + @NonNull CallBack callBack, + String... viewIdOrText + ) { + start(millisInFuture, countDownInterval, 0, callBack, viewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param step 步骤 + * @param viewIdOrText viewid或者文字内容 + */ + public static void start( + int step, + String... viewIdOrText + ) { + start(millisInFuture, countDownInterval, step, null, viewIdOrText); + } + + /** + * 根据viewid或文字发送执行消息 + * + * @param millisInFuture view查找超时时间 + * @param countDownInterval 查找间隔时间 + * @param step 步骤 + * @param callBack 回调,注:如果回调不为空将不发送消息,要发送消息就自己在成功的回调里发送 + * @param viewIdOrText viewid或者文字内容 + */ + private static void start( + long millisInFuture, + long countDownInterval, + int step, + CallBack callBack, + String... viewIdOrText + ) { + if (mDownTimer != null) { + mDownTimer.cancel(); + } + mDownTimer = new DownTimer(millisInFuture, countDownInterval, step, callBack, viewIdOrText); + mDownTimer.start(); + } + + public static DownTimer getDownTimer() { + return mDownTimer; + } +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/callback/AniCallBack.java b/wechat/src/main/java/com/derry/wechat/abllib/callback/AniCallBack.java new file mode 100644 index 0000000..9804c03 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/callback/AniCallBack.java @@ -0,0 +1,16 @@ +package com.derry.wechat.abllib.callback; + +import android.view.accessibility.AccessibilityNodeInfo; + +/** + * 2019/4/21 + * 13:05 + * Levine + * wechat 1483232332 + */ +public interface AniCallBack { + void succ(AccessibilityNodeInfo info); + + default void fail() { + } +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/callback/AnisCallBack.java b/wechat/src/main/java/com/derry/wechat/abllib/callback/AnisCallBack.java new file mode 100644 index 0000000..be88b9c --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/callback/AnisCallBack.java @@ -0,0 +1,20 @@ +package com.derry.wechat.abllib.callback; + +import android.view.accessibility.AccessibilityNodeInfo; + +import java.util.List; + +/** + * 2019/4/21 + * 13:04 + * Levine + * wechat 1483232332 + * @author Administrator + * + */ +public interface AnisCallBack { + void succ(List infos); + + default void fail() { + } +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/callback/GestureCallBack.java b/wechat/src/main/java/com/derry/wechat/abllib/callback/GestureCallBack.java new file mode 100644 index 0000000..b2063b7 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/callback/GestureCallBack.java @@ -0,0 +1,15 @@ +package com.derry.wechat.abllib.callback; + +import android.accessibilityservice.GestureDescription; + +/** + * 2019/4/21 + * 13:20 + * Levine + * wechat 1483232332 + */ +public interface GestureCallBack { + void succ(GestureDescription gestureDescription); + + void fail(GestureDescription gestureDescription); +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/utils/AblUtil.java b/wechat/src/main/java/com/derry/wechat/abllib/utils/AblUtil.java new file mode 100644 index 0000000..b6bbf7c --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/utils/AblUtil.java @@ -0,0 +1,255 @@ +package com.derry.wechat.abllib.utils; + +import static com.blankj.utilcode.util.ActivityUtils.startActivity; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.PixelFormat; +import android.net.Uri; +import android.os.Binder; +import android.os.Build; +import android.provider.Settings; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.Toast; + +import androidx.annotation.RequiresApi; + +import com.blankj.utilcode.util.DeviceUtils; +import com.blankj.utilcode.util.LogUtils; +import com.blankj.utilcode.util.SPUtils; +import com.blankj.utilcode.util.ToastUtils; +import com.derry.wechat.WeChatConfig; +import com.derry.wechat.abllib.AblConfig; +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.weutil.WeChatDeviceUtils; +import com.derry.wechat.weutil.WeChatSPUtils; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.HttpParams; +import com.tbruyelle.rxpermissions2.RxPermissions; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +import io.reactivex.disposables.Disposable; + +/** + * 2019/4/21 + * 18:21 + * Levine + * wechat 1483232332 + * @author Administrator + * Dyx 2021-11-27 + */ +public class AblUtil { + + /*** + * 检查悬浮窗开启权限 + * @param context + * @return + */ + @SuppressLint("ObsoleteSdkInt") + public static boolean checkFloatPermission(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { + return true; + } + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + try { + Class cls = Class.forName("android.content.Context"); + Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE"); + declaredField.setAccessible(true); + Object obj = declaredField.get(cls); + if (!(obj instanceof String)) { + return false; + } + String str2 = (String) obj; + obj = cls.getMethod("getSystemService", String.class).invoke(context, str2); + cls = Class.forName("android.app.AppOpsManager"); + Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED"); + declaredField2.setAccessible(true); + Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class); + int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName()); + return result == declaredField2.getInt(cls); + } catch (Exception e) { + return false; + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + if (appOpsMgr == null) { + return false; + } + int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context.getPackageName()); + return Settings.canDrawOverlays(context) || mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED; + } else { + return Settings.canDrawOverlays(context); + } + } + } + + /** + * 添加悬浮界面 + * + * @param context + * @param view + */ + @SuppressLint("ObsoleteSdkInt") + public static void addSuspensionWindowView(Context context, View view) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (Settings.canDrawOverlays(context)) { + addSuspensionView(context, view); + } else { + ToastUtils.showShort("请先开启允许显示在其他应用上权限"); + } + } else { + addSuspensionView(context, view); + } + } + + public static void removeSuspensionWindowView(Context context, View view) { + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + windowManager.removeView(view); + } + + /** + * 添加悬浮界面 + * + * @param context + * @param view + */ + private static void addSuspensionView(Context context, View view) { + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; + } else { + layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE; + } + layoutParams.format = PixelFormat.TRANSLUCENT; + //支持透明 +// layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;// 焦点 + layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; + //窗口的宽和高 + layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT; + layoutParams.x = 0; + //窗口位置的偏移量 + layoutParams.y = 0; + layoutParams.gravity = Gravity.LEFT|Gravity.TOP; + windowManager.addView(view, layoutParams); + //添加窗口 + } + + /** + * 打开悬浮窗授权界面 + * + * @param context + */ + @RequiresApi(api = Build.VERSION_CODES.M) + public static void openDrawOverlaysAnth(Context context) { + Intent intent = new Intent( + Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + context.getPackageName()) + ); + context.startActivity(intent); + } + + /** + * 检查是否是需要监听的APP包名 + * + * @param thisPackageName APP包名 + * @return + */ + public static boolean checkPackageName(String thisPackageName) { + if (AblConfig.sMonitoringPackageNames != null && AblConfig.sMonitoringPackageNames.length > 0) { + for (String packageName : AblConfig.sMonitoringPackageNames) { + if (packageName.contentEquals(thisPackageName)) { + return true; + } + } + return false; + } + return true; + } + + /** + * 打开无障碍服务设置 + */ + public static void openAccessibilitySettings() { + Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); + startActivity(intent); + } + + /** + * 辅助服务是否开启 + * + * @return + */ + public static boolean isAccessibilityServiceOpen(Context context) { + ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + List services = am.getRunningServices(Short.MAX_VALUE); + for (ActivityManager.RunningServiceInfo info : services) { + LogUtils.v(info.service.getClassName()); + if (info.service.getClassName().equals(AblService.class.getName())) { + return true; + } + } + return false; + } + public static void getPermissions(Context context) { + + + RxPermissions rxPermissions = new RxPermissions((Activity) context); + rxPermissions.request(Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE) + .subscribe(new io.reactivex.Observer() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onNext(Boolean aBoolean) { + if (aBoolean) { + String device_id = (String) WeChatSPUtils.getSp(context, WeChatConfig.KEY_DEVICE_ID, ""); + Log.e("设备imei为sp:", device_id);//小米8==548ec01ca14763927b10defb19371f81 + if(device_id.equals("")) { + String imei = WeChatDeviceUtils.getIMEI(context); + try { + String s = WeChatDeviceUtils.toMD5(imei); + Log.e("设备imei为:", s);//小米8==548ec01ca14763927b10defb19371f81 + //红米7a==7228bdb66fed66c60d961e30a9dc06d3 + WeChatSPUtils.setSP(context, WeChatConfig.KEY_DEVICE_ID, s); + OkGo.getInstance().addCommonParams(new HttpParams("device_id", s)); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + } + //红米7a==865367043276309 + } else { + Toast.makeText(context, "获取权限失败,请重新授权",Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onComplete() { + + } + }); + } + + +} diff --git a/wechat/src/main/java/com/derry/wechat/abllib/utils/AblViewUtil.java b/wechat/src/main/java/com/derry/wechat/abllib/utils/AblViewUtil.java new file mode 100644 index 0000000..7238131 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/abllib/utils/AblViewUtil.java @@ -0,0 +1,603 @@ +package com.derry.wechat.abllib.utils; + +import static com.derry.wechat.Activity.W_MainActivity.APP_PACKAGE_NAME; + +import android.accessibilityservice.AccessibilityService; +import android.accessibilityservice.GestureDescription; +import android.annotation.TargetApi; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.Path; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Build; +import android.util.Log; +import android.view.accessibility.AccessibilityNodeInfo; + +import androidx.annotation.Nullable; + +import com.blankj.utilcode.util.ScreenUtils; +import com.derry.wechat.Activity.W_MainActivity; +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.abllib.callback.AniCallBack; +import com.derry.wechat.abllib.callback.AnisCallBack; +import com.derry.wechat.abllib.callback.GestureCallBack; + + +import java.util.ArrayList; +import java.util.List; + +/** + * 界面操作工具类 + * wechat 1483232332 + * @author Administrator + * DYX 2021-12-2 + */ +public class AblViewUtil { + /** + * 根据id获取view + * + * @param parent + * @param id 界面id + * @param position + * @return + */ + public static AccessibilityNodeInfo findById( + AccessibilityNodeInfo parent, + String id, + int position, + @Nullable AniCallBack callBack + ) { + if (parent != null) { + List accessibilityNodeInfos = + parent.findAccessibilityNodeInfosByViewId(id); + if (accessibilityNodeInfos != null && + !accessibilityNodeInfos.isEmpty() && + position < accessibilityNodeInfos.size()) { + if (callBack != null) { + callBack.succ(accessibilityNodeInfos.get(position)); + } + return accessibilityNodeInfos.get(position); + } + } + if (callBack != null) { + callBack.fail(); + } + return null; + } + + public static AccessibilityNodeInfo findById( + AccessibilityNodeInfo parent, + String id, + int position + ) { + return findById(parent, id, position, null); + } + + public static AccessibilityNodeInfo findById(String id, int position) { + return findById(AblService.getInstance().getRootInActiveWindow(), id, position, null); + } + + public static AccessibilityNodeInfo findById(String id, int position, AniCallBack callBack) { + return findById(AblService.getInstance().getRootInActiveWindow(), id, position, callBack); + } + + public static List findById( + AccessibilityNodeInfo parent, + String id, + @Nullable AnisCallBack anisCallBack + ) { + if (parent != null) { + List accessibilityNodeInfos = + parent.findAccessibilityNodeInfosByViewId(id); + if (accessibilityNodeInfos != null && + !accessibilityNodeInfos.isEmpty()) { + if (anisCallBack != null) { + anisCallBack.succ(accessibilityNodeInfos); + } + return accessibilityNodeInfos; + } + } + if (anisCallBack != null) { + anisCallBack.fail(); + } + return new ArrayList<>(); + } + + public static List findById( + AccessibilityNodeInfo parent, + String id + ) { + return findById(parent, id, null); + } + + public static List findById(String id) { + return findById(AblService.getInstance().getRootInActiveWindow(), id, null); + } + + public static List findById(String id, AnisCallBack anisCallBack) { + return findById(AblService.getInstance().getRootInActiveWindow(), id, anisCallBack); + } + + /** + * 根据文本获取view + * + * @param parent + * @param text + * @param position + * @return + */ + public static AccessibilityNodeInfo findByText(AccessibilityNodeInfo parent, String text, int position) { + if (parent != null) { + List accessibilityNodeInfos = + parent.findAccessibilityNodeInfosByText(text); + if (accessibilityNodeInfos != null && + !accessibilityNodeInfos.isEmpty() && + position < accessibilityNodeInfos.size()) { + return accessibilityNodeInfos.get(position); + } + } + return null; + } + + public static AccessibilityNodeInfo findByText(String text, int position) { + return findByText(AblService.getInstance().getRootInActiveWindow(), text, position); + } + + public static List findByText(AccessibilityNodeInfo parent, String text) { + if (parent != null) { + List accessibilityNodeInfos = + parent.findAccessibilityNodeInfosByText(text); + if (accessibilityNodeInfos != null && + !accessibilityNodeInfos.isEmpty()) { + return accessibilityNodeInfos; + } + } + return new ArrayList<>(); + } + + public static List findByText(String text) { + return findByText(AblService.getInstance().getRootInActiveWindow(), text); + } + + /** + * 手势模拟 + * + * @param start_position 开始位置,长度为2的数组,下标0为x轴,下标1为y轴 + * @param end_position + * @param startTime 开始间隔时间 + * @param duration 持续时间 + * @param callback 回调 + */ + @TargetApi(Build.VERSION_CODES.N) + public static void dispatch_gesture( + float[] start_position, + float[] end_position, + long startTime, + long duration, + @Nullable GestureCallBack callback + ) { + Path path = new Path(); + path.moveTo(start_position[0], start_position[1]); + path.lineTo(end_position[0], end_position[1]); + GestureDescription.Builder builder = new GestureDescription.Builder(); + GestureDescription.StrokeDescription strokeDescription = + new GestureDescription.StrokeDescription(path, startTime, duration); + GestureDescription gestureDescription = builder.addStroke(strokeDescription).build(); + AblService.getInstance().dispatchGesture(gestureDescription, new AccessibilityService.GestureResultCallback() { + @Override + public void onCompleted(GestureDescription gestureDescription) { + if (callback != null) { + callback.succ(gestureDescription); + } + } + + @Override + public void onCancelled(GestureDescription gestureDescription) { + if (callback != null) { + callback.fail(gestureDescription); + } + } + }, null); + } + + /** + * x轴居中竖直滑动屏幕 + * + * @param yRatio y轴份数 + * @param startSlideRatio y轴开始的份数 + * @param stopSlideRatio y轴结束的份数 + */ + public static void scrollVertical( + int yRatio, + int startSlideRatio, + int stopSlideRatio, + long startTime, + long duration, + @Nullable GestureCallBack callback + ) { + int screenHeight = ScreenUtils.getScreenHeight(); + int screenWidth = ScreenUtils.getScreenWidth(); + int start = (screenHeight / yRatio) * startSlideRatio; + int stop = (screenHeight / yRatio) * stopSlideRatio; + dispatch_gesture( + new float[]{screenWidth >> 1, start}, + new float[]{screenWidth >> 1, stop}, + startTime, + duration, + callback + ); + + } + + /** + * 竖直滑动,y轴分为20份 + * + * @param startSlideRatio 开始份数 + * @param stopSlideRatio 结束份数 + */ + public static void scrollVertical( + int startSlideRatio, + int stopSlideRatio + ) { + int screenHeight = ScreenUtils.getScreenHeight(); + int screenWidth = ScreenUtils.getScreenWidth(); + int start = (screenHeight / 20) * startSlideRatio; + int stop = (screenHeight / 20) * stopSlideRatio; + dispatch_gesture( + new float[]{screenWidth >> 1, start}, + new float[]{screenWidth >> 1, stop}, + 50, + 500, + null + ); + + } + + /** + * x轴居中竖直滑动屏幕 + * + * @param startY y轴开始位置 + * @param stopY y轴结束位置 + */ + public static void scrollVertical( + float startY, + float stopY, + long startTime, + long duration, + @Nullable GestureCallBack callback + ) { + int screenWidth = ScreenUtils.getScreenWidth(); + dispatch_gesture( + new float[]{screenWidth >> 1, startY}, + new float[]{screenWidth >> 1, stopY}, + startTime, + duration, + callback + ); + + } + + + /** + * y轴居中横向滑动 + * + * @param xRatio x轴份数 + * @param startSlideRatio x轴开始滑动份数 + * @param stopSlideRatio x轴结束滑动份数 + * @param startTime 开始延迟时间 + * @param duration 滑动持续时间 + * @param callback 回调 + */ + public void scrollHorizontal( + int xRatio, + int startSlideRatio, + int stopSlideRatio, + long startTime, + long duration, + @Nullable GestureCallBack callback + ) { + int screenHeight = ScreenUtils.getScreenHeight(); + int screenWidth = ScreenUtils.getScreenWidth(); + int start = (screenWidth / xRatio) * startSlideRatio; + int stop = (screenWidth / xRatio) * stopSlideRatio; + dispatch_gesture( + new float[]{start, screenHeight >> 1}, + new float[]{stop, screenHeight >> 1}, + startTime, + duration, + callback + ); + } + + /** + * y轴居中横向滑动 + * + * @param startX x轴开始位置 + * @param stopX x轴结束位置 + * @param startTime 开始延迟时间 + * @param duration 滑动持续时间 + * @param callback 回调 + */ + public void scrollHorizontal( + int startX, + int stopX, + long startTime, + long duration, + @Nullable GestureCallBack callback + ) { + int screenHeight = ScreenUtils.getScreenHeight(); + dispatch_gesture( + new float[]{startX, screenHeight >> 1}, + new float[]{stopX, screenHeight >> 1}, + startTime, + duration, + callback + ); + } + + /** + * 点击屏幕 + * + * @param ratio 屏幕长宽份数 + * @param xRatio 屏幕宽ratio份的比例 + * @param yRatio + */ + public static void clickScreen( + int ratio, + int xRatio, + int yRatio, + @Nullable GestureCallBack callback + ) { + int screenHeight = ScreenUtils.getScreenHeight(); + int screenWidth = ScreenUtils.getScreenWidth(); + int y = (screenHeight / ratio) * yRatio; + int x = (screenWidth / ratio) * xRatio; + dispatch_gesture( + new float[]{x, y}, + new float[]{x, y}, + 100, + 50, + callback + ); + } + + /** + * 点击屏幕 + */ + public static void clickScreen( + int xRatio, + int yRatio + ) { + int screenHeight = ScreenUtils.getScreenHeight(); + int screenWidth = ScreenUtils.getScreenWidth(); + int y = (screenHeight / 20) * yRatio; + int x = (screenWidth / 20) * xRatio; + dispatch_gesture( + new float[]{x, y}, + new float[]{x, y}, + 100, + 50, + null + ); + } + + public static void clickScreen( + float x, + float y + ) { + dispatch_gesture( + new float[]{x, y}, + new float[]{x, y}, + 100, + 2000, + null + ); + } + + public static void clickScreen( + float x, + float y, + long duration + ) { + dispatch_gesture( + new float[]{x, y}, + new float[]{x, y}, + 100, + duration, + null + ); + } + + /** + * 点击屏幕 + * + * @param x x轴像素 + * @param y + * @param startTime 开始间隔时间 + * @param duration 持续时间 + */ + public static void clickScreen( + float x, + float y, + long startTime, + long duration, + @Nullable GestureCallBack callback + ) { + dispatch_gesture( + new float[]{x, y}, + new float[]{x, y}, + startTime, + duration, + callback + ); + } + + /** + * 返回 + */ + public static void back() { + AblService.getInstance().performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); + } + + /** + * 黏贴文本至view + * + * @param info + * @param text + */ + public static void paste(AccessibilityNodeInfo info, String text) { + ClipData clip = ClipData.newPlainText(System.currentTimeMillis() + "", text); + ClipboardManager clipboardManager = (ClipboardManager) AblService.getInstance().getSystemService(Context.CLIPBOARD_SERVICE); + assert clipboardManager != null; + clipboardManager.setPrimaryClip(clip); + ClipData abc = clipboardManager.getPrimaryClip(); + assert abc != null; + ClipData.Item item = abc.getItemAt(0); + if (info != null) { + info.performAction(AccessibilityNodeInfo.ACTION_PASTE); + } + } + + /** + * 跳过广告 + */ + public static void Skip(){ + List nodeInfoList = AblService.getInstance().getRootInActiveWindow().findAccessibilityNodeInfosByText("跳过"); + for (AccessibilityNodeInfo info : nodeInfoList) { + CharSequence charSequence = info.getText(); + if (charSequence != null) { + String msg = charSequence.toString(); + if (msg.contains("跳过")) { + info.performAction(AccessibilityNodeInfo.ACTION_CLICK); + } + } + } + } + /** + * 根据范围获和输入的文本获取节点 + */ + public static AccessibilityNodeInfo getNodeInfo(String str) { + AccessibilityNodeInfo nodeInfo = null; + List nodeInfos = AblViewUtil.findByText(str); + for (int i=0;i0&&rect.top>2000&&rect.top<=2210&&rect.bottom>0&&rect.bottom<=2210&&rect.right<1080) { + Log.e("TIAOSHI###", "----twoNode:" + child.getClassName() + ":" + child.getText() + ":" + child.getContentDescription()); + nodeZuobiao(child); + nodeInfo = child; + } + } + return nodeInfo; + } + /** + * 查看节点的坐标点 + */ + public static void nodeZuobiao(AccessibilityNodeInfo nodeinfo){ + Rect rect = new Rect(); + nodeinfo.getBoundsInScreen(rect); + Log.e("TIAOSHI###", "----显示节点的坐标:" + "(" + rect.left + "," + rect.top + ")" + "," + "(" + rect.right + "," + rect.bottom + ")"); + + } + + /** + * 判断当前页面是否包含某文本 + */ + public static boolean isContainText(String str) { + boolean flag = false; + List nodeInfos = AblViewUtil.findByText(str); + for (int i=0;i0&&rect.top>0&&rect.top<=2210&&rect.bottom>0&&rect.bottom<=2210&&rect.right<1080) { + Log.e("TIAOSHI###", "----twoNode:" + child.getClassName() + ":" + child.getText() + ":" + child.getContentDescription()); + nodeZuobiao(child); + flag = true; + } + } + return flag; + } + /** + * + * @param text + * 根据文本寻找控件节点 + */ + public static void findAndPerformActionTextView(String text) { + if (AblService.getInstance().getRootInActiveWindow() == null) { + return; + } + List node = AblService.getInstance().getRootInActiveWindow().findAccessibilityNodeInfosByText(text); + for ( int i = 0; i < node.size(); i++ ){ + AccessibilityNodeInfo nodeInfo = (AccessibilityNodeInfo) node.get(i); + if (nodeInfo != null && nodeInfo.isEnabled()){ + performViewClick(nodeInfo); + } + } + } + /** + * 模拟点击事件,如果该node不能点击,则点击父node,将点击事件一直向父级传递,直至到根node或者找到一个可以点击的node + * + * @param nodeInfo nodeInfo + */ + public static void performViewClick(AccessibilityNodeInfo nodeInfo) { + if (nodeInfo == null) { + return; + } else { + while (nodeInfo != null) { + if (nodeInfo.isClickable()) { + nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); + break; + } + nodeInfo = nodeInfo.getParent(); + } + } + } + public static void mySleep(int i) { + try { + Thread.sleep(i * 1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + //跳转页面的方法 + private void launchapp(Context context) { + //判断当前手机是否有要跳入的app + if (isAppInstalled(context)){ + //如果有根据包名跳转 + context.startActivity(context.getPackageManager().getLaunchIntentForPackage(APP_PACKAGE_NAME)); + }else{ + //如果没有,走进入系统商店找到这款APP,提示你去下载这款APP的程序 + goToMarket(context); + } + } + //这里是进入应用商店,下载指定APP的方法。 + private void goToMarket(Context context) { + Uri uri = Uri.parse("market://details?id=" + APP_PACKAGE_NAME); + Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); + try { + context.startActivity(goToMarket); + } catch (Exception e) { + e.printStackTrace(); + } + } + //这里是判断APP中是否有相应APP的方法 + private boolean isAppInstalled(Context context) { + try { + context.getPackageManager().getPackageInfo(APP_PACKAGE_NAME,0); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/wechat/src/main/java/com/derry/wechat/debug/Login_DebugActivity.java b/wechat/src/main/java/com/derry/wechat/debug/Login_DebugActivity.java index 7a5bf30..129c204 100644 --- a/wechat/src/main/java/com/derry/wechat/debug/Login_DebugActivity.java +++ b/wechat/src/main/java/com/derry/wechat/debug/Login_DebugActivity.java @@ -1,31 +1,47 @@ package com.derry.wechat.debug; -import android.content.Context; +import android.annotation.SuppressLint; +import android.content.Intent; import android.os.Build; import android.os.Bundle; +import android.provider.Settings; +import android.view.Gravity; import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; +import android.widget.Button; +import android.widget.PopupWindow; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.blankj.utilcode.util.ToastUtils; -import com.derry.wechat.TestAblStep1; -import com.levine.abllib.AblConfig; -import com.levine.abllib.AblService; -import com.levine.abllib.AblStepHandler; -import com.levine.abllib.AblSteps; -import com.levine.abllib.utils.AblUtil; - -// import com.derry.login.R; // 不对了 +import com.derry.wechat.Activity.W_MainActivity; +import com.derry.wechat.Activity.WeChatChannelActivity; +import com.derry.wechat.Activity.WeChatPlate; +import com.derry.wechat.steps.TestAblStep1; +import com.derry.wechat.abllib.AblConfig; +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.abllib.AblSteps; +import com.derry.wechat.abllib.utils.AblUtil; +import com.derry.wechat.steps.TestAblStep2; +/** + * @author Administrator + */ public class Login_DebugActivity extends AppCompatActivity { - + public static String APP_PACKAGE_NAME = "com.tencent.mm"; + private PopupWindow mPopCut; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.w_activity_debug); + //透明状态栏 + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); + AblConfig.Builder() .setMonitoringPackageNames("com.tencent.mm")//微信包 .setLogTag("DDD")//logtag,不设置默认是abllib @@ -33,80 +49,57 @@ public class Login_DebugActivity extends AppCompatActivity { .setFindViewMillisInFuture(10000)//寻找界面超时时间 .setFindViewCountDownInterval(200)//寻找界面间隔时间 .build().init(); - AblStepHandler.getInstance().initStepClass(new TestAblStep1()); - findViewById(R.id.btn_1).setOnClickListener(new View.OnClickListener() { + AblStepHandler.getInstance().initStepClass(new TestAblStep1() , new TestAblStep2()); + + AblUtil.getPermissions(Login_DebugActivity.this); + + //adb shell pm grant com.derry.wechat.debug android.permission.WRITE_SECURE_SETTINGS + Settings.Secure.putString(getContentResolver(), + Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.derry.wechat.debug/com.derry.wechat.debug.abllib.AblService"); + Settings.Secure.putString(getContentResolver(), + Settings.Secure.ACCESSIBILITY_ENABLED, "1");//1表示开启 + if (AblUtil.isAccessibilityServiceOpen(Login_DebugActivity.this)) { + // Log.e("TIAOSHI###", "无障碍服务正常"); + ToastUtils.showShort( "无障碍服务正常"); + }else { + ToastUtils.showShort( "无障碍服务异常"); + Settings.Secure.putString(getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, "com.derry.wechat.debug/com.derry.wechat.debug.abllib.AblService"); + Settings.Secure.putString(getContentResolver(), Settings.Secure.ACCESSIBILITY_ENABLED, "0");//1表示开启 + } + /** + * 底部导航栏 + */ + Button mBtnCut = findViewById(R.id.cut); + mBtnCut.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - AblUtil.openAccessibilitySettings(); - } - }); - findViewById(R.id.btn_2).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblUtil.addSuspensionWindowView(Login_DebugActivity.this,initWindowView()); - } - }); - findViewById(R.id.btn_3).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblUtil.openDrawOverlaysAnth(Login_DebugActivity.this); - } - }); - findViewById(R.id.btn_4).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (AblUtil.isAccessibilityServiceOpen(Login_DebugActivity.this)) { - AblStepHandler.getInstance().setStop(false); - AblStepHandler.sendMsg(AblSteps.STEP_1); - } else { - ToastUtils.showShort("请先开启辅助服务"); - } - } - }); - findViewById(R.id.btn_5).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblStepHandler.getInstance().setStop(true); + @SuppressLint("InflateParams") View v = getLayoutInflater().inflate(R.layout.layout_pop,null); + mPopCut = new PopupWindow(v, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT); + mPopCut.setTouchable(true); + mPopCut.setFocusable(true); + mPopCut.showAtLocation(getWindow().getDecorView(), Gravity.BOTTOM,0,0); } }); - } - private View initWindowView(){//悬浮窗 - View view = View.inflate(this, R.layout.view_test_w, null); - view.findViewById(R.id.fu_btn_1).setOnClickListener(new View.OnClickListener() { + /** + * 菜单 + */ + Button mBtnRecommend = findViewById(R.id.recommed); + mBtnRecommend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - if (AblUtil.isAccessibilityServiceOpen(Login_DebugActivity.this)) { - AblStepHandler.getInstance().setStop(false); - AblStepHandler.sendMsg(AblSteps.STEP_1); - } else { - ToastUtils.showShort("请先开启辅助服务"); - } + Intent intent = new Intent(Login_DebugActivity.this, WeChatPlate.class); + startActivity(intent); } }); - view.findViewById(R.id.fu_btn_2).setOnClickListener(new View.OnClickListener() { + Button mBtnChannel = findViewById(R.id.channel); + mBtnChannel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); - windowManager.removeView(view); + Intent intent = new Intent(Login_DebugActivity.this,WeChatChannelActivity.class); + startActivity(intent); } }); - view.findViewById(R.id.fu_btn_3).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - AblStepHandler.getInstance().setStop(true); - } - }); - view.findViewById(R.id.fu_btn_4).setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - AblService.getInstance().disableSelf(); - } - } - }); - - return view; } } diff --git a/wechat/src/main/java/com/derry/wechat/TestAblStep1.java b/wechat/src/main/java/com/derry/wechat/steps/TestAblStep1.java similarity index 93% rename from wechat/src/main/java/com/derry/wechat/TestAblStep1.java rename to wechat/src/main/java/com/derry/wechat/steps/TestAblStep1.java index 8b44fcb..9cff43e 100644 --- a/wechat/src/main/java/com/derry/wechat/TestAblStep1.java +++ b/wechat/src/main/java/com/derry/wechat/steps/TestAblStep1.java @@ -1,15 +1,16 @@ -package com.derry.wechat; +package com.derry.wechat.steps; import android.os.Message; import android.util.Log; import android.view.accessibility.AccessibilityNodeInfo; -import com.levine.abllib.AblStepBase; -import com.levine.abllib.AblStepHandler; -import com.levine.abllib.AblSteps; -import com.levine.abllib.callback.AniCallBack; -import com.levine.abllib.callback.AnisCallBack; -import com.levine.abllib.utils.AblViewUtil; + +import com.derry.wechat.abllib.AblStepBase; +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.abllib.AblSteps; +import com.derry.wechat.abllib.callback.AniCallBack; +import com.derry.wechat.abllib.callback.AnisCallBack; +import com.derry.wechat.abllib.utils.AblViewUtil; import java.util.List; @@ -106,6 +107,7 @@ public class TestAblStep1 extends AblStepBase {//微信8.0.7 AblViewUtil.scrollVertical(3,1);//滑动 AblStepHandler.sendMsg(AblSteps.STEP_4); break; + default: } } } diff --git a/wechat/src/main/java/com/derry/wechat/steps/TestAblStep2.java b/wechat/src/main/java/com/derry/wechat/steps/TestAblStep2.java new file mode 100644 index 0000000..e03e68a --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/steps/TestAblStep2.java @@ -0,0 +1,159 @@ +package com.derry.wechat.steps; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; +import android.graphics.Color; +import android.os.Message; +import android.view.accessibility.AccessibilityNodeInfo; + +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.abllib.AblStepBase; +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.abllib.AblSteps; +import com.derry.wechat.abllib.utils.AblViewUtil; +import com.derry.wechat.weutil.WeData; + + +/** + * @author Administrator + * DYX 2021-12-2 + */ +public class TestAblStep2 extends AblStepBase { + @Override + public void onStep(int step, Message msg) { + int color = WeData.getColor(863,2046); + int red = Color.red(204); + int green = Color.green(204); + int blue = Color.blue(204); + switch (step){ + case AblSteps.STEP_10: + AblViewUtil.findAndPerformActionTextView("发现"); + AblStepHandler.sendMsg(AblSteps.STEP_11); + break; + case AblSteps.STEP_11: + AblViewUtil.findAndPerformActionTextView("视频号"); + AblStepHandler.sendMsg(AblSteps.STEP_12); + break; + case AblSteps.STEP_12://点击浏览设置 + AblViewUtil.clickScreen(18,1); + AblStepHandler.sendMsg(AblSteps.STEP_13); + break; + case AblSteps.STEP_13: + AblViewUtil.findAndPerformActionTextView("我的关注"); + AblStepHandler.sendMsg(AblSteps.STEP_14); + break; + case AblSteps.STEP_14://点击关注对象 + AblViewUtil.clickScreen(4,3); + AblStepHandler.sendMsg(AblSteps.STEP_15); + break; + case AblSteps.STEP_15://点击主页视频稿件 + AblViewUtil.clickScreen(3,10); + AblStepHandler.sendMsg(AblSteps.STEP_16); + break; + case AblSteps.STEP_16://点赞 + if (color == red && color == blue && color == green ){ + AblViewUtil.clickScreen(16,18); + } + AblStepHandler.sendMsg(AblSteps.STEP_20); + break; + case AblSteps.STEP_17://判断是否在评论页面 + if (AblViewUtil.isContainText("作者")){ + AblStepHandler.sendMsg(AblSteps.STEP_22); + } else { + AblViewUtil.back(); + AblStepHandler.sendMsg(AblSteps.STEP_24); + } + break; + case AblSteps.STEP_18: + mypaste(); + AblStepHandler.sendMsg(AblSteps.STEP_23); + break; + case AblSteps.STEP_19://关闭评论页面 + AblViewUtil.clickScreen(1,6); + AblStepHandler.sendMsg(AblSteps.STEP_21); + break; + case AblSteps.STEP_20://点击评论 + AblViewUtil.clickScreen(18,18); + AblStepHandler.sendMsg(AblSteps.STEP_17); + break; + case AblSteps.STEP_21://下滑至下一个视频 + AblViewUtil.scrollVertical(15,2); + AblStepHandler.sendMsg(AblSteps.STEP_16); + break; + case AblSteps.STEP_22: + AblViewUtil.clickScreen(5,18); + AblStepHandler.sendMsg(AblSteps.STEP_18); + break; + case AblSteps.STEP_23: + AblViewUtil.clickScreen(18,12); + AblStepHandler.sendMsg(AblSteps.STEP_19); + break; + default: + } + } + + protected void mypaste(){ + AccessibilityNodeInfo rootNode = AblService.getInstance().getRootInActiveWindow(); + if (rootNode != null) { + //查找到聚焦的文本 + AccessibilityNodeInfo accessibilityNodeInfo = rootNode.findFocus(AccessibilityNodeInfo.FOCUS_INPUT); + boolean isFocuse = accessibilityNodeInfo.isFocused(); +// System.out.println("isFocuse..............................." + isFocuse); +// System.out.println("accessibilityNodeInfo.getClassName()..............................." + accessibilityNodeInfo.getClassName()); +// Bundle arguments = new Bundle(); +// arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "android"); +// accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments); + + ClipboardManager clipboard = (ClipboardManager)AblService.getInstance().getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("", myhuashu()); + clipboard.setPrimaryClip(clip); + //焦点(n是AccessibilityNodeInfo对象) + accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_FOCUS); + accessibilityNodeInfo.performAction(AccessibilityNodeInfo.ACTION_PASTE); + + + + + } + } + private String myhuashu(){ + String text = ""; + int i = (int)(1+Math.random()*(10-1+1)); + switch (i){ + case 1: + text = ".这个视频不错,有创意,我很喜欢"; + break; + case 2: + text = ".我去 没想到这个还可以这样玩"; + break; + case 3: + text = "你好 视频不错哦"; + break; + case 4: + text = "作品越来越好了 加油"; + break; + case 5: + text = "会一直关注你的哦"; + break; + case 6: + text = "来看你了,要多多走动哦"; + break; + case 7: + text = "哈哈"; + break; + case 8: + text = "点赞了"; + break; + case 9: + text = "支持"; + break; + case 10: + text = "可以可以"; + break; + + default: + } + return text; + } +} diff --git a/wechat/src/main/java/com/derry/wechat/steps/TestAblStep3.java b/wechat/src/main/java/com/derry/wechat/steps/TestAblStep3.java new file mode 100644 index 0000000..22c5ca9 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/steps/TestAblStep3.java @@ -0,0 +1,30 @@ +package com.derry.wechat.steps; + +import android.os.Message; + +import com.derry.wechat.abllib.AblService; +import com.derry.wechat.abllib.AblStepBase; +import com.derry.wechat.abllib.AblStepHandler; +import com.derry.wechat.abllib.AblSteps; +import com.derry.wechat.abllib.utils.AblViewUtil; + +/** + * @author Administrator + * dyx 2021-12-6 + */ +public class TestAblStep3 extends AblStepBase { + @Override + public void onStep(int step, Message msg) { + switch (step){ + case AblSteps.STEP_24: + if (AblViewUtil.isContainText("执行任务")){ + AblStepHandler.getInstance().setStop(true); + } else { + AblViewUtil.back(); + AblStepHandler.sendMsg(AblSteps.STEP_24); + } + break; + default: + } + } +} diff --git a/wechat/src/main/java/com/derry/wechat/weutil/WeChatDeviceUtils.java b/wechat/src/main/java/com/derry/wechat/weutil/WeChatDeviceUtils.java new file mode 100644 index 0000000..7953768 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/weutil/WeChatDeviceUtils.java @@ -0,0 +1,152 @@ +package com.derry.wechat.weutil; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Environment; +import android.provider.Settings; +import android.telephony.TelephonyManager; +import android.util.Log; + +import androidx.core.app.ActivityCompat; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Date; +import java.util.UUID; + +/** + * @author Administrator + * DYX 2021-12-3 + */ +public class WeChatDeviceUtils { + private static final String UUID_FILE_NAME = "android10biaoshi"; + private static final String TODO = null; + public static String getUniqueId(Context context){ + @SuppressLint("HardwareIds") String androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + Log.e("设备号加密前为:",androidID);//红米7==b5b6d728393424b8 小米8==48d70d2f60d2ac2b + // String id = androidID + Build.SERIAL; + String id = androidID; + try { + return toMD5(id); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return id; + } + } + + + public static String toMD5(String text) throws NoSuchAlgorithmException { + //获取摘要器 MessageDigest + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + //通过摘要器对字符串的二进制字节数组进行hash计算 + byte[] digest = messageDigest.digest(text.getBytes()); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < digest.length; i++) { + //循环每个字符 将计算结果转化为正整数; + int digestInt = digest[i] & 0xff; + //将10进制转化为较短的16进制 + String hexString = Integer.toHexString(digestInt); + //转化结果如果是个位数会省略0,因此判断并补0 + if (hexString.length() < 2) { + sb.append(0); + } + //将循环结果添加到缓冲区 + sb.append(hexString); + } + //返回整个结果 + return sb.toString(); + } + + + /** + * 适配安卓10(Q)(API29)及以上 + * + * @return + */ + public static String getIMEI(Context context) { + if (Build.VERSION.SDK_INT >= 29) { + String UUIDStr = readSD(); + if (UUIDStr == null || UUIDStr.isEmpty()) {//如果为空或者空字符串就生成UUID创建文件并写入UUID + String uuid = new Date().getTime() + "_AndroidQ_" + UUID.randomUUID().toString(); + + String s = writeSD(uuid); + return s; + } else { + return UUIDStr; + } + } else { + TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + + return TODO; + } + @SuppressLint({"MissingPermission", "HardwareIds"}) String imei = telephonyManager.getDeviceId(); + + return imei; + } + } + + /** + * 保存文件到SD卡(写入SD卡需要权限,在AndroidManifest.xml中设置android.permission.WRITE_EXTERNAL_STORAGE) + */ + public static String writeSD(String content) { + //文件输出流 + FileOutputStream out = null; + //设置文件路径 + File file = new File(Environment.getExternalStorageDirectory(), UUID_FILE_NAME); + try { + out = new FileOutputStream(file); + out.write(content.getBytes()); + return content; + } catch (Exception e) { + e.printStackTrace(); + return ""; + } finally { + try { + if (out != null) { + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + /** + * 从SD卡中读取文件(读取SD卡需要权限,在AndroidManifest.xml中设置android.permission.READ_EXTERNAL_STORAGE) + */ + public static String readSD() { + //文件输入流 + FileInputStream in = null; + //设置文件路径 + File file = new File(Environment.getExternalStorageDirectory(), UUID_FILE_NAME); + try { + in = new FileInputStream(file); + //使用缓冲来读 + byte[] buf = new byte[1024];//每1024字节读一次 + StringBuilder builder = new StringBuilder(); + while (in.read(buf) != -1) { + builder.append(new String(buf).trim()); + } + return builder.toString(); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } finally { + try { + if (in != null) { + in.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/wechat/src/main/java/com/derry/wechat/weutil/WeChatSPUtils.java b/wechat/src/main/java/com/derry/wechat/weutil/WeChatSPUtils.java new file mode 100644 index 0000000..9b58553 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/weutil/WeChatSPUtils.java @@ -0,0 +1,55 @@ +package com.derry.wechat.weutil; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * @author Administrator + * DYX 2021-12-3 + */ +public class WeChatSPUtils { + public static void setSP(Context context, String key, Object object) { + String type = object.getClass().getSimpleName(); + String packageName = context.getPackageName(); + SharedPreferences sp = context.getSharedPreferences(packageName, Context.MODE_PRIVATE); + SharedPreferences.Editor edit = sp.edit(); + if ("String".equals(type)) { + edit.putString(key, (String) object); + } else if ("Integer".equals(type)) { + edit.putInt(key, (Integer) object); + } else if ("Boolean".equals(type)) { + edit.putBoolean(key, (Boolean) object); + } else if ("Float".equals(type)) { + edit.putFloat(key, (Float) object); + } else if ("Long".equals(type)) { + edit.putLong(key, (Long) object); + } + edit.apply(); + } + + public static Object getSp(Context context, String key, Object defaultObject) { + String type = defaultObject.getClass().getSimpleName(); + String packageName = context.getPackageName(); + SharedPreferences sp = context.getSharedPreferences(packageName, Context.MODE_PRIVATE); + if ("String".equals(type)) { + return sp.getString(key, (String) defaultObject); + } else if ("Integer".equals(type)) { + return sp.getInt(key, (Integer) defaultObject); + } else if ("Boolean".equals(type)) { + return sp.getBoolean(key, (Boolean) defaultObject); + } else if ("Float".equals(type)) { + return sp.getFloat(key, (Float) defaultObject); + } else if ("Long".equals(type)) { + return sp.getLong(key, (Long) defaultObject); + } + return null; + } + + public static void cleanAllSP(Context context) { + String packageName = context.getPackageName(); + SharedPreferences sp = context.getSharedPreferences(packageName, Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.clear(); + editor.apply(); + } +} diff --git a/wechat/src/main/java/com/derry/wechat/weutil/WeData.java b/wechat/src/main/java/com/derry/wechat/weutil/WeData.java new file mode 100644 index 0000000..36ae228 --- /dev/null +++ b/wechat/src/main/java/com/derry/wechat/weutil/WeData.java @@ -0,0 +1,44 @@ +package com.derry.wechat.weutil; + +import android.graphics.Bitmap; +import android.media.Image; +import android.media.ImageReader; +import android.util.Log; + +import java.nio.ByteBuffer; + +public class WeData { + static ImageReader reader; + private static Bitmap bitmap; + + public static int getColor(int x, int y) { + if (reader == null) { + Log.d("", "getColor: reader is null"); + return -1; + } + + Image image = reader.acquireLatestImage(); + + if (image == null) { + if (bitmap == null) { + Log.d("", "getColor: image is null"); + return -1; + } + return bitmap.getPixel(x, y); + } + int width = image.getWidth(); + int height = image.getHeight(); + final Image.Plane[] planes = image.getPlanes(); + final ByteBuffer buffer = planes[0].getBuffer(); + int pixelStride = planes[0].getPixelStride(); + int rowStride = planes[0].getRowStride(); + int rowPadding = rowStride - pixelStride * width; + if (bitmap == null) { + bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888); + } + bitmap.copyPixelsFromBuffer(buffer); + image.close(); + + return bitmap.getPixel(x, y); + } +} diff --git a/wechat/src/main/res/drawable/btn_style.xml b/wechat/src/main/res/drawable/btn_style.xml new file mode 100644 index 0000000..9676e44 --- /dev/null +++ b/wechat/src/main/res/drawable/btn_style.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/wechat/src/main/res/drawable/wechat.png b/wechat/src/main/res/drawable/wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..1167df3803abd9d394a917553fe9f38dad96bf1e GIT binary patch literal 2750 zcmV;v3PJUWP)s9kQ5Tpc3a0zrkI$*W}(gEp!bO0TM4xod$1Lz=hKsvbhhc}0OA+bjC>g8z8@lRW8 zdAu*JRyQ{@goxZ9UjXiM%hXUP0Ng4`o&Y=p*aFy!$bUW;fSumE0q`s$kBxX&0swdV z!8ZUteaRDYDcN2`y|e5P*^`2es6umrI1b(}RYSO8c7cvaF_lWW@|Mq_AF(S$?* zUNNAHEb|?Jm56*;Xf^;p0G?vXd==0SGc{59rCKCwmRpJZHkDwiwOYnL1o{y|9q~PY zw^An`091ob(OS#g?@<*dn7h4dr79AN>L&(kF90vO-=TPD-f0_1rgbf3I)%RXI*?eO zwZ3aS+krEZv+r(4`7vB?i5gyNc&rj zST{k0`ntAB^VM2cPb>f%4?=xhtKXnMAMI;ht&gQk8tf#!<(9Vu09ZC+U4ZB0EOX0S z5-(6E`xls7`1hx%ER1Ai4k4V&C-gc^q@vF7WzvsvTjLvdhDA%IqR+@&L8-pv6Na5W8yPBCP2QDFH(*YMegGD! zZ2#Dzv=S_Nm<{0Rf;>L}U@?Xe2~q%Ci?NCT?r;rM`^DVgrFBVYY`KY2rwe1g>9Oky>hDG}ey%h)J{+^O3FRK!}YORckBq zPyMhOkNtom@}Je1WAI#xGSQx-|7tep$-zvjWkgaSspx7>%VaMT4OSZo63a2Be~j=Y zB1!&K&vm-aa9pQ_s4{QGIOx{4-6IibI_`)(w=!&4b;;CQk1dYfI#p)b3Dfr-Y1~oO zpE_et_&EC*rilEh>sk|ZMPf0-`U_>a`&=r2qOQUTO)-{vMr@#G@%GA0!XHABr@Rhr2`tRDc+ zF(=GLsy^D_6#zr^XH4h&TeLSRh8|t((@TDPms*qSGfMiVk?K5P(-rWadBjn#(g|{P znmap?&4OIETC0)jFMJl3N3Jg=(IT>}w@Os+mPRMUvTJ_pT60Rh_LdtHeWz~>odLT{ zvft_t;nmjY=v&(~3u&5a00Nu19ho+h4G~t*?;2ztC+8&_sU{Js_(pE}eZ4i;Bw}4V zsnj9&jqbimS@dS1>$_eJaD$2Es!%|U#bG4i(R@U&J!-7LRA{2xt95rUv4{tkvGQ$* z0F(EX%K^8Buht48mdobWrs^5^EVs-t0)|Hy8l3|_-_fNKYgYN^;41YoQU4V{%^~H) zYr28ASa5Gms(0Vn30!%(Ya!GDp2Xre^%4=_Ec`0m4yJr#)LWM;--M~ua?dSG2wP?+KP;9-wem= zWZ3tY^ygEv^@yRhjrl)xly>>qx8jHfsrh3bqz@}TIY|B>oxwP+ z&Nb1}6egNv1k92a_0xcBa9X_6PMAKE6aoY+BLiLJabhXgGhLG&t8|9+c@_rajJgp3etaIr9(S>vD!4TW6KhcP`ciz61{Jg<$%JNGy5Qv@_PQ^^V7)zaq`cOmD}M__6# zs5D{`CdvF`YiePIVH4>pWgvs!PK1-X{*63;bm_+XCuO3+(uhUKS@hPb(mgGhtk!7O00OTY6vt^*(1uF1`z8#SAw*W${x|?G=Ny2IsBJK zDtknoQ~2*0v*{+{fkrBOM4wY!J{92-v63$7G*a0k$(#n5!esuHxa-1-UJNe{L{@!o zJs6d4NNEDao%~#+l4TBvl2UMiAeJ4I4dk(2rkOij8Fh)V6X~>+_RL3oGaqzZ9@nx$ zQh91e@}HC}sKnz3CjGM!9FXF4G>0}=Jv&mn92l<~!o=~TXkzW~?ItG6DM+Pp`jgfw@W3w3R;?g&{G{)|Lpzg*9ze23&59&e__0;D{f&KP1yIG`?8k z_b4*2Qwuyu)gnO!_sUUWP9AvrLT{hs4Rq3M%A%W-0>9xnOKdy@=V1T@c-1?_fz~fkzs6QV2 z_g^4W@()MU1RW-=$o>#90lpo0d>4UO7dl+uC9JhExtD7rmdCnlpHiqXVttiBrUT&D zA7b{z@*vbcdD=yzu~+$xxL!+jdf~AfXs*OkA8O0GEv0_TqTu5XB2h!wRM04oKI^a~ zOH({N{K3QC#p3&%xr~JzU7v;S_BYlCnArz$Qzg2Jj_Tt>j`z)d*#X5Mmu1c@cTYEk6Uo{9XM?V&-6K#KtrifR~cPZ&w9E(^8S3 z%Q=%uY?NTnu?Z%+bBGNdh^4ANro2}Tc=U*1O(cHzE_Q)3bt3Yh+HiYjjE(EruF@9x z^h9q60{~3bS`KZtJrGVc+v)Z0llj)?zK_+Vx$aLmz1Is(7}EKjQZ6Oy;`DvQ-Dc^} zJq?kd=Euw=CM4IV9Hl;_wOJ|;x^@dY)ONM?zCwTj zZxYF=Pki;c=d_`fIod)rM>F3m*107a=wz!V$S#sgHfh6&4MJ z0>g%nbHPI22-PqN7`o{!*dU;xp`oFnp`oFnp`l{@4`VF_m4?cuod5s;07*qoM6N<$ Ef-i|E8UO$Q literal 0 HcmV?d00001 diff --git a/wechat/src/main/res/layout/activity_we_chat_channel.xml b/wechat/src/main/res/layout/activity_we_chat_channel.xml new file mode 100644 index 0000000..f01b863 --- /dev/null +++ b/wechat/src/main/res/layout/activity_we_chat_channel.xml @@ -0,0 +1,18 @@ + + + +