diff --git a/app/build.gradle b/app/build.gradle index a39cc98..4382ecf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,17 +2,17 @@ apply plugin: 'com.android.application' android { compileSdkVersion 30 - buildToolsVersion "35.0.1" + buildToolsVersion "30.0.3" buildFeatures { dataBinding = true } defaultConfig { applicationId "qianmu.container" - minSdkVersion 24 + minSdkVersion 22 targetSdkVersion 30 versionCode 6 - versionName "V2.0.8.8" + versionName "V2.0.8.10" // 2.0.8.2 修改网络连接证书设置、定时开关机设置 // 2.0.8.3 获取mac修改 // V2.0.8.5 同屏优化 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6da719b..74b3446 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -22,7 +22,6 @@ - diff --git a/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java index aea8b7c..ad5d6fb 100644 --- a/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java +++ b/app/src/main/java/qianmu/container/activity/H5/UpdateFileActivity.java @@ -1,7 +1,10 @@ package qianmu.container.activity.H5; +import android.Manifest; import android.app.smdt.SmdtManagerNew; +import android.content.ActivityNotFoundException; import android.content.Intent; +import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Environment; @@ -12,6 +15,9 @@ import android.util.Log; import android.util.TimeUtils; import android.view.View; +import androidx.annotation.NonNull; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; import com.alibaba.android.arouter.facade.annotation.Route; @@ -126,6 +132,8 @@ public class UpdateFileActivity extends BaseActivity { ScreenSaverData.queryScreensaver(() -> totalQueryCount++, () -> queryResponseCount++ ); //上传设备版本号 DeviceData.sendVersion(() -> totalQueryCount++, () -> queryResponseCount++ ); + //上传固件版本号 + DeviceData.updateFirmwareStatus(() -> totalQueryCount++, () -> queryResponseCount++ ); //获取定时开关机时间 DeviceData.getMachineOnOffTime(() -> totalQueryCount++, () -> queryResponseCount++ ); //获取同屏 @@ -250,15 +258,19 @@ public class UpdateFileActivity extends BaseActivity { //新版欣威视通初始化 SdkApi.newInstance(this); } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - if(!Environment.isExternalStorageManager()){ - Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); - intent.setData(Uri.parse("package:" + this.getPackageName())); // 设置要申请权限的应用包名 - startActivity(intent); // 启动活动以请求用户授权 - return; + LoggerUtil.e("当前版本号: ",DeviceUtil.getVersionName()); + try{ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if(!Environment.isExternalStorageManager()){ + Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + intent.setData(Uri.parse("package:" + this.getPackageName())); // 设置要申请权限的应用包名 + startActivity(intent); // 启动活动以请求用户授权 + return; + } } + }catch (ActivityNotFoundException e){ + } - LoggerUtil.e("当前版本号: ",DeviceUtil.getVersionName()); //设置开机自启应用 if(Constant.androidBoardType.equals("smt")){ MyApplication.getInstance().getSmdt().sys_setSystemBootApp(MyApplication.getInstance().getPackageName()); diff --git a/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java b/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java index d62d1ed..fa3156c 100644 --- a/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java +++ b/app/src/main/java/qianmu/container/activity/device/DeviceInfoActivity.java @@ -95,16 +95,17 @@ public class DeviceInfoActivity extends BaseActivity { }); } - /** + /** * 检测权限并授权 * */ private void setPermission(){ if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this,new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.RECEIVE_BOOT_COMPLETED, diff --git a/app/src/main/java/qianmu/container/app/Constant.java b/app/src/main/java/qianmu/container/app/Constant.java index 7b2dba6..ab395d1 100644 --- a/app/src/main/java/qianmu/container/app/Constant.java +++ b/app/src/main/java/qianmu/container/app/Constant.java @@ -24,12 +24,12 @@ public class Constant { public static String mqttState = ""; // 屏幕连接方式 public static String TTSHome=""; // sbc-思必驰 kdxf-科大讯飞 //public static String androidBoardType = ""; //设备板子型号 无固定版 - public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch + // public static String androidBoardType = "ys"; // 设备板子型号 ys(亿晟) 北京颐堤港定制touch // public static String androidBoardType = "xwst"; //设备板子型号 xwst(欣威视通3399) // public static String androidBoardType = "xwst2"; //设备板子型号 xwst2(欣威视通3588、T982、3576) // public static String androidBoardType = "zc"; //设备板子型号 zc(卓策主板——王府井喜悦、杨浦中心医院) // public static String androidBoardType = "sx"; //设备板子型号 sx(视想) - // public static String androidBoardType = "nova"; //设备板子型号 诺瓦盒子 华贸LED + public static String androidBoardType = "nova"; //设备板子型号 诺瓦盒子 华贸LED // public static String androidBoardType = "huidu"; //设备板子型号 huidu(灰度主板) 罗湖寻车机 // public static String androidBoardType = "bv"; //设备板子型号 Bv-3588M // public static String androidBoardType = "smt"; //设备板子型号 视美泰 diff --git a/app/src/main/java/qianmu/container/data/DeviceData.java b/app/src/main/java/qianmu/container/data/DeviceData.java index 8c0430e..9420496 100644 --- a/app/src/main/java/qianmu/container/data/DeviceData.java +++ b/app/src/main/java/qianmu/container/data/DeviceData.java @@ -80,6 +80,7 @@ public class DeviceData extends BaseData { public static final String HINT_DEVICE_IP = "hint_device_ip"; public static final String HINT_DEVICE_MAC = "hint_device_mac"; public static final String HINT_DEVICE_TYPE = "hint_device_type"; + public static final String VOICE_CODE = "voice_code"; public static final String HINT_DEVICE_TOUCH = "hint_device_touch";//触摸属性 // 0触摸 1非触摸 public static final String HINT_SYNC_TEST = "hint_sync_test"; public static final String HINT_DEVICE_ROTATION = "hint_device_rotation"; @@ -246,6 +247,8 @@ public class DeviceData extends BaseData { JsonObject jsonObject = new JsonParser().parse(dataJson).getAsJsonObject(); String typeName = jsonObject.get("machineTypeName").getAsString(); DeviceData.saveDeviceInfo(DeviceData.HINT_DEVICE_TYPE, typeName); //设备类型 + String voiceActivationCode = jsonObject.get("voiceActivationCode").getAsString(); + DeviceData.saveDeviceInfo(DeviceData.VOICE_CODE, typeName); //设备语音激活码 LoggerUtil.e("getMachine()", typeName); } }else { @@ -319,16 +322,31 @@ public class DeviceData extends BaseData { RetrofitUtil.getBaseService().sendVersion(requestBody).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { - try { - if (StringUtil.respSuccess(response.body())) { - - } else if (response.code() == 200 && "201".equals(response.body().getCode())) { + if (finishListener != null) finishListener.onFinish(); + } - } - } catch (Throwable t) { - LoggerUtil.e("sendVersion", StringUtil.getThrowableStr(t)); - } + @Override + public void onFailure(Call call, Throwable t) { + LoggerUtil.saveError("sendVersion",t); + if (finishListener != null) finishListener.onFinish(); + } + }); + } + /** + * 上传版本号 + * */ + public static void updateFirmwareStatus(QueryPreparedListener preparedListener, QueryFinishListener finishListener) { + if (preparedListener != null) preparedListener.onPrepared(); + Map params = new HashMap<>(); + params.put("code", DeviceData.getDeviceInfo(HINT_DEVICE_CODE)); + params.put("hardwareFirmwareNum", SignWayUtil.getFirmwareVersion());//硬件固件号 + params.put("hardwareVersionModel", SignWayUtil.getAndroidModle());// 硬件版本型号 + params.put("firmwareStatus", "1"); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),new Gson().toJson(params)); + RetrofitUtil.getBaseService().updateFirmwareStatus(requestBody).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { if (finishListener != null) finishListener.onFinish(); } diff --git a/app/src/main/java/qianmu/container/entity/Building.java b/app/src/main/java/qianmu/container/entity/Building.java index f982d8e..7bb5151 100644 --- a/app/src/main/java/qianmu/container/entity/Building.java +++ b/app/src/main/java/qianmu/container/entity/Building.java @@ -114,6 +114,15 @@ public class Building { private int order; private String machineTypeName;//导视 信发 游戏 private int attribute;// 0触摸 1非触摸 + private String voiceActivationCode; // 语音激活码 + + public String getVoiceActivationCode() { + return voiceActivationCode; + } + + public void setVoiceActivationCode(String voiceActivationCode) { + this.voiceActivationCode = voiceActivationCode; + } public String getName() { return name; diff --git a/app/src/main/java/qianmu/container/http/retrofit/BaseService.java b/app/src/main/java/qianmu/container/http/retrofit/BaseService.java index 57f3a50..580150f 100644 --- a/app/src/main/java/qianmu/container/http/retrofit/BaseService.java +++ b/app/src/main/java/qianmu/container/http/retrofit/BaseService.java @@ -165,6 +165,11 @@ public interface BaseService { @POST("api/device/v1/client/version") Call sendVersion(@Body RequestBody body); + /** + * 上传 估计版本信息 + */ + @POST("api/device/v1/client/updateFirmwareStatus") + Call updateFirmwareStatus(@Body RequestBody body); /** * 获取设备屏保信息,默认图,跳转时间等 * diff --git a/app/src/main/java/qianmu/container/mqtt/MQTTService.java b/app/src/main/java/qianmu/container/mqtt/MQTTService.java index 14a1df7..24ee302 100644 --- a/app/src/main/java/qianmu/container/mqtt/MQTTService.java +++ b/app/src/main/java/qianmu/container/mqtt/MQTTService.java @@ -77,6 +77,7 @@ import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; +import cn.hutool.crypto.asymmetric.Sign; import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.RequestBody; @@ -260,8 +261,8 @@ public class MQTTService extends Service { client.connect(conOpt, null, iMqttActionListener); } } catch (MqttException e) { - e.printStackTrace(); - } + e.printStackTrace(); + } } @@ -465,7 +466,10 @@ public class MQTTService extends Service { CloseMqttBean closeMqttBean =new Gson().fromJson(msg, new TypeToken() { }.getType()); - if(closeMqttBean.getType().equals("app-update")){ + if(closeMqttBean.getType().equals("firmware-update")){ + //固件升级 + systemUpdate(closeMqttBean); + }else if(closeMqttBean.getType().equals("app-update")){ //APP下发 appUpdate(closeMqttBean); }else if(closeMqttBean.getType().equals("h5-update")){ @@ -544,6 +548,17 @@ public class MQTTService extends Service { } } + /** + * 系统升级 + */ + public void systemUpdate(CloseMqttBean closeMqttBean){ + String url = closeMqttBean.getData().getUpdate().getUrl(); + String version = closeMqttBean.getData().getUpdate().getFirmwareIssueVersion(); + if(!version.equals(SignWayUtil.getFirmwareVersion()) && !StringUtil.isEmpty(url)){ + downloadImgFile(url,"update.img"); + } + } + /** * 更新app * */ @@ -775,6 +790,16 @@ public class MQTTService extends Service { }); } + /** + * 下载固件并更新 + */ + private void downloadImgFile(String url,final String appName) { + final String localPath = StringUtil.strSplice(Constant.CACHE_PATH, "update/", appName); + FileUtil.downloadFile(url, localPath, () -> { + SignWayUtil.updateSystem(localPath); + }); + } + /** * 忽略证书 * */ diff --git a/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java b/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java index 8c6fbd9..5d07d8d 100644 --- a/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java +++ b/app/src/main/java/qianmu/container/mqtt/MqttDataBean.java @@ -76,6 +76,7 @@ public class MqttDataBean implements Serializable { String url; String size; String name; + String firmwareIssueVersion; String description;//备注 public String getVersion() { @@ -110,6 +111,14 @@ public class MqttDataBean implements Serializable { this.name = name; } + public String getFirmwareIssueVersion() { + return firmwareIssueVersion; + } + + public void setFirmwareIssueVersion(String firmwareIssueVersion) { + this.firmwareIssueVersion = firmwareIssueVersion; + } + public String getDescription() { return description; } @@ -117,6 +126,7 @@ public class MqttDataBean implements Serializable { public void setDescription(String description) { this.description = description; } + } /** diff --git a/app/src/main/java/qianmu/container/util/SignWayUtil.java b/app/src/main/java/qianmu/container/util/SignWayUtil.java index 8373823..ab42619 100644 --- a/app/src/main/java/qianmu/container/util/SignWayUtil.java +++ b/app/src/main/java/qianmu/container/util/SignWayUtil.java @@ -487,11 +487,16 @@ public class SignWayUtil { //获取设备固件号 public static String getFirmwareVersion() { - try { - return Build.VERSION.INCREMENTAL; - } catch (Throwable t) { - LoggerUtil.e("getFirmwareVersion", StringUtil.getThrowableStr(t)); - return ""; + if(Constant.androidBoardType.equals("ys")) { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + return manager.getAndroidDisplay(); + }else{ + try { + return Build.VERSION.INCREMENTAL; + } catch (Throwable t) { + LoggerUtil.e("getFirmwareVersion", StringUtil.getThrowableStr(t)); + return ""; + } } } @@ -505,6 +510,15 @@ public class SignWayUtil { } } + // 估计升级 + public static void updateSystem(String filePath){ + if(Constant.androidBoardType.equals("ys")) { + MyManager manager = MyManager.getInstance(MyApplication.getInstance()); + manager.upgradeSystem(filePath); + manager.setUpdateSystemDelete(true); // 升级成功后删除img文件 + } + } + /** *设置系统时间 */ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2aba994..8e2b8f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - Android容器 + 千目容器 设备注册状态: 商场编号: 容器类型