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 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 getServiceNameCandidates() { List 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 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; } } }