package com.nodka.zysjtest;
|
|
import android.app.ZysjSystemManager;
|
import android.content.Context;
|
|
import java.io.File;
|
import java.lang.reflect.Field;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
|
public class SystemActivity extends BaseTestActivity {
|
private static final String SERVICE_NOT_FOUND_MESSAGE = "未获取到 ZysjSystemManager 系统服务";
|
|
private ZysjSystemManager zysjSystemManager;
|
|
@Override
|
protected String getPageTitle() {
|
return "系统控制接口测试";
|
}
|
|
@Override
|
protected List<TestItem> getTestItems() {
|
return Arrays.asList(
|
new TestItem(
|
"控制系统音量",
|
"未实现",
|
"文档和当前 KS-Interface.jar 未找到 ZysjSystemManager 音量控制接口。",
|
this::volumeNotImplemented),
|
new TestItem(
|
"控制系统重启",
|
"zYRebootSys",
|
"执行系统重启",
|
true,
|
"确定要重启系统吗?",
|
this::rebootSys),
|
new TestItem(
|
"控制系统时间",
|
"zYsetSysTime",
|
"设置系统日期和时间",
|
this::setSysTime,
|
TestItem.InputField.text(
|
"请输入 time:yyyy-MM-dd-HH-mm-ss",
|
"2024-10-30-10-14-30",
|
"time")),
|
new TestItem(
|
"控制系统定时开关机",
|
"setTimeToRtc",
|
"设置或清除定时开机/关机",
|
this::setTimeToRtc,
|
TestItem.InputField.number(
|
"请输入 cmd:1=设置关机时间,2=设置开机时间,3=清除开机和关机时间,4=清除关机时间,5=清除开机时间",
|
"1",
|
"cmd"),
|
TestItem.InputField.text(
|
"请输入 date:yyyy-MM-dd",
|
"2024-10-30",
|
"date"),
|
TestItem.InputField.text(
|
"请输入 time:HH:mm",
|
"10:14",
|
"time")),
|
new TestItem(
|
"控制系统截屏",
|
"zYShotScreen",
|
"截取当前屏幕并保存到指定路径",
|
this::shotScreen,
|
TestItem.InputField.text(
|
"请输入 picPath",
|
"/sdcard/Screenshot/",
|
"picPath"),
|
TestItem.InputField.text(
|
"请输入 fileName",
|
"test.png",
|
"fileName"),
|
TestItem.InputField.number(
|
"请输入 screenId",
|
"0",
|
"screenId")),
|
new TestItem(
|
"控制系统恢复出厂设置",
|
"zYresetSys",
|
"恢复系统出厂设置",
|
true,
|
"确定要恢复出厂设置吗?该操作可能清除数据。",
|
this::resetSys),
|
new TestItem(
|
"控制系统无线ADB开关",
|
"zYsetAdbWiress",
|
"打开或关闭无线ADB",
|
true,
|
"无线ADB",
|
false,
|
this::setAdbWireless),
|
new TestItem(
|
"控制有线ADB",
|
"zYsetAdb",
|
"enable=0 表示关闭有线ADB,enable=1 表示打开有线ADB",
|
this::setAdb,
|
TestItem.InputField.number(
|
"请输入 enable:0=关闭有线ADB,1=打开有线ADB",
|
"1",
|
"enable")),
|
new TestItem(
|
"获取API版本号",
|
"zYgetApiVersion",
|
"获取当前 API 版本号",
|
this::getApiVersion),
|
new TestItem(
|
"获取系统内核版本信息",
|
"zYgetDeviceKernelInfo",
|
"获取系统内核版本信息",
|
this::getDeviceKernelInfo),
|
new TestItem(
|
"获取CPU使用率",
|
"getCpuUsage",
|
"获取CPU使用率",
|
this::getCpuUsage),
|
new TestItem(
|
"设置软件看门狗",
|
"watchDogEnable",
|
"enabled:0=关闭,1=开启;timeOut:超时时间,单位毫秒",
|
this::watchDogEnable,
|
TestItem.InputField.number(
|
"请输入 enabled:0=关闭,1=开启",
|
"1",
|
"enabled"),
|
TestItem.InputField.number(
|
"请输入 timeOut:单位毫秒",
|
"20000",
|
"timeOut")),
|
new TestItem(
|
"软件看门狗-喂狗",
|
"watchDogFeed",
|
"重置软件看门狗的超时时间",
|
this::watchDogFeed)
|
);
|
}
|
|
private ZysjSystemManager zysjSystemManager() {
|
if (zysjSystemManager != null) {
|
return zysjSystemManager;
|
}
|
|
for (String serviceName : getServiceNameCandidates()) {
|
Object service = getSystemService(serviceName);
|
if (service instanceof ZysjSystemManager) {
|
zysjSystemManager = (ZysjSystemManager) service;
|
return zysjSystemManager;
|
}
|
}
|
|
throw new IllegalStateException(SERVICE_NOT_FOUND_MESSAGE);
|
}
|
|
private List<String> getServiceNameCandidates() {
|
List<String> candidates = new ArrayList<>();
|
addContextFieldCandidate(candidates, "ZYSJ_SYSTEM_SERVICE");
|
addContextFieldCandidate(candidates, "ZYSJ_SERVICE");
|
candidates.add("zysj_system");
|
candidates.add("zysj");
|
candidates.add("zysj_system_service");
|
return candidates;
|
}
|
|
private void addContextFieldCandidate(List<String> candidates, String fieldName) {
|
try {
|
Field field = Context.class.getField(fieldName);
|
Object value = field.get(null);
|
if (value instanceof String && !candidates.contains(value)) {
|
candidates.add((String) value);
|
}
|
} catch (NoSuchFieldException ignored) {
|
} catch (IllegalAccessException e) {
|
throw new IllegalStateException("读取 Context." + fieldName + " 失败", e);
|
}
|
}
|
|
private String volumeNotImplemented(TestItem item, String[] inputs) {
|
return "接口未实现:文档和当前 KS-Interface.jar 未找到 ZysjSystemManager 音量控制接口。";
|
}
|
|
private String rebootSys(TestItem item, String[] inputs) {
|
int ret = zysjSystemManager().zYRebootSys();
|
return "调用成功:zYRebootSys() 返回值:" + ret;
|
}
|
|
private String setSysTime(TestItem item, String[] inputs) {
|
String time = inputs.length > 0 ? inputs[0] : "";
|
boolean ret = zysjSystemManager().zYsetSysTime(time);
|
return "调用成功:zYsetSysTime(" + time + ") 返回值:" + ret;
|
}
|
|
private String setTimeToRtc(TestItem item, String[] inputs) {
|
int cmd = parseInt(inputs, 0, "cmd");
|
String date = inputs.length > 1 ? inputs[1] : "";
|
String time = inputs.length > 2 ? inputs[2] : "";
|
int ret = zysjSystemManager().setTimeToRtc(cmd, date, time);
|
return "调用成功:setTimeToRtc(" + cmd + ", " + date + ", " + time + ") 返回值:" + ret;
|
}
|
|
private String shotScreen(TestItem item, String[] inputs) {
|
String picPath = inputs.length > 0 ? inputs[0] : "";
|
String fileName = inputs.length > 1 ? inputs[1] : "";
|
int screenId = parseInt(inputs, 2, "screenId");
|
new File(picPath).mkdirs();
|
String ret = zysjSystemManager().zYShotScreen(picPath, fileName, screenId);
|
String fullPath = picPath.endsWith(File.separator) ? picPath + fileName : picPath + File.separator + fileName;
|
return "调用成功:ret=" + ret + ", path=" + fullPath;
|
}
|
|
private String resetSys(TestItem item, String[] inputs) {
|
int ret = zysjSystemManager().zYresetSys();
|
return "调用成功:zYresetSys() 返回值:" + ret;
|
}
|
|
private String setAdbWireless(TestItem item, String[] inputs) {
|
zysjSystemManager().zYsetAdbWiress(item.switchChecked);
|
return "调用完成。";
|
}
|
|
private String setAdb(TestItem item, String[] inputs) {
|
int enable = parseInt(inputs, 0, 0, 1, "enable 只能是 0 或 1");
|
zysjSystemManager().zYsetAdb(enable == 1);
|
String mode = getSystemProperty("persist.usb3.otg.mode", "");
|
return "调用成功:zYsetAdb(" + (enable == 1) + "),persist.usb3.otg.mode=" + mode;
|
}
|
|
private String getApiVersion(TestItem item, String[] inputs) {
|
return "调用成功:zYgetApiVersion() 版本号:" + zysjSystemManager().zYgetApiVersion();
|
}
|
|
private String getDeviceKernelInfo(TestItem item, String[] inputs) {
|
return "调用成功:zYgetDeviceKernelInfo() 返回值:" + zysjSystemManager().zYgetDeviceKernelInfo();
|
}
|
|
private String getCpuUsage(TestItem item, String[] inputs) {
|
return "调用成功:getCpuUsage() 返回值:" + zysjSystemManager().getCpuUsage();
|
}
|
|
private String watchDogEnable(TestItem item, String[] inputs) {
|
int enabled = parseInt(inputs, 0, 0, 1, "enabled 只能是 0 或 1");
|
int timeOut = parseInt(inputs, 1, 1, Integer.MAX_VALUE, "timeOut 必须大于 0");
|
int ret = zysjSystemManager().watchDogEnable(enabled, timeOut);
|
return "调用成功:watchDogEnable(" + enabled + ", " + timeOut + ") 返回值:" + ret;
|
}
|
|
private String watchDogFeed(TestItem item, String[] inputs) {
|
int ret = zysjSystemManager().watchDogFeed();
|
return "调用成功:watchDogFeed() 返回值:" + ret;
|
}
|
|
private int parseInt(String[] inputs, int index, String fieldName) {
|
if (index >= inputs.length) {
|
throw new IllegalArgumentException(fieldName + " 不能为空");
|
}
|
String value = inputs[index];
|
try {
|
return Integer.parseInt(value.trim());
|
} catch (NumberFormatException e) {
|
throw new IllegalArgumentException(fieldName + " 必须是整数");
|
}
|
}
|
|
private int parseInt(String[] inputs, int index, int minValue, int maxValue, String errorMessage) {
|
if (index >= inputs.length) {
|
throw new IllegalArgumentException(errorMessage);
|
}
|
try {
|
int value = Integer.parseInt(inputs[index].trim());
|
if (value < minValue || value > maxValue) {
|
throw new IllegalArgumentException(errorMessage);
|
}
|
return value;
|
} catch (NumberFormatException e) {
|
throw new IllegalArgumentException(errorMessage);
|
}
|
}
|
|
private String getSystemProperty(String key, String defaultValue) {
|
try {
|
Class<?> systemProperties = Class.forName("android.os.SystemProperties");
|
return (String) systemProperties
|
.getMethod("get", String.class, String.class)
|
.invoke(null, key, defaultValue);
|
} catch (Exception e) {
|
return defaultValue;
|
}
|
}
|
}
|