开放接口(HDMI分辨率设置、应用保活、系统截图、静默安装、静默卸载、蓝牙开关、WIFI开关、以太网开关、系统重启/关机)
2 files added
3 files modified
333 ■■■■■ changed files
app/build.gradle 1 ●●●● patch | view | raw | blame | history
app/libs/classes-header.jar patch | view | raw | blame | history
app/src/main/AndroidManifest.xml 24 ●●●● patch | view | raw | blame | history
app/src/main/java/com/jwipc/nodka_reboot_under/BroadcastReceiver_Sys.java 247 ●●●●● patch | view | raw | blame | history
app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java 61 ●●●●● patch | view | raw | blame | history
app/build.gradle
....@@ -40,4 +40,5 @@
4040 implementation 'com.android.support:support-v4:25.+'
4141 implementation files('libs/spirit.jar')
4242 implementation files('libs/NodkaAPI.jar')
43
+ compileOnly files('libs/classes-header.jar')
4344 }
app/libs/classes-header.jar
Binary files differ
app/src/main/AndroidManifest.xml
....@@ -7,8 +7,11 @@
77 <uses-sdk
88 android:minSdkVersion="25"
99 android:targetSdkVersion="25" />
10
-
11
-
10
+
11
+
12
+ <uses-permission android:name="android.permission.BLUETOOTH" />
13
+ <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
14
+ <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
1215 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
1316
1417
....@@ -50,8 +53,21 @@
5053 <action android:name="android.intent.action.TIME_SET" />
5154 </intent-filter>
5255 </receiver>
53
-
54
-
56
+
57
+ <receiver android:name="BroadcastReceiver_Sys">
58
+ <intent-filter>
59
+ <action android:name="com.nodka.action.HDMI_RESOLUTION" />
60
+ <action android:name="com.nodka.action.APP_ALIVE" />
61
+ <action android:name="com.nodka.action.SCREEN_CAP" />
62
+ <action android:name="com.nodka.action.PKG_INSTALL" />
63
+ <action android:name="com.nodka.action.PKG_UNINSTALL" />
64
+ <action android:name="com.nodka.action.BLUETOOTH" />
65
+ <action android:name="com.nodka.action.WIFI" />
66
+ <action android:name="com.nodka.action.ETHERNET" />
67
+ <action android:name="com.nodka.action.POWER" />
68
+ </intent-filter>
69
+ </receiver>
70
+
5571 <service android:name="The_Service"></service>
5672
5773
app/src/main/java/com/jwipc/nodka_reboot_under/BroadcastReceiver_Sys.java
....@@ -0,0 +1,247 @@
1
+package com.jwipc.nodka_reboot_under;
2
+
3
+import android.app.ProgressDialog;
4
+import android.bluetooth.BluetoothAdapter;
5
+import android.content.BroadcastReceiver;
6
+import android.content.Context;
7
+import android.content.Intent;
8
+import android.content.SharedPreferences;
9
+import android.content.SharedPreferences.Editor;
10
+import android.net.EthernetManager;
11
+import android.net.wifi.WifiManager;
12
+import android.os.Handler;
13
+import android.os.Looper;
14
+import android.text.TextUtils;
15
+import android.util.Log;
16
+import android.view.WindowManager;
17
+
18
+import com.jwipc.nodka_reboot_under.utils.Utils;
19
+
20
+public class BroadcastReceiver_Sys extends BroadcastReceiver {
21
+ public static final String TAG = "BroadcastReceiver_Sys";
22
+ private Utils mUtils = null;
23
+ private SharedPreferences sharedPreferences;
24
+ private Editor editor;
25
+
26
+ private static int MAIN_RESOLUTION_COUNT = 1;
27
+
28
+ @Override
29
+ public void onReceive(Context context, Intent intent) {
30
+ mUtils = new Utils(context);
31
+ sharedPreferences = context.getSharedPreferences(mUtils.shapre, context.MODE_PRIVATE);
32
+ editor = sharedPreferences.edit();
33
+ String action = intent.getAction();
34
+ if (action.equals("com.nodka.action.HDMI_RESOLUTION")) {
35
+ /**
36
+ * 设置主屏幕分辨率
37
+ * action com.nodka.action.HDMI_RESOLUTION
38
+ * stringExtra params HDMI屏幕参数
39
+ *
40
+ * 设置1080p60
41
+ * adb shell am broadcast -a com.nodka.action.HDMI_RESOLUTION --es params 1920x1080@60-1920-2008-2052-2200-1080-1084-1089-1125-5
42
+ * 设置720P60
43
+ * adb shell am broadcast -a com.nodka.action.HDMI_RESOLUTION --es params 1280x720@60.00-1390-1430-1650-725-730-750-5
44
+ * 设置480P60
45
+ * adb shell am broadcast -a com.nodka.action.HDMI_RESOLUTION --es params 720x480@59.94-736-798-858-489-495-525-a
46
+ *
47
+ * 设置4k60
48
+ * setprop persist.vendor.resolution.HDMI-A-0 3840x2160@60-3840-4016-4104-4400-2160-2168-2178-2250-5
49
+ * setprop vendor.display.timeline 1
50
+ *
51
+ * 设置1080p60
52
+ * setprop persist.vendor.resolution.HDMI-A-0 1920x1080@60-1920-2008-2052-2200-1080-1084-1089-1125-5
53
+ * setprop vendor.display.timeline 2
54
+ *
55
+ * 设置720P60
56
+ * setprop persist.vendor.resolution.HDMI-A-0 1280x720@60.00-1390-1430-1650-725-730-750-5
57
+ * setprop vendor.display.timeline 3
58
+ *
59
+ * 设置480P60
60
+ * setprop persist.vendor.resolution.HDMI-A-0 720x480@59.94-736-798-858-489-495-525-a
61
+ * setprop vendor.display.timeline 4
62
+ */
63
+ String params = intent.getStringExtra("params");
64
+ if (!TextUtils.isEmpty(params)) {
65
+ String params1 = "setprop persist.vendor.resolution.HDMI-A-0 " + params;
66
+ String params2 = "setprop vendor.display.timeline " + MAIN_RESOLUTION_COUNT++;
67
+ String result1 = mUtils.getRootCmdSilent(params1);
68
+ String result2 = mUtils.getRootCmdSilent(params2);
69
+ Log.i(TAG, "onReceive: HDMI_RESOLUTION, params1 = " + params1 +
70
+ ", params2 = " + params2 + ", result1 = " + result1 + ", result2 = " + result2);
71
+ ProgressDialog progressDialog = new ProgressDialog(context);
72
+ progressDialog.setCanceledOnTouchOutside(false);
73
+ progressDialog.setCancelable(false);
74
+ progressDialog.setMessage("设置HDMI分辨率");
75
+ progressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
76
+ progressDialog.show();
77
+ new Handler(Looper.getMainLooper()).postDelayed(() -> progressDialog.dismiss(), 1000);
78
+ }
79
+ } else if (action.equals("com.nodka.action.APP_ALIVE")) {
80
+ /**
81
+ * 设置保活应用(系统重启生效)
82
+ * action com.nodka.action.APP_ALIVE
83
+ * stringExtra componentName 应用包名/类名
84
+ *
85
+ * adb shell am broadcast -a com.nodka.action.APP_ALIVE --es componentName com.nodka.screen/.MainActivity
86
+ *
87
+ * setprop persist.keep.alive.name
88
+ */
89
+ String componentName = intent.getStringExtra("componentName");
90
+ String params;
91
+ if (!TextUtils.isEmpty(componentName)) {
92
+ params = "setprop persist.keep.alive.name " + componentName;
93
+ } else {
94
+ params = "setprop persist.keep.alive.name \"\"";
95
+ }
96
+ String result = mUtils.getRootCmdSilent(params);
97
+ Log.i(TAG, "onReceive: APP_ALIVE, params = " + params + ", result = " + result);
98
+ } else if (action.equals("com.nodka.action.SCREEN_CAP")) {
99
+ /**
100
+ * 屏幕截图
101
+ * action com.nodka.action.SCREEN_CAP
102
+ * stringExtra path 截图保存路径以及图片名称
103
+ *
104
+ * adb shell am broadcast -a com.nodka.action.SCREEN_CAP --es path sdcard/screenshot.png
105
+ *
106
+ * screencap -p /sdcard/screenshot.png
107
+ */
108
+ String path = intent.getStringExtra("path");
109
+ if (!TextUtils.isEmpty(path)) {
110
+ String params = "screencap -p " + path;
111
+ new Handler(Looper.getMainLooper()).post(() -> {
112
+ String result = mUtils.getRootCmdSilent(params);
113
+ Log.i(TAG, "onReceive: SCREEN_CAP, params = " + params + ", result = " + result);
114
+ });
115
+
116
+ }
117
+ } else if (action.equals("com.nodka.action.PKG_INSTALL")) {
118
+ /**
119
+ * 静默安装
120
+ * action com.nodka.action.PKG_INSTALL
121
+ * stringExtra path APK路径
122
+ *
123
+ * adb shell am broadcast -a com.nodka.action.PKG_INSTALL --es path sdcard/DeviceID.apk
124
+ *
125
+ * pm install -r
126
+ */
127
+ String path = intent.getStringExtra("path");
128
+ if (!TextUtils.isEmpty(path)) {
129
+ String params = "pm install -r " + path;
130
+ String result = mUtils.getRootCmdSilent(params);
131
+ Log.i(TAG, "onReceive: PKG_INSTALL, params = " + params + ", result = " + result);
132
+ }
133
+ } else if (action.equals("com.nodka.action.PKG_UNINSTALL")) {
134
+ /**
135
+ * 静默卸载
136
+ * action com.nodka.action.PKG_UNINSTALL
137
+ * stringExtra pkgName 应用包名
138
+ *
139
+ * adb shell am broadcast -a com.nodka.action.PKG_UNINSTALL --es pkgName com.evozi.deviceid
140
+ *
141
+ * pm uninstall
142
+ */
143
+ String pkgName = intent.getStringExtra("pkgName");
144
+ if (!TextUtils.isEmpty(pkgName)) {
145
+ String params = "pm uninstall " + pkgName;
146
+ String result = mUtils.getRootCmdSilent(params);
147
+ Log.i(TAG, "onReceive: PKG_UNINSTALL, params = " + params + ", result = " + result);
148
+ }
149
+ } else if (action.equals("com.nodka.action.BLUETOOTH")) {
150
+ /**
151
+ * 打开关闭蓝牙
152
+ * action com.nodka.action.BLUETOOTH
153
+ * intExtra power 0-关闭 1-开启
154
+ *
155
+ * adb shell am broadcast -a com.nodka.action.BLUETOOTH --ei power 1
156
+ */
157
+ int power = intent.getIntExtra("power", -1);
158
+ if (power != -1) {
159
+ BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
160
+ if (power == 1) {
161
+ if (bluetoothAdapter != null && !bluetoothAdapter.isEnabled()) {
162
+ bluetoothAdapter.enable(); // 开启蓝牙
163
+ }
164
+ } else if (power == 0) {
165
+ if (bluetoothAdapter != null && bluetoothAdapter.isEnabled()) {
166
+ bluetoothAdapter.disable(); // 关闭蓝牙
167
+ }
168
+ }
169
+ Log.i(TAG, "onReceive: BLUETOOTH, power = " + power);
170
+ }
171
+ } else if (action.equals("com.nodka.action.WIFI")) {
172
+ /**
173
+ * 打开关闭WIFI
174
+ * action com.nodka.action.WIFI
175
+ * intExtra power 0-关闭 1-开启
176
+ *
177
+ * adb shell am broadcast -a com.nodka.action.WIFI --ei power 1
178
+ */
179
+ int power = intent.getIntExtra("power", -1);
180
+ if (power != -1) {
181
+ WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
182
+ if (power == 1) {
183
+ if (wifiManager != null && !wifiManager.isWifiEnabled()) {
184
+ wifiManager.setWifiEnabled(true); // 开启 Wi-Fi
185
+ }
186
+ } else if (power == 0) {
187
+ if (wifiManager != null && wifiManager.isWifiEnabled()) {
188
+ wifiManager.setWifiEnabled(false); // 关闭 Wi-Fi
189
+ }
190
+ }
191
+ Log.i(TAG, "onReceive: WIFI, power = " + power);
192
+ }
193
+ } else if (action.equals("com.nodka.action.ETHERNET")) {
194
+ /**
195
+ * 打开关闭ETHERNET
196
+ * action com.nodka.action.ETHERNET
197
+ * stringExtra ethX eth0 eth1 此参数不指定则控制所有
198
+ * intExtra power 0-关闭 1-开启
199
+ *
200
+ * adb shell am broadcast -a com.nodka.action.ETHERNET --ei power 0
201
+ * adb shell am broadcast -a com.nodka.action.ETHERNET --es ethX eth0 --ei power 0
202
+ * adb shell am broadcast -a com.nodka.action.ETHERNET --es ethX eth1 --ei power 0
203
+ */
204
+ String ethX = intent.getStringExtra("ethX");
205
+ int power = intent.getIntExtra("power", -1);
206
+ if (power != -1) {
207
+ EthernetManager mEthManager = (EthernetManager) context.getSystemService("ethernet");
208
+ if (power == 1) {
209
+ if (!TextUtils.isEmpty(ethX)) {
210
+ mEthManager.setEthernetEnabled(ethX, true);
211
+ } else {
212
+ mEthManager.setEthernetEnabled("eth0", true);
213
+ mEthManager.setEthernetEnabled("eth1", true);
214
+ }
215
+ } else if (power == 0) {
216
+ if (!TextUtils.isEmpty(ethX)) {
217
+ mEthManager.setEthernetEnabled(ethX, false);
218
+ } else {
219
+ mEthManager.setEthernetEnabled("eth0", false);
220
+ mEthManager.setEthernetEnabled("eth1", false);
221
+ }
222
+ }
223
+ Log.i(TAG, "onReceive: ETHERNET, ethX = " + ethX + ", power = " + power);
224
+ }
225
+ } else if (action.equals("com.nodka.action.POWER")) {
226
+ /**
227
+ * 系统重启/关机
228
+ * action com.nodka.action.POWER
229
+ * intExtra powerType 1-重启 2-关机
230
+ *
231
+ * adb shell am broadcast -a com.nodka.action.POWER --ei powerType 1
232
+ */
233
+ int powerType = intent.getIntExtra("powerType", -1);
234
+ if (powerType != -1) {
235
+ String params = "";
236
+ if (powerType == 1) {
237
+ params = "reboot";
238
+ mUtils.getRootCmdSilent(params);
239
+ } else if (powerType == 2) {
240
+ params = "reboot -p";
241
+ mUtils.getRootCmdSilent(params);
242
+ }
243
+ Log.i(TAG, "onReceive: POWER, params = " + params);
244
+ }
245
+ }
246
+ }
247
+}
app/src/main/java/com/jwipc/nodka_reboot_under/utils/Utils.java
....@@ -1,6 +1,7 @@
11 package com.jwipc.nodka_reboot_under.utils;
22
33 import java.io.BufferedReader;
4
+import java.io.DataInputStream;
45 import java.io.DataOutputStream;
56 import java.io.File;
67 import java.io.FileNotFoundException;
....@@ -688,6 +689,66 @@
688689
689690 return re;
690691 }
692
+
693
+ public String getRootCmdSilent(String cmd) {
694
+ DataOutputStream dos = null;
695
+ DataInputStream dis = null;
696
+ Process process = null;
697
+ try {
698
+ process = Runtime.getRuntime().exec("su");
699
+ dos = new DataOutputStream(process.getOutputStream());
700
+ dis = new DataInputStream(process.getInputStream());
701
+ dos.write(cmd.getBytes());
702
+ dos.flush();
703
+ dos.close();
704
+ process.waitFor();
705
+ return getStrFromDataInPutStream(dis);
706
+ } catch (Exception e) {
707
+ e.printStackTrace();
708
+ return null;
709
+ } finally {
710
+ if (dos != null) {
711
+ try {
712
+ dos.close();
713
+ } catch (IOException e) {
714
+ e.printStackTrace();
715
+ }
716
+ }
717
+ if (dis != null) {
718
+ try {
719
+ dis.close();
720
+ } catch (IOException e) {
721
+ e.printStackTrace();
722
+ }
723
+ }
724
+ if (process != null) {
725
+ process.destroy();
726
+ }
727
+ }
728
+ }
729
+
730
+ private String getStrFromDataInPutStream(DataInputStream dos) {
731
+ if (null == dos) {
732
+ return "";
733
+ }
734
+ int BUFFER_SIZE = 512;
735
+ byte[] buffer = new byte[BUFFER_SIZE];
736
+ StringBuilder result = new StringBuilder();
737
+ try {
738
+ while (true) {
739
+ int read = dos.read(buffer);
740
+ if (read > 0) {
741
+ result.append(new String(buffer, 0, read));
742
+ }
743
+ if (read < BUFFER_SIZE) {
744
+ break;
745
+ }
746
+ }
747
+ } catch (Exception e) {
748
+ e.printStackTrace();
749
+ }
750
+ return result.toString();
751
+ }
691752
692753 public boolean isSpiritVersion() {
693754 return Build.VERSION.SDK_INT <= 25;