From ab0ca69ff3b331f1aee286594b0ead46c9786c5a Mon Sep 17 00:00:00 2001 From: hjw <hjw@ma.nodka.com> Date: Thu, 28 Nov 2024 11:35:29 +0000 Subject: [PATCH] 开放接口(HDMI分辨率设置、应用保活、系统截图、静默安装、静默卸载、蓝牙开关、WIFI开关、以太网开关、系统重启/关机) --- app/src/main/java/com/jwipc/nodka_reboot_under/BroadcastReceiver_Sys.java | 247 +++++++++++++++++++++++++++++++++++++++++ app/libs/classes-header.jar | 0 app/src/main/AndroidManifest.xml | 24 +++ app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java | 61 ++++++++++ app/build.gradle | 1 5 files changed, 329 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 74de442..7e429df 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,4 +40,5 @@ implementation 'com.android.support:support-v4:25.+' implementation files('libs/spirit.jar') implementation files('libs/NodkaAPI.jar') + compileOnly files('libs/classes-header.jar') } diff --git a/app/libs/classes-header.jar b/app/libs/classes-header.jar new file mode 100644 index 0000000..24ca9d6 --- /dev/null +++ b/app/libs/classes-header.jar Binary files differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bf49da0..8dc0334 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,8 +7,11 @@ <uses-sdk android:minSdkVersion="25" android:targetSdkVersion="25" /> - - + + + <uses-permission android:name="android.permission.BLUETOOTH" /> + <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> + <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> @@ -50,8 +53,21 @@ <action android:name="android.intent.action.TIME_SET" /> </intent-filter> </receiver> - - + + <receiver android:name="BroadcastReceiver_Sys"> + <intent-filter> + <action android:name="com.nodka.action.HDMI_RESOLUTION" /> + <action android:name="com.nodka.action.APP_ALIVE" /> + <action android:name="com.nodka.action.SCREEN_CAP" /> + <action android:name="com.nodka.action.PKG_INSTALL" /> + <action android:name="com.nodka.action.PKG_UNINSTALL" /> + <action android:name="com.nodka.action.BLUETOOTH" /> + <action android:name="com.nodka.action.WIFI" /> + <action android:name="com.nodka.action.ETHERNET" /> + <action android:name="com.nodka.action.POWER" /> + </intent-filter> + </receiver> + <service android:name="The_Service"></service> diff --git a/app/src/main/java/com/jwipc/nodka_reboot_under/BroadcastReceiver_Sys.java b/app/src/main/java/com/jwipc/nodka_reboot_under/BroadcastReceiver_Sys.java new file mode 100644 index 0000000..45e5037 --- /dev/null +++ b/app/src/main/java/com/jwipc/nodka_reboot_under/BroadcastReceiver_Sys.java @@ -0,0 +1,247 @@ +package com.jwipc.nodka_reboot_under; + +import android.app.ProgressDialog; +import android.bluetooth.BluetoothAdapter; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.net.EthernetManager; +import android.net.wifi.WifiManager; +import android.os.Handler; +import android.os.Looper; +import android.text.TextUtils; +import android.util.Log; +import android.view.WindowManager; + +import com.jwipc.nodka_reboot_under.utils.Utils; + +public class BroadcastReceiver_Sys extends BroadcastReceiver { + public static final String TAG = "BroadcastReceiver_Sys"; + private Utils mUtils = null; + private SharedPreferences sharedPreferences; + private Editor editor; + + private static int MAIN_RESOLUTION_COUNT = 1; + + @Override + public void onReceive(Context context, Intent intent) { + mUtils = new Utils(context); + sharedPreferences = context.getSharedPreferences(mUtils.shapre, context.MODE_PRIVATE); + editor = sharedPreferences.edit(); + String action = intent.getAction(); + if (action.equals("com.nodka.action.HDMI_RESOLUTION")) { + /** + * 设置主屏幕分辨率 + * action com.nodka.action.HDMI_RESOLUTION + * stringExtra params HDMI屏幕参数 + * + * 设置1080p60 + * adb shell am broadcast -a com.nodka.action.HDMI_RESOLUTION --es params 1920x1080@60-1920-2008-2052-2200-1080-1084-1089-1125-5 + * 设置720P60 + * adb shell am broadcast -a com.nodka.action.HDMI_RESOLUTION --es params 1280x720@60.00-1390-1430-1650-725-730-750-5 + * 设置480P60 + * adb shell am broadcast -a com.nodka.action.HDMI_RESOLUTION --es params 720x480@59.94-736-798-858-489-495-525-a + * + * 设置4k60 + * setprop persist.vendor.resolution.HDMI-A-0 3840x2160@60-3840-4016-4104-4400-2160-2168-2178-2250-5 + * setprop vendor.display.timeline 1 + * + * 设置1080p60 + * setprop persist.vendor.resolution.HDMI-A-0 1920x1080@60-1920-2008-2052-2200-1080-1084-1089-1125-5 + * setprop vendor.display.timeline 2 + * + * 设置720P60 + * setprop persist.vendor.resolution.HDMI-A-0 1280x720@60.00-1390-1430-1650-725-730-750-5 + * setprop vendor.display.timeline 3 + * + * 设置480P60 + * setprop persist.vendor.resolution.HDMI-A-0 720x480@59.94-736-798-858-489-495-525-a + * setprop vendor.display.timeline 4 + */ + String params = intent.getStringExtra("params"); + if (!TextUtils.isEmpty(params)) { + String params1 = "setprop persist.vendor.resolution.HDMI-A-0 " + params; + String params2 = "setprop vendor.display.timeline " + MAIN_RESOLUTION_COUNT++; + String result1 = mUtils.getRootCmdSilent(params1); + String result2 = mUtils.getRootCmdSilent(params2); + Log.i(TAG, "onReceive: HDMI_RESOLUTION, params1 = " + params1 + + ", params2 = " + params2 + ", result1 = " + result1 + ", result2 = " + result2); + ProgressDialog progressDialog = new ProgressDialog(context); + progressDialog.setCanceledOnTouchOutside(false); + progressDialog.setCancelable(false); + progressDialog.setMessage("设置HDMI分辨率"); + progressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + progressDialog.show(); + new Handler(Looper.getMainLooper()).postDelayed(() -> progressDialog.dismiss(), 1000); + } + } else if (action.equals("com.nodka.action.APP_ALIVE")) { + /** + * 设置保活应用(系统重启生效) + * action com.nodka.action.APP_ALIVE + * stringExtra componentName 应用包名/类名 + * + * adb shell am broadcast -a com.nodka.action.APP_ALIVE --es componentName com.nodka.screen/.MainActivity + * + * setprop persist.keep.alive.name + */ + String componentName = intent.getStringExtra("componentName"); + String params; + if (!TextUtils.isEmpty(componentName)) { + params = "setprop persist.keep.alive.name " + componentName; + } else { + params = "setprop persist.keep.alive.name \"\""; + } + String result = mUtils.getRootCmdSilent(params); + Log.i(TAG, "onReceive: APP_ALIVE, params = " + params + ", result = " + result); + } else if (action.equals("com.nodka.action.SCREEN_CAP")) { + /** + * 屏幕截图 + * action com.nodka.action.SCREEN_CAP + * stringExtra path 截图保存路径以及图片名称 + * + * adb shell am broadcast -a com.nodka.action.SCREEN_CAP --es path sdcard/screenshot.png + * + * screencap -p /sdcard/screenshot.png + */ + String path = intent.getStringExtra("path"); + if (!TextUtils.isEmpty(path)) { + String params = "screencap -p " + path; + new Handler(Looper.getMainLooper()).post(() -> { + String result = mUtils.getRootCmdSilent(params); + Log.i(TAG, "onReceive: SCREEN_CAP, params = " + params + ", result = " + result); + }); + + } + } else if (action.equals("com.nodka.action.PKG_INSTALL")) { + /** + * 静默安装 + * action com.nodka.action.PKG_INSTALL + * stringExtra path APK路径 + * + * adb shell am broadcast -a com.nodka.action.PKG_INSTALL --es path sdcard/DeviceID.apk + * + * pm install -r + */ + String path = intent.getStringExtra("path"); + if (!TextUtils.isEmpty(path)) { + String params = "pm install -r " + path; + String result = mUtils.getRootCmdSilent(params); + Log.i(TAG, "onReceive: PKG_INSTALL, params = " + params + ", result = " + result); + } + } else if (action.equals("com.nodka.action.PKG_UNINSTALL")) { + /** + * 静默卸载 + * action com.nodka.action.PKG_UNINSTALL + * stringExtra pkgName 应用包名 + * + * adb shell am broadcast -a com.nodka.action.PKG_UNINSTALL --es pkgName com.evozi.deviceid + * + * pm uninstall + */ + String pkgName = intent.getStringExtra("pkgName"); + if (!TextUtils.isEmpty(pkgName)) { + String params = "pm uninstall " + pkgName; + String result = mUtils.getRootCmdSilent(params); + Log.i(TAG, "onReceive: PKG_UNINSTALL, params = " + params + ", result = " + result); + } + } else if (action.equals("com.nodka.action.BLUETOOTH")) { + /** + * 打开关闭蓝牙 + * action com.nodka.action.BLUETOOTH + * intExtra power 0-关闭 1-开启 + * + * adb shell am broadcast -a com.nodka.action.BLUETOOTH --ei power 1 + */ + int power = intent.getIntExtra("power", -1); + if (power != -1) { + BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (power == 1) { + if (bluetoothAdapter != null && !bluetoothAdapter.isEnabled()) { + bluetoothAdapter.enable(); // 开启蓝牙 + } + } else if (power == 0) { + if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) { + bluetoothAdapter.disable(); // 关闭蓝牙 + } + } + Log.i(TAG, "onReceive: BLUETOOTH, power = " + power); + } + } else if (action.equals("com.nodka.action.WIFI")) { + /** + * 打开关闭WIFI + * action com.nodka.action.WIFI + * intExtra power 0-关闭 1-开启 + * + * adb shell am broadcast -a com.nodka.action.WIFI --ei power 1 + */ + int power = intent.getIntExtra("power", -1); + if (power != -1) { + WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + if (power == 1) { + if (wifiManager != null && !wifiManager.isWifiEnabled()) { + wifiManager.setWifiEnabled(true); // 开启 Wi-Fi + } + } else if (power == 0) { + if (wifiManager != null && wifiManager.isWifiEnabled()) { + wifiManager.setWifiEnabled(false); // 关闭 Wi-Fi + } + } + Log.i(TAG, "onReceive: WIFI, power = " + power); + } + } else if (action.equals("com.nodka.action.ETHERNET")) { + /** + * 打开关闭ETHERNET + * action com.nodka.action.ETHERNET + * stringExtra ethX eth0 eth1 此参数不指定则控制所有 + * intExtra power 0-关闭 1-开启 + * + * adb shell am broadcast -a com.nodka.action.ETHERNET --ei power 0 + * adb shell am broadcast -a com.nodka.action.ETHERNET --es ethX eth0 --ei power 0 + * adb shell am broadcast -a com.nodka.action.ETHERNET --es ethX eth1 --ei power 0 + */ + String ethX = intent.getStringExtra("ethX"); + int power = intent.getIntExtra("power", -1); + if (power != -1) { + EthernetManager mEthManager = (EthernetManager) context.getSystemService("ethernet"); + if (power == 1) { + if (!TextUtils.isEmpty(ethX)) { + mEthManager.setEthernetEnabled(ethX, true); + } else { + mEthManager.setEthernetEnabled("eth0", true); + mEthManager.setEthernetEnabled("eth1", true); + } + } else if (power == 0) { + if (!TextUtils.isEmpty(ethX)) { + mEthManager.setEthernetEnabled(ethX, false); + } else { + mEthManager.setEthernetEnabled("eth0", false); + mEthManager.setEthernetEnabled("eth1", false); + } + } + Log.i(TAG, "onReceive: ETHERNET, ethX = " + ethX + ", power = " + power); + } + } else if (action.equals("com.nodka.action.POWER")) { + /** + * 系统重启/关机 + * action com.nodka.action.POWER + * intExtra powerType 1-重启 2-关机 + * + * adb shell am broadcast -a com.nodka.action.POWER --ei powerType 1 + */ + int powerType = intent.getIntExtra("powerType", -1); + if (powerType != -1) { + String params = ""; + if (powerType == 1) { + params = "reboot"; + mUtils.getRootCmdSilent(params); + } else if (powerType == 2) { + params = "reboot -p"; + mUtils.getRootCmdSilent(params); + } + Log.i(TAG, "onReceive: POWER, params = " + params); + } + } + } +} diff --git a/app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java b/app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java index 210c117..4f07730 100644 --- a/app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java +++ b/app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java @@ -1,6 +1,7 @@ package com.jwipc.nodka_reboot_under.utils; import java.io.BufferedReader; +import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileNotFoundException; @@ -688,6 +689,66 @@ return re; } + + public String getRootCmdSilent(String cmd) { + DataOutputStream dos = null; + DataInputStream dis = null; + Process process = null; + try { + process = Runtime.getRuntime().exec("su"); + dos = new DataOutputStream(process.getOutputStream()); + dis = new DataInputStream(process.getInputStream()); + dos.write(cmd.getBytes()); + dos.flush(); + dos.close(); + process.waitFor(); + return getStrFromDataInPutStream(dis); + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + if (dos != null) { + try { + dos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (dis != null) { + try { + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (process != null) { + process.destroy(); + } + } + } + + private String getStrFromDataInPutStream(DataInputStream dos) { + if (null == dos) { + return ""; + } + int BUFFER_SIZE = 512; + byte[] buffer = new byte[BUFFER_SIZE]; + StringBuilder result = new StringBuilder(); + try { + while (true) { + int read = dos.read(buffer); + if (read > 0) { + result.append(new String(buffer, 0, read)); + } + if (read < BUFFER_SIZE) { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return result.toString(); + } public boolean isSpiritVersion() { return Build.VERSION.SDK_INT <= 25; -- Gitblit v1.6.2