HDLSDK/app/build.gradle
@@ -7,7 +7,7 @@ defaultConfig { applicationId "com.hdl.hdlsdk" minSdk 21 minSdk 23 targetSdk 28 versionCode 1 versionName "1.0" @@ -28,6 +28,8 @@ } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') // implementation files('libs/hdlSDK_V1.0.7.jar') implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'com.google.android.material:material:1.4.0' HDLSDK/app/src/main/AndroidManifest.xml
@@ -30,6 +30,12 @@ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SourceTestActivity" android:exported="false" android:windowSoftInputMode="adjustPan|stateHidden" /> </application> </manifest> HDLSDK/app/src/main/java/com/hdl/hdlsdk/EthernetUtils.java
New file @@ -0,0 +1,63 @@ package com.hdl.hdlsdk; import android.text.TextUtils; import android.util.Log; import java.util.regex.Pattern; public class EthernetUtils { public boolean checkIPValue(String ipAddr, String gateway, String netMask, String dns1, String dns2) { boolean enable = false; Pattern pattern = Pattern.compile("(^((\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.){3}(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])$)|^(\\d|[1-2]\\d|3[0-2])$"); /*check subnet mask*/ if (isValidIpAddress(ipAddr) && isValidIpAddress(gateway) && isValidIpAddress(dns1) && (pattern.matcher(netMask).matches())) { if (TextUtils.isEmpty(dns2)) { // 为空可以不考虑 enable = true; } else { if (isValidIpAddress(dns2)) { enable = true; } else { enable = false; } } } else { enable = false; } return enable; } private boolean isValidIpAddress(String value) { int start = 0; int end = value.indexOf('.'); int numBlocks = 0; while (start < value.length()) { if (-1 == end) { end = value.length(); } try { int block = Integer.parseInt(value.substring(start, end)); if ((block > 255) || (block < 0)) { Log.w("EthernetIP", "isValidIpAddress() : invalid 'block', block = " + block); return false; } } catch (NumberFormatException e) { Log.w("EthernetIP", "isValidIpAddress() : e = " + e); return false; } numBlocks++; start = end + 1; end = value.indexOf('.', start); } return numBlocks == 4; } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/MainActivity.java
@@ -24,12 +24,15 @@ import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.listener.OnItemClickListener; import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.bean.FunctionBean; import com.hdl.hdlsdk.bean.RoomFunctionBean; import com.hdl.hdlsdk.bean.SceneBean; import com.hdl.hdlsdk.bean.SceneDetailBean; import com.hdl.hdlsdk.device.DevicesListActivity; import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.event.DeleteNetworkListener; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.AllTopicManagerUtils; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; @@ -41,7 +44,6 @@ import com.hdl.sdk.connect.bean.request.ListSidRequest; import com.hdl.sdk.connect.bean.request.ListUploadRequest; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; import com.hdl.sdk.connect.bean.response.DeviceInfoResponse; import com.hdl.sdk.connect.bean.response.GatewaySearchBean; import com.hdl.sdk.connect.bean.response.UpdateInfo; import com.hdl.sdk.connect.callback.HDLLinkCallBack; @@ -70,8 +72,13 @@ private EditText editText; boolean isOn; private EventListener allTopicsListener; private String testLightSid = "02010131D9C03D01020300010107"; private String testLightSid = "020101A19B485D02020100010101"; private String secret = ""; private List<FunctionBean> devicesList = new ArrayList<>(); private List<FunctionBean> roomDevicesList = new ArrayList<>(); private List<SceneBean> sceneList = new ArrayList<>(); private List<SceneDetailBean> sceneDetailList = new ArrayList<>(); private List<SceneDetailBean> roomSceneList = new ArrayList<>(); void applyDeviceSecret() { tv.setText("开始申请设备密钥..."); @@ -82,7 +89,7 @@ // String appSecret = "BmnJ8RWTtaVEBk24zPPF4UMwfYu0lAWU";//appsecret //测试服务器 String appKey ="FcRyUJlLJFF"; String appKey = "FcRyUJlLJFF"; String appSecret = "wz8wn75ABidx8vXcFGUotqhwFkTaYvvJ"; // String appKey = "L2OZliZRxHc"; @@ -203,28 +210,24 @@ beans.add(new DemoBean("入网认证")); beans.add(new DemoBean("搜索指定网关是否在线")); beans.add(new DemoBean("上报oid列表")); beans.add(new DemoBean("获取功能列表")); beans.add(new DemoBean("功能属性读取")); beans.add(new DemoBean("获取设备列表")); beans.add(new DemoBean("设备功能属性读取")); beans.add(new DemoBean("设备控制")); beans.add(new DemoBean("读取状态")); beans.add(new DemoBean("获取场景列表")); beans.add(new DemoBean("场景详情")); beans.add(new DemoBean("场景控制")); beans.add(new DemoBean("设备功能列表")); beans.add(new DemoBean("UDP发送")); beans.add(new DemoBean("TCP发送")); beans.add(new DemoBean("UDP发送,监听主题回复,带重发带回调")); beans.add(new DemoBean("TCP发送,监听主题回复,带重发带回调")); beans.add(new DemoBean("退网")); beans.add(new DemoBean("检测更新")); beans.add(new DemoBean("Source功能支持")); beans.add(new DemoBean("获取房间列表")); beans.add(new DemoBean("获取房间设备列表")); beans.add(new DemoBean("获取房间场景列表")); beans.add(new DemoBean("获取自动化列表")); beans.add(new DemoBean("⾃动化启⽤禁⽤")); demoAdapter = new DemoAdapter(beans); rv.setAdapter(demoAdapter); // final SocketOptions options = new SocketOptions(); // // MessagePipeLine pipeLine = new MessagePipeLine(); // options.setHandleMessage(pipeLine); // options.setEnabledHeartbeat(false); demoAdapter.setOnItemClickListener(new OnItemClickListener() { @Override @@ -247,11 +250,12 @@ UploadOidList(); break; case 4: //获取功能列表 //获取设备列表 getFunctionList(); //startDevicesListActivity(); break; case 5: //功能属性读取 //设备功能属性读取 getFunctionAttribute(); break; case 6: @@ -267,36 +271,48 @@ getSceneList(); break; case 9: //场景控制 getScene(); //场景详情 getSceneDetail(); break; case 10: //功能列表 startDevicesListActivity(); //场景控制 controlScene(); break; case 11: //UDP发送 udpSend(); break; case 12: //TCP发送 tcpSend(); break; case 13: //UDP发送,监听主题回复,带重发带回调 udpSendWithCallback(); break; case 14: case 12: //TCP发送,监听主题回复,带重发带回调 tcpSendWithCallback(); break; case 15: case 13: //退网 deleteNetwork(); break; case 14: //Source功能支持 startSourceTestActivity(); break; case 15: //获取房间列表 getRoomList(); break; case 16: //检测更新 checkAppVersion(); //获取房间设备列表 getRoomDeviceList(); break; case 17: //获取房间场景列表 getRoomSceneList(); break; case 18: //获取自动化列表 getLogicList(); break; case 19: //⾃动化启⽤禁⽤ editEnableLogic(); break; } } @@ -390,8 +406,8 @@ infoBean.setDeviceName("魔镜");//设备名字 infoBean.setDeviceModel("HDLSDK");//设备型号 infoBean.setAccessMode("WIFI"); infoBean.setIPGateway("192.168.1.1"); infoBean.setIPAddress("192.168.1.103"); infoBean.setIPGateway("192.168.31.1"); infoBean.setIPAddress("192.168.31.103"); infoBean.setGateway_type("screen.touch"); infoBean.setHw_version("HW2.0"); infoBean.setFw_version("Fw1.0"); @@ -466,8 +482,7 @@ StringBuilder hex = new StringBuilder(hash.length * 2); for (byte b : hash) { if ((b & 0xFF) < 0x10) hex.append("0"); if ((b & 0xFF) < 0x10) hex.append("0"); hex.append(Integer.toHexString(b & 0xFF)); } @@ -499,10 +514,10 @@ } /** * 获取功能列表 * 获取设备列表 */ void getFunctionList() { tv.setText("获取功能列表中..."); tv.setText("获取设备列表中..."); responseTv.setText(""); HDLLink.getInstance().getFunctionList(new HDLLinkCallBack() { @Override @@ -512,18 +527,37 @@ @Override public void onSuccess(String data) { tv.setText("获取功能列表成功"); tv.setText("获取设备列表成功"); responseTv.setText(data); handelFunctionList(data); } }); } void handelFunctionList(String data) { try { final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() { }.getType()); final BaseLocalResponse<List<FunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<FunctionBean>>>() { }.getType()); devicesList.clear(); devicesList.addAll(bean.getObjects()); Log.d(TAG, "handelFunList-----> " + devicesList.toString()); } catch (Exception e) { Log.e(TAG, "handelFunList: " + e.getMessage()); } } /** * 功能属性读取 * 设备功能属性读取 * 支持批量读取 */ void getFunctionAttribute() { tv.setText("功能属性读取"); tv.setText("设备功能属性读取"); responseTv.setText(""); List<String> sids = new ArrayList<>(); sids.add(testLightSid); @@ -606,7 +640,8 @@ @Override public void onSuccess(String msg) { responseTv.setText(msg); Log.d("panlili", "MainActivity.java:getSceneList-----> " + msg); handelSceneList(msg); } @Override @@ -616,31 +651,72 @@ }); } void handelSceneList(String data) { try { final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() { }.getType()); final BaseLocalResponse<List<SceneBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<SceneBean>>>() { }.getType()); sceneList.clear(); sceneList.addAll(bean.getObjects()); Log.d(TAG, "handelSceneList-----> " + sceneList.toString()); } catch (Exception e) { Log.e(TAG, "handelSceneList: " + e.getMessage()); } } //场景列表 // {"id":"8a5eaa143ce943b987b577df5a66759b","time_stamp":"1637040217235","objects":[{"sid":"04010560D2C7170A0A0100000000","name":"回家模式","status":"off","group":"255","delay":"0","modify_time":"1634871490"},{"sid":"04010560D2C76E0A0A0100010000","name":"离家模式","status":"off","group":"255","delay":"0","modify_time":"1634785823"}]} // {"id":"98a683eca5384f2db2ca1ed688953439","time_stamp":"1740024067320","code":"0","msg":"Success","objects":[{"sid":"0201039965BF5D0A0A0100011100","name":"场景-1","status":"off","group":"255","delay":"0","modify_time":"1735293636","local":"false"},{"sid":"030105016B84AA0A0A0100020000","name":"大厅灯开","status":"off","group":"255","delay":"0","modify_time":"1740023916","local":"false"},{"sid":"030105016D14240A0A0100030000","name":"大厅灯关","status":"off","group":"255","delay":"0","modify_time":"1740023969","local":"false"},{"sid":"020103D465BF5D0A0A0100041100","name":"场景-4","status":"off","group":"255","delay":"0","modify_time":"1735200096","local":"false"}]} /** * 获取场景详情 * 执行成功的话 响应code为200 */ void getScene() { void getSceneDetail() { tv.setText("场景读取"); responseTv.setText(""); //场景sid列表,支持批量读取 List<String> sids = new ArrayList<>(); sids.add("0201034C50B53F0A0A0100011100"); sids.add("0201037F50B53F0A0A0100021100"); HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); if (sceneList != null && sceneList.size() != 0) { List<String> sids = new ArrayList<>(); for (SceneBean s : sceneList) { sids.add(s.getSid());//遍历所有场景拿到详情信息 } HDLLink.getInstance().getScene(sids, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); handelSceneDetailList(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } else { Toast.makeText(MainActivity.this, "请先获取场景列表", Toast.LENGTH_SHORT).show(); } } void handelSceneDetailList(String data) { try { final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() { }.getType()); final BaseLocalResponse<List<SceneDetailBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<SceneDetailBean>>>() { }.getType()); sceneDetailList.clear(); sceneDetailList.addAll(bean.getObjects()); Log.d(TAG, "handelSceneDetailList-----> " + sceneDetailList.toString()); } catch (Exception e) { Log.e(TAG, "handelSceneDetailList: " + e.getMessage()); } } /** @@ -654,9 +730,9 @@ List<String> sids = new ArrayList<>(); isOn = !isOn; if (isOn) { sids.add("04010560D2C7170A0A0100000000"); sids.add("030105016D14240A0A0100030000"); } else { sids.add("04010560D2C76E0A0A0100010000"); sids.add("030105016B84AA0A0A0100020000"); } HDLLink.getInstance().controlScene(sids, new HDLLinkCallBack() { @Override @@ -671,12 +747,164 @@ }); } /** * 获取房间列表 */ void getRoomList() { tv.setText("读取房间列表"); responseTv.setText(""); HDLLink.getInstance().getRoomList(new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 获取房间设备列表 * 先获取房间绑定关系列表,通过sid和设备列表匹配筛选 */ void getRoomDeviceList() { tv.setText("获取房间设备列表"); responseTv.setText(""); //房间uid列表,支持批量读取 List<String> uid = new ArrayList<>(); uid.add("64a4fc6f-4eae-4d1d-82e4-40140c802c48"); HDLLink.getInstance().getRoomBindList(uid, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { if (!TextUtils.isEmpty(msg)) { handelRoomFunctionList(msg); } } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } void handelRoomFunctionList(String data) { try { final LinkResponse linkResponse = GsonConvert.getGson().fromJson(data, new TypeToken<LinkResponse>() { }.getType()); final BaseLocalResponse<List<RoomFunctionBean>> bean = GsonConvert.getGson().fromJson(linkResponse.getData(), new TypeToken<BaseLocalResponse<List<RoomFunctionBean>>>() { }.getType()); List<RoomFunctionBean> roomFunctionBeans = bean.getObjects(); List<RoomFunctionBean.Functions> functions = roomFunctionBeans.get(0).getFunctions(); roomDevicesList.clear(); if (devicesList != null && devicesList.size() != 0) { for (int i = 0; i < functions.size(); i++) { for (int j = 0; j < devicesList.size(); j++) { //与设备列表的数据匹配,sid对应 if (functions.get(i).getSid().equals(devicesList.get(j).getSid())) { roomDevicesList.add(devicesList.get(j)); } } } responseTv.setText(roomDevicesList.toString()); Log.d(TAG, "handelRoomFunctionList-----> " + roomDevicesList.toString()); } else { Toast.makeText(MainActivity.this, "请先获取设备列表", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Log.e(TAG, "handelRoomFunctionList: " + e.getMessage()); } } /** * 获取自动化列表 */ void getLogicList() { tv.setText("读取自动化列表"); responseTv.setText(""); HDLLink.getInstance().getLogicList(new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * ⾃动化启⽤禁⽤ */ void editEnableLogic() { tv.setText("⾃动化启⽤禁⽤"); responseTv.setText(""); String sid = "0301050041800C161501000A0000";//自动化sid boolean enable = true;//true=启⽤ false=禁⽤ HDLLink.getInstance().editEnableLogic(sid, enable, new HDLLinkCallBack() { @Override public void onSuccess(String msg) { responseTv.setText(msg); } @Override public void onError(HDLLinkException e) { responseTv.setText(e.getMsg()); } }); } /** * 获取房间场景列表(需要先拿到场景详情) */ void getRoomSceneList() { tv.setText("获取房间场景列表"); responseTv.setText(""); String uid = "64a4fc6f-4eae-4d1d-82e4-40140c802c48"; roomSceneList.clear(); if (sceneDetailList != null && sceneDetailList.size() != 0) { for (SceneDetailBean s : sceneDetailList) { List<String> roomUids = s.getUids(); if (roomUids != null && roomUids.size() != 0) { for (int i = 0; i < roomUids.size(); i++) { if (uid.equals(roomUids.get(i))) { roomSceneList.add(s); } } } } responseTv.setText(roomSceneList.toString()); Log.d(TAG, "getRoomSceneList-----> " + roomSceneList.toString()); } else { Toast.makeText(MainActivity.this, "请先获取场景列表详情", Toast.LENGTH_SHORT).show(); } } void startDevicesListActivity() { Intent intent = new Intent(this, DevicesListActivity.class); startActivity(intent); } void startSourceTestActivity() { Intent intent = new Intent(this, SourceTestActivity.class); startActivity(intent); } /** * TCP发送 只发一次,不监听回复,不重发 */ HDLSDK/app/src/main/java/com/hdl/hdlsdk/SourceTestActivity.java
New file @@ -0,0 +1,556 @@ package com.hdl.hdlsdk; import android.Manifest; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.storage.StorageManager; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.Surface; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.app.NotificationCompat; import com.hdl.sdk.sourceos.knob.OsEventListener; import com.hdl.sdk.sourceos.OsManager; import com.hdl.sdk.sourceos.knob.IQuickKnobListenerAdapter; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Timer; import java.util.TimerTask; public class SourceTestActivity extends AppCompatActivity implements View.OnClickListener { private Button btnApiVersion, btnDeviceModel, btnOsVersion, btnRunningMemory, btnInnerStorage, btnFreeStorage, btnKernelVersion, btnBuilderNumber, btnFwVersion, btnShutDown, btnReboot, btnSystemConfiginfo, btnBrightness, btnRotation, notifyOpen, notifyClose, btnOpenBackLight, btnCloseBackLight, btnStatusBarShow, btnStatusBarHide, btnMicEnable, btnEthMacAddress, btnEthIpAddress, btnScardPath, btnInner, btnInstall, btnEthernetConnect, btnSubmitStaticIp, btnSleep, btnWakeUp, btnFilterPermission, btnOta, btnNetmask, btnGateway, btnDns, btnDisconnectEth, btnConnectEth, btnWwitchDhcp; private TextView tvContent; private EditText editIpAddress, editGateway, editNetmask, editDns1, editDns2, editBrightness, editRotation; final private int LED_NOTIFICATION_ID = 100; private NotificationManager notificationManager; private String notificationId = "leds"; private String notificationName = "ledsTest"; private Timer mTimer; private static String TAG = "SourceTestActivity"; private IQuickKnobListenerAdapter knobListenerAdapter; private final int PERMISSION_REQUEST = 0xa00; private OsEventListener eventListener = new OsEventListener() { @Override public void onKeyEvent(int keyCode, int state) { try { if (KeyEvent.KEYCODE_MUTE == keyCode) { //麦克风状态变化 boolean micState = OsManager.getMicEnable(); } } catch (Exception e) { e.printStackTrace(); } } }; @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_source_test); initView(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.REBOOT, Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST); } //系统接口初始化 OsManager.init(SourceTestActivity.this); OsManager.addEventListener(eventListener); OsManager.startTof(1); startTimerTask(); //旋钮初始化 initKnob(); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case PERMISSION_REQUEST: if (grantResults != null && permissions != null) { for (int i = 0; i < grantResults.length; i++) { Log.d(TAG, "grantResults[" + i + "]:" + grantResults[i]); Log.d(TAG, "permissions[" + i + "]:" + permissions[i]); } } break; } } // 开启任务 private void startTimerTask() { mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { int data = OsManager.readTofData(); Log.d(TAG, "Tof data:" + data); } }, 500, 3000); } // 取消任务 private void cancelTask() { if (mTimer != null) { mTimer.cancel(); } } private void initView() { tvContent = findViewById(R.id.tv_content); btnApiVersion = findViewById(R.id.btn_api_version); btnDeviceModel = findViewById(R.id.btn_device_model); btnOsVersion = findViewById(R.id.btn_os_version); btnRunningMemory = findViewById(R.id.btn_running_memory); btnInnerStorage = findViewById(R.id.btn_inner_storage); btnFreeStorage = findViewById(R.id.btn_free_storage); btnKernelVersion = findViewById(R.id.btn_kernel_version); btnBuilderNumber = findViewById(R.id.btn_builder_number); btnFwVersion = findViewById(R.id.btn_fwversion); btnShutDown = findViewById(R.id.btn_shut_down); btnReboot = findViewById(R.id.btn_reboot); btnSystemConfiginfo = findViewById(R.id.btn_system_configinfo); btnBrightness = findViewById(R.id.btn_brightness); btnRotation = findViewById(R.id.btn_rotation); notifyOpen = findViewById(R.id.btn_notifyLight_open); notifyClose = findViewById(R.id.btn_notifyLight_close); btnOpenBackLight = findViewById(R.id.btn_open_back_light); btnCloseBackLight = findViewById(R.id.btn_close_back_light); btnStatusBarShow = findViewById(R.id.btn_statusBar_show); btnStatusBarHide = findViewById(R.id.btn_statusBar_hide); btnMicEnable = findViewById(R.id.btn_mic_enable); btnEthMacAddress = findViewById(R.id.btn_eth_mac_address); btnEthIpAddress = findViewById(R.id.btn_eth_ip_address); btnScardPath = findViewById(R.id.btn_sdcard); btnInner = findViewById(R.id.btn_inner); btnInstall = findViewById(R.id.btn_install); btnEthernetConnect = findViewById(R.id.btn_ethernet_connect); editRotation = findViewById(R.id.edit_rotation); editIpAddress = findViewById(R.id.edit_ip_address); editGateway = findViewById(R.id.edit_gateway);//网关 editNetmask = findViewById(R.id.edit_netmask);//掩码 editDns1 = findViewById(R.id.edit_dns1); editDns2 = findViewById(R.id.edit_dns2); btnSubmitStaticIp = findViewById(R.id.btn_submit_static_ip); btnSleep = findViewById(R.id.btn_sleep); editBrightness = findViewById(R.id.edit_brightness); btnWakeUp = findViewById(R.id.btn_wake_up); btnFilterPermission = findViewById(R.id.btn_filter_permission); btnOta = findViewById(R.id.btn_ota); btnNetmask = findViewById(R.id.btn_netmask); btnGateway = findViewById(R.id.btn_gateway); btnDns = findViewById(R.id.btn_dns); btnDisconnectEth = findViewById(R.id.btn_disconnect_eth); btnConnectEth = findViewById(R.id.btn_connect_eth); btnWwitchDhcp = findViewById(R.id.btn_switch_dhcp); btnApiVersion.setOnClickListener(this); btnDeviceModel.setOnClickListener(this); btnOsVersion.setOnClickListener(this); btnRunningMemory.setOnClickListener(this); btnInnerStorage.setOnClickListener(this); btnFreeStorage.setOnClickListener(this); btnKernelVersion.setOnClickListener(this); btnBuilderNumber.setOnClickListener(this); btnFwVersion.setOnClickListener(this); btnShutDown.setOnClickListener(this); btnReboot.setOnClickListener(this); btnSystemConfiginfo.setOnClickListener(this); btnBrightness.setOnClickListener(this); btnRotation.setOnClickListener(this); notifyOpen.setOnClickListener(this); notifyClose.setOnClickListener(this); btnOpenBackLight.setOnClickListener(this); btnCloseBackLight.setOnClickListener(this); btnStatusBarShow.setOnClickListener(this); btnStatusBarHide.setOnClickListener(this); btnMicEnable.setOnClickListener(this); btnEthMacAddress.setOnClickListener(this); btnEthIpAddress.setOnClickListener(this); btnScardPath.setOnClickListener(this); btnInner.setOnClickListener(this); btnInstall.setOnClickListener(this); btnEthernetConnect.setOnClickListener(this); btnSubmitStaticIp.setOnClickListener(this); btnSleep.setOnClickListener(this); btnWakeUp.setOnClickListener(this); btnFilterPermission.setOnClickListener(this); btnOta.setOnClickListener(this); btnNetmask.setOnClickListener(this); btnGateway.setOnClickListener(this); btnDns.setOnClickListener(this); btnDisconnectEth.setOnClickListener(this); btnConnectEth.setOnClickListener(this); btnWwitchDhcp.setOnClickListener(this); } private void initKnob() { knobListenerAdapter = new IQuickKnobListenerAdapter() { @Override public void onKnobLeftListener() { super.onKnobLeftListener(); //滑动到上一个 //scrollPre(); tvContent.setText("旋钮滑动到上一个"); } @Override public void onKnobRightListener() { super.onKnobRightListener(); //滑动到下一个 //scrollNext(); tvContent.setText("旋钮滑动到下一个"); } }; OsManager.addEventListener(knobListenerAdapter); } // 判断存储卡的路径是否可用 public static boolean getStorageState(Context context, String path) { try { StorageManager sm = (StorageManager) context.getSystemService(context.STORAGE_SERVICE); Method getVolumeStateMethod = StorageManager.class.getMethod("getVolumeState", new Class[]{String.class}); String state = (String) getVolumeStateMethod.invoke(sm, path); if (state.equals(Environment.MEDIA_MOUNTED_READ_ONLY) || state.equals(Environment.MEDIA_MOUNTED)) { return true; } return false; } catch (Exception e) { Log.e(TAG, "getStorageState() failed", e); return false; } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_api_version: String apiVersion = OsManager.getAPIVersion(); Log.e(TAG, "apiVersion :" + apiVersion); tvContent.setText(apiVersion); Toast.makeText(this, "aip版本 :" + apiVersion, Toast.LENGTH_SHORT).show(); break; case R.id.btn_device_model: String deviceModel = OsManager.getDeviceModel(); Log.e(TAG, "deviceModel :" + deviceModel); tvContent.setText(deviceModel); Toast.makeText(this, "设备model :" + deviceModel, Toast.LENGTH_SHORT).show(); break; case R.id.btn_os_version: String androidOSVersion = OsManager.getAndroidOSVersion(); Log.e(TAG, "androidOSVersion :" + androidOSVersion); tvContent.setText(androidOSVersion); Toast.makeText(this, "系统版本 :" + androidOSVersion, Toast.LENGTH_SHORT).show(); break; case R.id.btn_running_memory: String runningMemory = OsManager.getRunningMemory(); Log.e(TAG, "runningMemory :" + runningMemory); tvContent.setText(runningMemory); Toast.makeText(this, "运行内存 :" + runningMemory, Toast.LENGTH_SHORT).show(); break; case R.id.btn_inner_storage: String internalStorageMemory = OsManager.getInternalStorageMemory(); Log.e(TAG, "internalStorageMemory :" + internalStorageMemory); tvContent.setText(internalStorageMemory); Toast.makeText(this, "内部存储路径 :" + internalStorageMemory, Toast.LENGTH_SHORT).show(); break; case R.id.btn_free_storage: String internalFreeStorageMemory = OsManager.getInternalFreeStorageMemory(); Log.e(TAG, "internalFreeStorageMemory :" + internalFreeStorageMemory); tvContent.setText(internalFreeStorageMemory); Toast.makeText(this, "内部存储可用容量 :" + internalFreeStorageMemory, Toast.LENGTH_SHORT).show(); break; case R.id.btn_kernel_version: String kernelVersion = OsManager.getKernelVersion(); Log.e(TAG, "kernelVersion :" + kernelVersion); tvContent.setText(kernelVersion); Toast.makeText(this, "kernel版本信息 :" + kernelVersion, Toast.LENGTH_SHORT).show(); break; case R.id.btn_builder_number: String builderNumberDisplay = OsManager.getBuilderNumberDisplay(); Log.e(TAG, "builderNumberDisplay :" + builderNumberDisplay); tvContent.setText(builderNumberDisplay); Toast.makeText(this, "DisplayId :" + builderNumberDisplay, Toast.LENGTH_SHORT).show(); break; case R.id.btn_fwversion: String fwVersion = OsManager.getFwVersion(); Log.e(TAG, "fwVersion :" + fwVersion); tvContent.setText(fwVersion); Toast.makeText(this, "fwVersion :" + fwVersion, Toast.LENGTH_SHORT).show(); break; case R.id.btn_shut_down: OsManager.shutdown(); break; case R.id.btn_reboot: OsManager.reboot(); break; case R.id.btn_system_configinfo: String jsondata = OsManager.readSystemConfigInfo(); tvContent.setText(jsondata); break; case R.id.btn_brightness: String trim = editBrightness.getText().toString().trim(); if (!TextUtils.isEmpty(trim)) { OsManager.setBrightness(Integer.parseInt(trim)); } else { Toast.makeText(SourceTestActivity.this, "请输入亮度值", Toast.LENGTH_LONG).show(); } break; case R.id.btn_rotation: String rotation = editRotation.getText().toString().trim(); if (!TextUtils.isEmpty(rotation)) { OsManager.setRotation(rotation); } else { Toast.makeText(SourceTestActivity.this, "请输入旋转方向", Toast.LENGTH_LONG).show(); } int value = Surface.ROTATION_0; if (rotation.equals("90")) { value = Surface.ROTATION_90; } else if (rotation.equals("180")) { value = Surface.ROTATION_180; } else if (rotation.equals("270")) { value = Surface.ROTATION_270; } //Settings.System.putInt(getContentResolver(), Settings.System.USER_ROTATION, value); Toast.makeText(SourceTestActivity.this, "旋转:" + rotation, Toast.LENGTH_LONG).show(); break; case R.id.btn_notifyLight_open: // setNotificationAndForeground(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); if (notificationManager.isNotificationPolicyAccessGranted()) { Toast.makeText(SourceTestActivity.this, "通知OK:", Toast.LENGTH_LONG).show(); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(notificationId, notificationName, NotificationManager.IMPORTANCE_DEFAULT); channel.enableLights(true); channel.setLightColor(0x00ff1288); notificationManager.createNotificationChannel(channel); } Notification.Builder builder = new Notification.Builder(this).setLights(0x00ff1288, 50, 50).setDefaults(NotificationCompat.DEFAULT_LIGHTS).setSound(Uri.EMPTY).setSmallIcon(R.drawable.ic_launcher_foreground).setColor(Color.RED).setAutoCancel(true).setWhen(System.currentTimeMillis()).setContentTitle("呼吸灯通知").setContentText("已成功开启"); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { builder.setChannelId(notificationId); } notificationManager.notify(LED_NOTIFICATION_ID, builder.build()); //发送通知 break; case R.id.btn_notifyLight_close: NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(LED_NOTIFICATION_ID); //关闭通知灯 break; case R.id.btn_open_back_light: OsManager.setLcdBlackLight(true); break; case R.id.btn_close_back_light: OsManager.setLcdBlackLight(false); break; case R.id.btn_statusBar_show: Intent intent = new Intent(); intent.setAction("com.android.navigation.status"); intent.putExtra("hide", false);//auto true 为显示 ,false 为 隐藏 sendBroadcast(intent); break; case R.id.btn_statusBar_hide: Intent intent1 = new Intent(); intent1.setAction("com.android.navigation.status"); intent1.putExtra("hide", true);//auto true 为显示 ,false 为 隐藏 sendBroadcast(intent1); break; case R.id.btn_mic_enable: boolean micEnable = OsManager.getMicEnable(); Log.e(TAG, "micEnable :" + micEnable); Toast.makeText(this, "麦克风状态 :" + micEnable, Toast.LENGTH_SHORT).show(); break; case R.id.btn_eth_mac_address: String ethMacAddress = OsManager.getEthMacAddress(); Log.e(TAG, "ethMacAddress :" + ethMacAddress); tvContent.setText(ethMacAddress); Toast.makeText(this, "Mac 地址 :" + ethMacAddress, Toast.LENGTH_SHORT).show(); break; case R.id.btn_eth_ip_address: String ethIPAddress = OsManager.getEthIpAddress(); Log.e(TAG, "ethIPAddress :" + ethIPAddress); tvContent.setText(ethIPAddress); Toast.makeText(this, "以太网ip地址 :" + ethIPAddress, Toast.LENGTH_SHORT).show(); break; case R.id.btn_sdcard: // String sdcardPath = OsManager.getSdcardPath(); // Log.e(TAG, "sdcardPath :" + sdcardPath); // tvContent.setText(sdcardPath); // Toast.makeText(this, "sdcard路径 :" + sdcardPath, Toast.LENGTH_SHORT).show(); try { List<String> sdPaths = new ArrayList<>(); StorageManager sm = (StorageManager) this.getSystemService(this.STORAGE_SERVICE); Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths"); String[] paths = (String[]) getVolumePathsMethod.invoke(sm);//获取所有sd卡路径 if (paths.length >= 1) { for (int i = 1; i < paths.length; i++) { if (getStorageState(this, paths[i])) { sdPaths.add(paths[i]); } } } Toast.makeText(this, "sdcard路径 :" + sdPaths, Toast.LENGTH_SHORT).show(); // return sdPaths; } catch (Exception e) { Log.e(TAG, "getSecondaryStoragePath() failed", e); } break; case R.id.btn_inner: { // String primaryStoragePath = OsManager.getPrimaryStoragePath(); // Log.e(TAG, "primaryStoragePath :" + primaryStoragePath); // tvContent.setText(primaryStoragePath); // Toast.makeText(this, "内部存储路径 :" + primaryStoragePath, Toast.LENGTH_SHORT).show(); try { StorageManager sm = (StorageManager) this.getSystemService(this.STORAGE_SERVICE); Method getVolumePathsMethod = StorageManager.class.getMethod("getVolumePaths"); String[] paths = (String[]) getVolumePathsMethod.invoke(sm); // first element in paths[] is primary storage path // return paths[0]; Toast.makeText(this, "内部存储路径 :" + paths[0], Toast.LENGTH_SHORT).show(); } catch (Exception e) { Log.e(TAG, "getPrimaryStoragePath() failed", e); } break; } case R.id.btn_install: Intent intent3 = new Intent(); intent3.setAction("com.hdl.os.SilentInstall"); intent3.putExtra("com.hdl.os.SilentInstall.path", "/storage/emulated/0/FactoryTools.apk"); intent3.putExtra("com.hdl.os.SilentInstall.packageName", "com.hdl.factory"); intent3.putExtra("com.hdl.os.SilentInstall.activityName", "MainMobile"); sendBroadcast(intent3); break; case R.id.btn_ethernet_connect: int ethernetLinkStatus = OsManager.getEthernetLinkStatus(); Log.e(TAG, "ethernetLinkStatus :" + ethernetLinkStatus); Toast.makeText(this, "以太网连接状态 :" + ethernetLinkStatus, Toast.LENGTH_SHORT).show(); break; case R.id.btn_submit_static_ip: //设置静态ip String ipAddress = editIpAddress.getText().toString().trim(); String gateway = editGateway.getText().toString().trim(); String netmask = editNetmask.getText().toString().trim(); String dns1 = editDns1.getText().toString().trim(); String dns2 = editDns2.getText().toString().trim(); EthernetUtils ethernetUtils = new EthernetUtils(); boolean b = ethernetUtils.checkIPValue(ipAddress, gateway, netmask, dns1, dns2); if (b) { OsManager.setStaticIp(ipAddress, netmask, gateway, dns1, dns2); } break; case R.id.btn_sleep: OsManager.goToSleep("screen"); break; case R.id.btn_wake_up: OsManager.wakeUp("screen"); break; case R.id.btn_filter_permission: Log.d(TAG, "setFilterPermissionPackageName"); OsManager.setFilterPermissionPackageName("com.kugou.android"); OsManager.setFilterPermissionPackageName("com.tencent.qqmusic"); //Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0); break; case R.id.btn_ota: Intent intent2 = new Intent(); intent2.setAction("com.hdl.os.OTA"); intent2.putExtra("com.hdl.os.OTA.path", "/storage/emulated/0/rk3566-ota-115442.zip"); sendBroadcast(intent2); break; case R.id.btn_netmask: //子网掩码 String netmask1 = OsManager.getEthNetmask(); Toast.makeText(this, "子网掩码:" + netmask1, Toast.LENGTH_LONG).show(); break; case R.id.btn_gateway: //网关 String gateway1 = OsManager.getEthGateway(); Toast.makeText(this, "网关:" + gateway1, Toast.LENGTH_LONG).show(); break; case R.id.btn_dns://dns String ethDns1 = OsManager.getEthDns1(); String ethDns2 = OsManager.getEthDns1(); Toast.makeText(this, "ethDns1:" + ethDns1 + " ethDns2: " + ethDns2, Toast.LENGTH_LONG).show(); break; case R.id.btn_disconnect_eth: //断开以太网 OsManager.disconnectEthernet("eth0"); break; case R.id.btn_connect_eth: //连接以太网 OsManager.connectEthernet("eth0"); break; case R.id.btn_switch_dhcp: //切换动态ip OsManager.switchDHCP(); break; } } @Override protected void onDestroy() { super.onDestroy(); cancelTask(); OsManager.stopTof(); if (eventListener != null) { OsManager.removeEventListener(eventListener); } } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/FunctionBean.java
File was renamed from HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/FunctionBean.java @@ -1,6 +1,4 @@ package com.hdl.hdlsdk.device; import com.chad.library.adapter.base.entity.MultiItemEntity; package com.hdl.hdlsdk.bean; import java.io.Serializable; import java.util.List; @@ -103,4 +101,17 @@ } } @Override public String toString() { return "FunctionBean{" + "sid='" + sid + '\'' + ", oid='" + oid + '\'' + ", name='" + name + '\'' + ", spk='" + spk + '\'' + ", omodel='" + omodel + '\'' + ", src='" + src + '\'' + ", online='" + online + '\'' + ", status=" + status + '}'; } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/RoomFunctionBean.java
New file @@ -0,0 +1,41 @@ package com.hdl.hdlsdk.bean; import java.io.Serializable; import java.util.List; /** * Created by jlchen on 12/7/21. */ public class RoomFunctionBean implements Serializable { private String uid; private List<Functions> functions; public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public List<Functions> getFunctions() { return functions; } public void setFunctions(List<Functions> functions) { this.functions = functions; } public class Functions implements Serializable { private String sid; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneBean.java
New file @@ -0,0 +1,45 @@ package com.hdl.hdlsdk.bean; import java.io.Serializable; /** * Created by panlili on 25/2/21. */ public class SceneBean implements Serializable { private String sid; private String status; private String name; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "SceneBean{" + "sid='" + sid + '\'' + ", status='" + status + '\'' + ", name='" + name + '\'' + '}'; } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneDetailBean.java
New file @@ -0,0 +1,86 @@ package com.hdl.hdlsdk.bean; import java.io.Serializable; import java.util.List; /** * Created by panlili on 25/2/21. */ public class SceneDetailBean implements Serializable { private String sid; private String status; private String name; private List<String> uids; private String delay; private String group; private List<SceneFunctionsInfo> functions; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<String> getUids() { return uids; } public void setUids(List<String> uids) { this.uids = uids; } public String getDelay() { return delay; } public void setDelay(String delay) { this.delay = delay; } public String getGroup() { return group; } public void setGroup(String group) { this.group = group; } public List<SceneFunctionsInfo> getFunctions() { return functions; } public void setFunctions(List<SceneFunctionsInfo> functions) { this.functions = functions; } @Override public String toString() { return "SceneDetailBean{" + "sid='" + sid + '\'' + ", status='" + status + '\'' + ", name='" + name + '\'' + ", uids=" + uids + ", delay='" + delay + '\'' + ", group='" + group + '\'' + ", functions=" + functions + '}'; } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/bean/SceneFunctionsInfo.java
New file @@ -0,0 +1,75 @@ package com.hdl.hdlsdk.bean; import java.io.Serializable; import java.util.List; /** * Created by panlili on 25/2/21. */ public class SceneFunctionsInfo implements Serializable { private String sid; private List<SceneStatusInfo> status; private String delay; public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public List<SceneStatusInfo> getStatus() { return status; } public void setStatus(List<SceneStatusInfo> status) { this.status = status; } public String getDelay() { return delay; } public void setDelay(String delay) { this.delay = delay; } public class SceneStatusInfo implements Serializable { private String key; private String value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } @Override public String toString() { return "SceneStatusInfo{" + "key='" + key + '\'' + ", value='" + value + '\'' + '}'; } } @Override public String toString() { return "SceneFunctionsInfo{" + "sid='" + sid + '\'' + ", status=" + status + ", delay='" + delay + '\'' + '}'; } } HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListActivity.java
@@ -10,6 +10,7 @@ import com.google.gson.reflect.TypeToken; import com.hdl.hdlsdk.R; import com.hdl.hdlsdk.bean.FunctionBean; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; @@ -49,7 +50,7 @@ } /** * 获取功能列表 * 获取设备列表 */ void getFunctionList(){ HDLSDK/app/src/main/java/com/hdl/hdlsdk/device/DevicesListAdapter.java
@@ -12,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.hdl.hdlsdk.R; import com.hdl.hdlsdk.bean.FunctionBean; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.request.DeviceControlRequest; HDLSDK/app/src/main/res/layout/activity_source_test.xml
New file @@ -0,0 +1,508 @@ <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/tv_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_api_version" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="当前API版本" /> <Button android:id="@+id/btn_device_model" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="设备model" /> <Button android:id="@+id/btn_os_version" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="android系统版本" /> <Button android:id="@+id/btn_running_memory" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="运行内存" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_inner_storage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="内部存储空间" /> <Button android:id="@+id/btn_free_storage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="内部存储可用容量" /> <Button android:id="@+id/btn_kernel_version" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="获取当前Kernel版本" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_builder_number" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="获取设备的固件系统版本和编译日期" /> <Button android:id="@+id/btn_fwversion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="获取系统版本" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_shut_down" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="关机" /> <Button android:id="@+id/btn_reboot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="重启" /> <Button android:id="@+id/btn_system_configinfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="获取系统配置信息" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:id="@+id/edit_brightness" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:hint="取值0~255" android:inputType="number" /> <Button android:id="@+id/btn_brightness" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置屏幕亮度" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:id="@+id/edit_rotation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:hint="输入方向 0、90、180、270 " android:inputType="number" /> <Button android:id="@+id/btn_rotation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置屏幕方向" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_notifyLight_open" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="呼吸灯" /> <Button android:id="@+id/btn_notifyLight_close" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="关闭呼吸灯" /> <Button android:id="@+id/btn_open_back_light" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="打开背光" /> <Button android:id="@+id/btn_close_back_light" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="关闭背光" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_statusBar_show" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="状态栏显示" /> <Button android:id="@+id/btn_statusBar_hide" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="状态栏隐藏" /> <Button android:id="@+id/btn_mic_enable" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:text="获取麦克风状态" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_eth_mac_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="以太网 mac地址" /> <Button android:id="@+id/btn_eth_ip_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="以太网 ip地址" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_sdcard" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="sdcard 路径" /> <Button android:id="@+id/btn_inner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="内部存储 路径" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_install" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="静默安装" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_ethernet_connect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="以太网连接状态" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ip地址:" /> <EditText android:id="@+id/edit_ip_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="192.168.0.123" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="网关:" /> <EditText android:id="@+id/edit_gateway" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="192.168.0.1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="netmask:" /> <EditText android:id="@+id/edit_netmask" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="255.255.225.0" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dns1:" /> <EditText android:id="@+id/edit_dns1" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="192.168.0.1" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="dns2:" /> <EditText android:id="@+id/edit_dns2" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="0.0.0.0" /> </LinearLayout> <Button android:id="@+id/btn_submit_static_ip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="设置以太网静态IP" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_netmask" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="子网掩码" /> <Button android:id="@+id/btn_gateway" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="网关" /> <Button android:id="@+id/btn_dns" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="DNS" /> <Button android:id="@+id/btn_disconnect_eth" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="断开以太网" /> <Button android:id="@+id/btn_connect_eth" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="连接以太网" /> <Button android:id="@+id/btn_switch_dhcp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="切换DHCP" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_sleep" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="休眠" /> <Button android:id="@+id/btn_wake_up" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="唤醒" /> <Button android:id="@+id/btn_filter_permission" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="10dp" android:layout_weight="1" android:text="过滤权限" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_ota" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ota升级" /> </LinearLayout> </LinearLayout> </ScrollView> HDLSDK/hdl-connect/build.gradle
@@ -27,11 +27,12 @@ } dependencies { // implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs') api 'com.hdl.hdlhttp:hxhttp:1.0.4' api 'com.squareup.okhttp3:logging-interceptor:4.9.1' // embed(name: 'hxhttp_1.0.4_230201',ext: 'aar') api files('libs/hdlSDK_V1.0.7.jar') // embed(name: 'hdlSDK_V1.0.2',ext: 'jar') api 'com.google.code.gson:gson:2.8.8' } HDLSDK/hdl-connect/libs/hdlSDK_V1.0.7.jarBinary files differ
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/HDLSdk.java
@@ -2,21 +2,12 @@ import android.content.Context; import android.content.pm.PackageInfo; import android.text.TextUtils; import android.util.Log; import com.hdl.sdk.common.config.TopicConstant; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.common.utils.AllTopicManagerUtils; import com.hdl.sdk.common.utils.IdUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.gson.GsonConvert; import com.hdl.sdk.connect.HDLLink; import com.hdl.sdk.connect.bean.LinkResponse; import com.hdl.sdk.connect.bean.request.BroadcastRequest; import com.hdl.sdk.connect.callback.HDLLinkResponseCallBack; import com.hdl.sdk.connect.config.HDLLinkConfig; import com.hdl.sdk.connect.socket.HDLAuthSocket; import com.hdl.sdk.connect.socket.HDLSocket; @@ -34,8 +25,9 @@ */ public String getVersion() { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); String versionName = packageInfo.versionName; // 版本名称(字符串) String versionName = packageInfo.versionName; // 版本名称(字符串) return versionName; } catch (Exception e) { LogUtils.e("获取版本失败:" + e.getMessage()); @@ -90,4 +82,6 @@ public void setLogEnabled(boolean enable) { LogUtils.setEnabled(enable); } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/common/config/TopicConstant.java
@@ -139,4 +139,16 @@ public static final String GATEWAY_EDIT_REMOTE = "/user/%s/custom/gateway/remote/edit"; public static final String GATEWAY_EDIT_REMOTE_REPLY = "/user/%s/custom/gateway/remote/edit_reply"; //获取房间 public static final String ROOM_LIST_GET = "/user/%s/custom/room/list/get"; //房间绑定关系列表获取 public static final String ROOM_BIND_LIST_GET = "/user/%s/custom/room/bind/list/get"; //获取⾃动化列表 public static final String LOGIC_LIST_GET = "/user/%s/custom/logic/list/get"; //⾃动化启⽤禁⽤ public static final String EDIT_LOGIC_ENABLE = "/user/%s/custom/logic/enable/edit"; } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/HDLLink.java
@@ -4,9 +4,10 @@ import com.hdl.hdlhttp.HxHttpConfig; import com.hdl.sdk.common.event.DeleteNetworkListener; import com.hdl.sdk.common.event.EventDispatcher; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.common.utils.ThreadToolUtils; import com.hdl.sdk.connect.bean.request.DeviceAuthRequest; import com.hdl.sdk.connect.bean.request.AuthenticateRequest; import com.hdl.sdk.connect.bean.request.DeviceControlRequest; import com.hdl.sdk.connect.bean.request.ListSidRequest; import com.hdl.sdk.connect.bean.request.ListUploadRequest; @@ -19,16 +20,11 @@ import com.hdl.sdk.connect.cloud.interceptor.EncryptInterceptor; import com.hdl.sdk.connect.cloud.interceptor.SmartHeaderInterceptor; import com.hdl.sdk.connect.config.HDLLinkConfig; import com.hdl.sdk.common.event.EventDispatcher; import com.hdl.sdk.common.event.EventListener; import com.hdl.sdk.connect.bean.request.AuthenticateRequest; import com.hdl.sdk.connect.socket.HDLAuthSocket; import com.hdl.sdk.connect.socket.HDLSocket; import java.util.List; import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.disposables.Disposable; import okhttp3.logging.HttpLoggingInterceptor; /** @@ -253,14 +249,14 @@ } /** * 获取功能列表 * 获取设备列表 */ public void getFunctionList(HDLLinkCallBack callBack) { HDLSocket.getInstance().getFunctionList(callBack); } /** * 获取功能属性 * 获取设备功能属性 * * @param sids * @param callBack @@ -337,6 +333,41 @@ } /** * 获取房间列表 */ public void getRoomList(HDLLinkCallBack callBack) { HDLSocket.getInstance().getRoomList(callBack); } /** * 房间绑定关系列表获取 * * @param uid 房间uid列表 * @param callBack 回调 */ public void getRoomBindList(List<String> uid, HDLLinkCallBack callBack) { HDLSocket.getInstance().getRoomBindList(uid, callBack); } /** * 获取自动化列表 */ public void getLogicList(HDLLinkCallBack callBack) { HDLSocket.getInstance().getLogicList(callBack); } /** * ⾃动化启⽤禁⽤ * * @param sid 自动化sid * @param enable true=启⽤ false=禁⽤ * @param callBack 回调 */ public void editEnableLogic(String sid, boolean enable, HDLLinkCallBack callBack) { HDLSocket.getInstance().editEnableLogic(sid, enable, callBack); } /** * 通用UDP发送指令 * 1秒没响应就让他重新发送,重试3次 * HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/bean/request/LogicEnableRequest.java
New file @@ -0,0 +1,37 @@ package com.hdl.sdk.connect.bean.request; import java.io.Serializable; /** * Created by Tong on 2021/10/8. */ public class LogicEnableRequest implements Serializable { private String sid; private boolean enable; public LogicEnableRequest() { } public LogicEnableRequest(String sid, boolean enable) { this.sid = sid; this.enable = enable; } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } public boolean isEnable() { return enable; } public void setEnable(boolean enable) { this.enable = enable; } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/callback/HDLLinkCallBack.java
@@ -1,8 +1,5 @@ package com.hdl.sdk.connect.callback; import com.hdl.sdk.common.exception.HDLLinkException; import com.hdl.sdk.connect.bean.LinkResponse; /** * Created by jlchen on 11/16/21. * HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -28,6 +28,7 @@ import com.hdl.sdk.connect.bean.request.ListOidRequest2; import com.hdl.sdk.connect.bean.request.ListSidRequest; import com.hdl.sdk.connect.bean.request.ListUploadRequest; import com.hdl.sdk.connect.bean.request.LogicEnableRequest; import com.hdl.sdk.connect.bean.request.PropertyReadRequest; import com.hdl.sdk.connect.bean.response.BaseLocalCodeResponse; import com.hdl.sdk.connect.bean.response.BaseLocalResponse; @@ -547,7 +548,7 @@ } /** * 获取场景列表 * 获取场景详情 */ public void getScene(List<String> sids, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { @@ -1168,4 +1169,180 @@ } } /** * 获取房间列表 */ public void getRoomList(HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); String topic = String.format(TopicConstant.ROOM_LIST_GET, getGatewayId()); LinkRequest message = new LinkRequest(topic, jsonObject.toString()); String replyTopic = topic + "_reply"; try { sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() { @Override public void onSucceed() { } @Override public void onError() { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); } } } /** * 房间绑定关系列表获取 */ public void getRoomBindList(List<String> uid, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse<List<String>> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); data.setObjects(uid); String topic = String.format(TopicConstant.ROOM_BIND_LIST_GET, getGatewayId()); LinkRequest message = new LinkRequest(topic, GsonConvert.getGson().toJson(data)); String replyTopic = topic + "_reply"; try { sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() { @Override public void onSucceed() { } @Override public void onError() { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); } } } /** * 获取自动化列表 */ public void getLogicList(HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("id", IdUtils.getUUId()); jsonObject.addProperty("time_stamp", time); String topic = String.format(TopicConstant.LOGIC_LIST_GET, getGatewayId()); LinkRequest message = new LinkRequest(topic, jsonObject.toString()); String replyTopic = topic + "_reply"; try { sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() { @Override public void onSucceed() { } @Override public void onError() { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_GET_FUNCTION_LIST_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_UNAUTHORIZED_ERROR)); } } } /** * ⾃动化启⽤禁⽤ * * @param sid 自动化sid * @param enable true=启⽤ false=禁⽤ * @param callBack 回调 */ public void editEnableLogic(String sid, boolean enable, HDLLinkCallBack callBack) { if (!TextUtils.isEmpty(getGatewayId()) && !TextUtils.isEmpty(getTcpIp())) { String time = String.valueOf(System.currentTimeMillis()); final BaseLocalResponse<List<LogicEnableRequest>> data = new BaseLocalResponse<>(); data.setId(IdUtils.getUUId()); data.setTime_stamp(time); List<LogicEnableRequest> list = new ArrayList<>(); LogicEnableRequest request = new LogicEnableRequest(sid, enable); list.add(request); data.setObjects(list); String topic = String.format(TopicConstant.EDIT_LOGIC_ENABLE, getGatewayId()); LinkRequest message = new LinkRequest(topic, GsonConvert.getGson().toJson(data)); String replyTopic = topic + "_reply"; try { sendMsg(message.getSendBytes(), replyTopic, callBack, new SendListener() { @Override public void onSucceed() { } @Override public void onError() { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); } } }); } catch (Exception e) { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); } } } else { if (callBack != null) { callBack.onError(HDLLinkException.getErrorWithCode(HDLLinkCode.HDL_SEND_ERROR)); } } } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/OsManager.java
New file @@ -0,0 +1,500 @@ package com.hdl.sdk.sourceos; import android.app.HdlSystemManager; import android.content.Context; import android.content.Intent; import android.text.TextUtils; import android.util.Log; import com.hdl.sdk.sourceos.knob.OsEventListener; /** * Created by panlili on 2025/2/14 * description: */ public class OsManager { public static final String TAG = "Rk3566Manager"; public OsManager() { } public static void init(Context context) { Rk3566Manager.getInstance().init(context); Log.i(TAG, "init"); } public static void addEventListener(OsEventListener listener) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.registerEventListener(listener); } catch (Exception e) { e.printStackTrace(); } } public static void removeEventListener(OsEventListener listener) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.unregisterEventListener(listener); } catch (Exception e) { e.printStackTrace(); } } //获取当前API版本 public static String getAPIVersion() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getApiVersion(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取设备model public static String getDeviceModel() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getDeviceModel(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取android系统版本 public static String getAndroidOSVersion() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getAndroidOsVersion(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取运行内存 public static String getRunningMemory() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getRunningMemory(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取内部存储空间 public static String getInternalStorageMemory() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getInternalStorageMemory(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取内部存储可用容量 public static String getInternalFreeStorageMemory() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getInternalFreeStorageMemory(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取当前Kernel版本 public static String getKernelVersion() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getKernelVersion(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取设备的固件系统版本和编译日期 public static String getBuilderNumberDisplay() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getBuilderNumberDisplay(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取系统版本 public static String getFwVersion() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getFwVersion(); } catch (Exception e) { e.printStackTrace(); return ""; } } //关机 public static void shutdown() { try { Log.d("Rk3566Manager", "shutdown"); HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.reset(); } catch (Exception e) { e.printStackTrace(); } } //重启 public static void reboot() { try { Log.d("Rk3566Manager", "reboot"); HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.reboot(); } catch (Exception e) { e.printStackTrace(); } } //获取系统配置信息 public static String readSystemConfigInfo() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.readSystemConfigInfo(); } } catch (Exception e) { e.printStackTrace(); } return ""; } //设置屏幕亮度 public static void setBrightness(int b) { Log.i("Rk3566Manager", "setBrightness: " + b); try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.setBrightness(b); } catch (Exception e) { e.printStackTrace(); } } //设置屏幕方向 public static void setRotation(String value) { Log.i("Rk3566Manager", "setRotation: " + value); try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.setRotation(value); } catch (Exception e) { e.printStackTrace(); } } //打开/关闭背光,true为打开,false为关闭 public static void setLcdBlackLight(boolean value) { Log.i("Rk3566Manager", "setLcdBlackLight: " + value); try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.setLcdBlackLight(value); } catch (Exception e) { e.printStackTrace(); } } //获取以太网mac地址 public static String getEthMacAddress() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getEthMacAddress(); } catch (Exception e) { e.printStackTrace(); return ""; } } //获取以太网ip地址 public static String getEthIpAddress() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getEthIpAddress(); } catch (Exception e) { e.printStackTrace(); return ""; } } //状态栏显示/隐藏 public static void hideNavigationBar(boolean isShow) { Log.i("Rk3566Manager", "hideNavigationBar: " + isShow); try { Intent intent = new Intent(); intent.setAction("com.android.navigation.status"); intent.putExtra("hide", !isShow); Rk3566Manager.getInstance().getContext().sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } } //获取以太网连接状态 public static int getEthernetLinkStatus() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getEthernetLinkStatus(); } catch (Exception e) { e.printStackTrace(); return 0; } } //设置以太网静态IP public static int setStaticIp(String ipAddress, String netmask, String gateway, String dns1, String dns2) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.setStaticIp(ipAddress, netmask, gateway, dns1, dns2); } catch (Exception var6) { var6.printStackTrace(); } return 0; } //获取子网掩码 public static String getEthNetmask() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.getEthNetmask(); } } catch (Exception e) { e.printStackTrace(); } return ""; } //获取网关ip public static String getEthGateway() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.getEthGateway(); } } catch (Exception e) { e.printStackTrace(); } return ""; } //获取DNS1 public static String getEthDns1() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.getEthDns1(); } } catch (Exception e) { e.printStackTrace(); } return ""; } //获取DNS2 public static String getEthDns2() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.getEthDns2(); } } catch (Exception e) { e.printStackTrace(); } return ""; } //断开以太网 public static boolean disconnectEthernet(String iface) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.disconnectEthernet(iface); } } catch (Exception e) { e.printStackTrace(); } return false; } //连接以太网 public static boolean connectEthernet(String iface) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.connectEthernet(iface); } } catch (Exception e) { e.printStackTrace(); } return false; } //切换动态ip public static boolean switchDHCP() { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { return manager.setDhcp(); } } catch (Exception e) { e.printStackTrace(); } return false; } //休眠 public static void goToSleep(String msg) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.goToSleep(msg); } catch (Exception e) { e.printStackTrace(); } } //唤醒 public static void wakeUp(String msg) { try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); if (manager != null) { manager.wakeUp(msg); } } catch (Exception e) { e.printStackTrace(); } } //ota升级 public static void ota(String path) { try { Intent intent = new Intent(); intent.setAction("com.hdl.os.OTA"); intent.putExtra("com.hdl.os.OTA.path", path); Rk3566Manager.getInstance().getContext().sendBroadcast(intent); } catch (Exception e) { e.printStackTrace(); } } //静默安装 public static void install(String path, String packageName, String activityName) { try { Intent intent = new Intent(); intent.setAction("com.hdl.os.SilentInstall"); intent.putExtra("com.hdl.os.SilentInstall.path", path); if (!TextUtils.isEmpty(packageName)) { intent.putExtra("com.hdl.os.SilentInstall.packageName", packageName); } if (!TextUtils.isEmpty(activityName)) { intent.putExtra("com.hdl.os.SilentInstall.activityName", activityName); } Rk3566Manager.getInstance().getContext().sendBroadcast(intent); } catch (Exception var4) { var4.printStackTrace(); } } //设置过滤权限 public static void setFilterPermissionPackageName(String packageName) { Log.i("Rk3566Manager", "setFilterPermissionPackageName: " + packageName); try { HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); manager.setFilterPermissionPackageName(packageName); } catch (Exception e) { e.printStackTrace(); } } //开启传感器读取 public static boolean startTof(int readMode) { Log.i("Rk3566Manager", "readMode=" + readMode); try { Rk3566Manager.getInstance().getManager().startTof(readMode); } catch (Exception e) { e.printStackTrace(); } return false; } //读取传感器数据 public static int readTofData() { Log.i("Rk3566Manager", "readTofData"); try { return Rk3566Manager.getInstance().getManager().readTofData(); } catch (Exception e) { e.printStackTrace(); return -1; } } //结束传感器读取 public static boolean stopTof() { Log.i("Rk3566Manager", "stopTof"); try { return Rk3566Manager.getInstance().getManager().stopTof(); } catch (Exception e) { e.printStackTrace(); return false; } } //获取麦克风状态 public static boolean getMicEnable() { try { Log.i("Rk3566Manager", "getMicEnable()"); HdlSystemManager manager = Rk3566Manager.getInstance().getManager(); return manager.getMicEnable(); } catch (Exception e) { e.printStackTrace(); return false; } } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/Rk3566Manager.java
New file @@ -0,0 +1,59 @@ package com.hdl.sdk.sourceos; import android.annotation.SuppressLint; import android.app.HdlSystemManager; import android.content.Context; /** * Created by panlili on 2025/2/14 * description: */ public class Rk3566Manager { private static final String TAG = "Rk3566Manager"; private Context context; private HdlSystemManager manager; private Rk3566Manager() { } public static Rk3566Manager getInstance() { return Rk3566Manager.SingletonInstance.INSTANCE; } @SuppressLint({"WrongConstant"}) public void init(Context context) { this.context = context; try { this.manager = (HdlSystemManager) context.getSystemService("hdl"); } catch (Exception e) { e.printStackTrace(); } } public Context getContext() { return this.context; } public void setContext(Context context) { this.context = context; } @SuppressLint({"WrongConstant"}) public HdlSystemManager getManager() { return this.manager; } public void setManager(HdlSystemManager manager) { this.manager = manager; } private static class SingletonInstance { private static final Rk3566Manager INSTANCE = new Rk3566Manager(); private SingletonInstance() { } } } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IKnobListenerAdapter.java
New file @@ -0,0 +1,169 @@ package com.hdl.sdk.sourceos.knob; import android.os.Handler; import android.os.Looper; import android.util.Log; import java.util.concurrent.atomic.AtomicLong; /** * 旋钮大于200毫秒 * 左右互斥,灵动左右旋钮半格有问题 */ public abstract class IKnobListenerAdapter extends OsEventListener { //左旋 public static final int LEFT_KEY_CODE = 132; //右旋 public static final int RIGHT_KEY_CODE = 131; private static final long MAX_LONG_CLICK_TIME = 500L; private static final long MAX_ROTATE_TIME = 500L; private static final Handler mHandler = new Handler(Looper.getMainLooper()); //上一次点击时间 private final AtomicLong lastClickTime = new AtomicLong(0); //上一次旋转时间 private final AtomicLong lastRotateTime = new AtomicLong(0); private final AtomicLong rotateCount = new AtomicLong(0); //上一次 public IKnobListenerAdapter() { } public void clear() { mHandler.removeCallbacksAndMessages(null); } /** * 长按 */ public void onKnobLongClickListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongClick"); } /** * 点击 */ public void onKnobClickListener() { Log.i("knob", "IKnobListenerAdapter:onKnobClick"); } /** * 向左旋转 */ public void onKnobLongLeftListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongLeft"); } public void onKnobLeftListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLeft"); } /** * 向右旋转 */ public void onKnobRightListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongRight"); } public void onKnobLongRightListener() { Log.i("knob", "IKnobListenerAdapter:onKnobRight"); } @Override public void onKeyEvent(int keyCode, int action) { long time = System.currentTimeMillis(); if (keyCode == LEFT_KEY_CODE) { //向左旋转 if (action == 1) {//1是稳定状态 mHandler.removeCallbacks(mKnobRightRunnable); mHandler.postDelayed(mKnobLeftRunnable, 150); if (time - lastRotateTime.get() < MAX_ROTATE_TIME) { if (rotateCount.get() > 4) { rotateCount.set(0); lastRotateTime.set(0); //快速旋转 mHandler.post(mKnobLongLeftRunnable); } rotateCount.set(rotateCount.get() + 1); } else { lastRotateTime.set(time); } } } else if (keyCode == RIGHT_KEY_CODE) { //向右旋转 if (action == 1) {//1是稳定状态 mHandler.removeCallbacks(mKnobLeftRunnable); mHandler.postDelayed(mKnobRightRunnable, 150); if (time - lastRotateTime.get() < MAX_ROTATE_TIME) { if (rotateCount.get() > 4) { rotateCount.set(0); lastRotateTime.set(0); //快速旋转 mHandler.post(mKnobLongRightRunnable); } rotateCount.set(rotateCount.get() + 1); } else { lastRotateTime.set(time); } } } } private final Runnable mKnobLeftRunnable = new Runnable() { @Override public void run() { onKnobLeftListener(); } }; private final Runnable mKnobLongLeftRunnable = new Runnable() { @Override public void run() { onKnobLongLeftListener(); } }; private final Runnable mKnobRightRunnable = new Runnable() { @Override public void run() { onKnobRightListener(); } }; private final Runnable mKnobLongRightRunnable = new Runnable() { @Override public void run() { onKnobLongRightListener(); } }; private final Runnable mKnobLongClickRunnable = new Runnable() { @Override public void run() { onKnobLongClickListener(); } }; private final Runnable mKnobClickRunnable = new Runnable() { @Override public void run() { onKnobClickListener(); } }; } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/IQuickKnobListenerAdapter.java
New file @@ -0,0 +1,87 @@ package com.hdl.sdk.sourceos.knob; import android.os.Handler; import android.os.Looper; import android.util.Log; /** * Created by Tong on 2022/8/29. * 快速响应 */ public abstract class IQuickKnobListenerAdapter extends OsEventListener { //左旋 public static final int LEFT_KEY_CODE = 132; //右旋 public static final int RIGHT_KEY_CODE = 131; private static final Handler mHandler = new Handler(Looper.getMainLooper()); //上一次 public IQuickKnobListenerAdapter() { } public void clear() { mHandler.removeCallbacksAndMessages(null); } public void onKnobLeftListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLeft"); } /** * 向右旋转 */ public void onKnobRightListener() { Log.i("knob", "IKnobListenerAdapter:onKnobLongRight"); } @Override public void onKeyEvent(int keyCode, int action) { if (keyCode == LEFT_KEY_CODE) { //向左旋转 mHandler.post(mKnobLeftRunnable); } else if (keyCode == RIGHT_KEY_CODE) { //向右旋转 mHandler.post(mKnobRightRunnable); } } private final Runnable mKnobLeftRunnable = new Runnable() { @Override public void run() { try { onKnobLeftListener(); } catch (Exception e) { e.printStackTrace(); } } }; private final Runnable mKnobRightRunnable = new Runnable() { @Override public void run() { try { onKnobRightListener(); } catch (Exception e) { e.printStackTrace(); } } }; } HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/sourceos/knob/OsEventListener.java
New file @@ -0,0 +1,14 @@ package com.hdl.sdk.sourceos.knob; import android.os.IEventListener; import android.os.RemoteException; /** * Created by panlili on 2025/2/14 * description: */ public abstract class OsEventListener extends IEventListener.Stub{ public OsEventListener() { } } HDLSDK_DEMO/.idea/misc.xml
@@ -1,4 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="DesignSurface"> <option name="filePathToZoomLevelMap">