diff --git a/app/build.gradle b/app/build.gradle index c82c6ab..8b7f4be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,10 @@ android { applicationId "com.ycgis.macall.personalcenter" minSdkVersion 23 targetSdkVersion 30 - versionCode 2401171 - versionName "3.0.20240117" + versionCode 2506051 + versionName "3.1.20250605.01" +// versionCode 2000000 +// versionName "2.0.202403221" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -99,5 +101,17 @@ dependencies { //Zxing 二维码识别 implementation 'com.github.jenly1314:zxing-lite:2.1.1' +// implementation('com.github.gzu-liyujiang:Android_CN_OAID:4.2.5.1') { +// // 如果使用了移动安全联盟SDK,共存的话需排除掉本项目依赖的华为/荣耀官方广告标识服务SDK,因为移动安全联盟SDK也依赖了华为/荣耀的SDK +// // 如果华为官方广告标识服务SDK下载失败或编译报错的话,可考虑在 build.gradle 中增加以下配置: +// // repositories { maven { url 'https://developer.huawei.com/repo' } } +// // runtimeOnly "com.huawei.hms:ads-identifier:3.4.62.300" +// exclude group: 'com.huawei.hms', module: 'ads-identifier' +// // 荣耀官方广告标识服务SDK同理: +// // repositories { maven { url 'https://developer.hihonor.com/repo' } } +// // runtimeOnly "com.hihonor.mcs:ads-identifier:1.0.2.301" +// exclude group: 'com.hihonor.mcs', module: 'ads-identifier' +// } + } \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 29f9371..64a6549 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -20,12 +20,20 @@ # hide the original source file name. #-renamesourcefileattribute SourceFile + + +#设备标识符 +-dontwarn com.github.gzuliyujiang.oaid.** +-keep class com.github.gzuliyujiang.oaid.** { *; } + #统一认证 -dontwarn com.anhui.police.auth.** -keep class com.anhui.police.auth.** { *; } + #应用中心 -dontwarn com.anhui.police.market.sdk.** -keep class com.anhui.police.market.** { *; } + #统一服务组件 -dontwarn com.ruansee.macall.unifyservemodulesdk.** -keep class com.ruansee.macall.unifyservemodulesdk.** { *; } @@ -34,10 +42,20 @@ -dontwarn com.rs.macall.androidx.basemodel.** -keep class com.rs.macall.androidx.basemodel.** { *; } +#Base64编码 +-dontwarn com.base.code.binary.** +-keep class com.base.code.binary.** { *; } + #加载动画 -dontwarn com.wang.avi.** -keep class com.wang.avi.** { *; } +#广告ID +-dontwarn com.github.gzuliyujiang.oaid.** +-keep class com.github.gzuliyujiang.oaid.** { *; } +-dontwarn repeackage.com.** +-keep class repeackage.com.** { *; } + -keep public class * extends androidx.fragment.app.FragmentActivity -keep public class * extends android.app.Application -keep public class * extends androidx.core.content.FileProvider @@ -55,13 +73,14 @@ -keep public class com.ycgis.macall.personalcenter.p.app.CrashHandler{*;} -keep public class com.ycgis.macall.personalcenter.p.app.RuanseeApplication{*;} +-keep public class com.ycgis.macall.personalcenter.p.app.MyAppGlideModule{*;} -keep public class com.ycgis.macall.personalcenter.p.app.UserData{*;} -#-keep public class com.ycgis.macall.personalcenter.p.app.AppCache{*;} +-keep public class com.ycgis.macall.personalcenter.p.app.AppCache{*;} -keep public class com.ycgis.macall.personalcenter.p.callback.BaseRequestCallback{*;} -keep public class com.ycgis.macall.personalcenter.p.callback.RequestCallback{*;} -keep public class com.ycgis.macall.personalcenter.p.callback.WebActivityCallback{*;} -keep public class com.ycgis.macall.personalcenter.p.presenter.**{*;} --keep public class com.ycgis.macall.personalcenter.p.request.interceptors.**{*;} +-keep public class com.ycgis.macall.personalcenter.p.request.interceptors.HttpLoggingInterceptor{*;} -keep public class com.ycgis.macall.personalcenter.p.request.ApiModel{*;} -keep public class com.ycgis.macall.personalcenter.p.request.HttpErrorHandler{*;} -keep public class com.ycgis.macall.personalcenter.p.request.RetrofitApi{*;} @@ -69,6 +88,7 @@ -keep public class com.ycgis.macall.personalcenter.p.request.UploadProgressResponsBody{*;} -keep public class com.ycgis.macall.personalcenter.m.adapterbean.**{*;} +-keep public class com.ycgis.macall.personalcenter.m.datamodel.PrintModel{*;} -keep public class com.ycgis.macall.personalcenter.m.event.MessageEvent{*;} -keep public class com.ycgis.macall.personalcenter.m.enumbean.**{*;} -keep public class com.ycgis.macall.personalcenter.m.provider.**{*;} @@ -85,15 +105,19 @@ public *;} -keep public class com.ycgis.macall.personalcenter.v.photoview.**{*;} -keep public class com.ycgis.macall.personalcenter.util.ReadDeviceInfo{*;} +-keep public class com.ycgis.macall.personalcenter.util.AhdsAddressUtils{*;} -keep public class com.ycgis.macall.personalcenter.util.FileUtils{ public *;} -keep public class com.ycgis.macall.personalcenter.util.IdcardUtils{ public *;} +-keep public class com.ycgis.macall.personalcenter.util.BluetoothManage{*;} -keep public class com.ycgis.macall.personalcenter.util.JiaMi{*;} -keep public class com.ycgis.macall.personalcenter.util.ImageOptimizationUtil{*;} -keep public class com.ycgis.macall.personalcenter.util.IPAddressUtils{*;} -keep public class com.ycgis.macall.personalcenter.util.LocationGPSManage{ public *;} +-keep public class com.ycgis.macall.personalcenter.util.InsertAppUtils{ +public *;} -keep public class com.ycgis.macall.personalcenter.util.NotificationUtils{ public *;} -keep public class com.ycgis.macall.personalcenter.util.ToThirdPartyAppUtils{ @@ -101,6 +125,9 @@ public *;} -keep public class com.ycgis.macall.personalcenter.util.UriUtils{ public *;} -keep public class com.ycgis.macall.personalcenter.util.PhoneValidateUtils{*;} +-keep public class com.ycgis.macall.personalcenter.util.ParamMap{*;} + +-keep public class com.ycgis.zpSDK.*{*;} #-keep public class com.ycgis.macall.personalcenter.v.**{ # public *; diff --git a/app/release/H5测试V2.5.apk b/app/release/H5测试V2.5.apk deleted file mode 100644 index 0eb94ed..0000000 Binary files a/app/release/H5测试V2.5.apk and /dev/null differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 859d7ef..7c52f7c 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -4,15 +4,15 @@ "type": "APK", "kind": "Directory" }, - "applicationId": "com.ruansee.macall.testwebview", + "applicationId": "com.ycgis.macall.personalcenter", "variantName": "release", "elements": [ { "type": "SINGLE", "filters": [], - "versionCode": 5, - "versionName": "2.5", - "outputFile": "testwebview-release.apk" + "versionCode": 2506051, + "versionName": "3.1.20250605.01", + "outputFile": "app-release.apk" } ] } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 92be3c0..6b6f46f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,13 +6,14 @@ - + - @@ -26,6 +27,15 @@ + + + + + + - + + @@ -120,7 +135,7 @@ android:name=".v.activity.OpenAppActivity" android:configChanges="orientation|screenSize" android:screenOrientation="portrait" - android:windowSoftInputMode="adjustUnspecified|stateHidden|stateAlwaysHidden|adjustPan" /> + android:windowSoftInputMode="adjustResize" /> + android:windowSoftInputMode="adjustUnspecified|stateHidden|stateAlwaysHidden|adjustPan" /> + android:windowSoftInputMode="adjustUnspecified|stateHidden|stateAlwaysHidden|adjustPan"> + + + + + + + + + android:exported="true" + android:permission="android.permission.BIND_JOB_SERVICE" /> + + + + + 这里是一个H5页面 + + + + +

+ + +

+ + +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ +

+ + + + \ No newline at end of file diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAppBean.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAppBean.java index d8b66a9..f0b9c62 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAppBean.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAppBean.java @@ -18,10 +18,9 @@ public class ApplyAppBean implements Serializable { * code : 200 * data : [{"createBy":null,"createTime":"2023-06-02 12:11:26","updateBy":null,"updateTime":"2023-06-03 11:30:27","remark":"是的","id":6,"name":"2121","icon":"/profile/upload/2023/06/02/logo_20230602121120A001.png","category":"1","deptId":340100000000,"deptName":"合肥市公安局","status":1,"createUserId":null,"createDeptId":null,"createUserName":null,"createDeptName":null,"roles":[{"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"remark":null,"id":9,"appId":6,"roleName":"超级管理员"},{"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"remark":null,"id":10,"appId":6,"roleName":"地市"}]},{"createBy":null,"createTime":"2023-06-02 10:21:31","updateBy":null,"updateTime":"2023-06-03 11:30:27","remark":"这是一个治安应用2023年6月2日10:21:31","id":1,"name":"皖治通","icon":"/profile/upload/2023/06/02/logo_20230602102112A002.png","category":"1","deptId":340100000000,"deptName":"合肥市公安局","status":1,"createUserId":null,"createDeptId":null,"createUserName":null,"createDeptName":null,"roles":[{"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"remark":null,"id":11,"appId":1,"roleName":"普通用户"},{"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"remark":null,"id":12,"appId":1,"roleName":"管理员1"}]},{"createBy":null,"createTime":"2023-06-02 11:58:39","updateBy":null,"updateTime":"2023-06-03 11:30:27","remark":"是否","id":5,"name":"11111","icon":"/profile/upload/2023/06/02/logo_20230602115827A002.png","category":"1","deptId":340000000000,"deptName":"安徽省公安厅","status":1,"createUserId":null,"createDeptId":null,"createUserName":null,"createDeptName":null,"roles":[{"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"remark":null,"id":13,"appId":5,"roleName":"12"}]},{"createBy":null,"createTime":"2023-06-02 10:56:43","updateBy":null,"updateTime":"2023-06-03 11:30:27","remark":"1","id":3,"name":"云搜索","icon":"/profile/upload/2023/06/02/btn_record_20230602105626A002.png","category":"1","deptId":800701750001,"deptName":"安徽省","status":1,"createUserId":null,"createDeptId":null,"createUserName":null,"createDeptName":null,"roles":[{"createBy":null,"createTime":null,"updateBy":null,"updateTime":null,"remark":null,"id":14,"appId":3,"roleName":"23"}]}] */ - private String msg; private int code; - private List data; + private List data; public String getMsg() { return msg; @@ -39,11 +38,11 @@ public class ApplyAppBean implements Serializable { this.code = code; } - public List getData() { + public List getData() { return data; } - public void setData(List data) { + public void setData(List data) { this.data = data; } @@ -51,6 +50,63 @@ public class ApplyAppBean implements Serializable { return code == 200; } + public static class DataBean2 extends BaseBean implements Serializable { + private int id; + private String remark; + private String roleName; + private int roleSort; + private int status; + private boolean isSelect; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public int getRoleSort() { + return roleSort; + } + + public void setRoleSort(int roleSort) { + this.roleSort = roleSort; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public boolean isSelect() { + return isSelect; + } + + public void setSelect(boolean select) { + isSelect = select; + } + } + public static class DataBean extends BaseBean implements Serializable { /** * createBy : null diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAuditBean.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAuditBean.java index f443b62..74e2220 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAuditBean.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyAuditBean.java @@ -153,8 +153,16 @@ public class ApplyAuditBean extends BaseBean { return "所在单位意见:"; case "3": return "所在地市意见:"; + case "5": + return "单位领导意见:"; case "6": return "省厅意见:"; + case "7": + return "督察部门意见:"; + case "8": + return "纪检部门意见:"; + case "9": + return "政工部门意见:"; default: return "运维单位:"; } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyBean.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyBean.java index 5202526..b4d19bf 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyBean.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ApplyBean.java @@ -63,6 +63,10 @@ public class ApplyBean extends BaseBean { return StringUtil.get(applyReason,"暂无"); } + public String getApplyReasonStr() { + return "申请原因:" +getApplyReason(); + } + public void setApplyReason(String applyReason) { this.applyReason = applyReason; } @@ -124,13 +128,30 @@ public class ApplyBean extends BaseBean { } public String getRoleNameStr() { - return "角色名称:" + roleName; + return "权限名称:" + StringUtil.get(roleName,"暂无"); } public String getRoleName() { return roleName; } + public String getAuthorityStr() { + StringBuilder builder = new StringBuilder(); + builder.append("权限名称:"); + if (roleName == null){ + builder.append("暂无"); + }else if (roleName.contains("普通")){ + builder.append(""); + builder.append(roleName); + builder.append(""); + }else { + builder.append(""); + builder.append(roleName); + builder.append(""); + } + return builder.toString(); + } + public void setRoleName(String roleName) { this.roleName = roleName; } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/BluetoothOV.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/BluetoothOV.java new file mode 100644 index 0000000..8b4e9f7 --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/BluetoothOV.java @@ -0,0 +1,49 @@ +package com.ycgis.macall.personalcenter.m.adapterbean; + +/** + * created by: Macall + * create time: 2025/5/29 16:23 + * copyright: @ruansee.com + * Describe: + */ +public class BluetoothOV { + private String name; + private String address; + private int status; + private int type; + + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ExamineDetails.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ExamineDetails.java new file mode 100644 index 0000000..c6ad097 --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/adapterbean/ExamineDetails.java @@ -0,0 +1,12 @@ +package com.ycgis.macall.personalcenter.m.adapterbean; + +/** + * created by: Macall + * create time: 2024/9/17 11:28 + * copyright: @ruansee.com + * Describe: + */ +public class ExamineDetails { + + +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/datamodel/PrintModel.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/datamodel/PrintModel.java new file mode 100644 index 0000000..361d3de --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/datamodel/PrintModel.java @@ -0,0 +1,79 @@ +package com.ycgis.macall.personalcenter.m.datamodel; + +/** + * created by: Macall + * create time: 2025/5/29 16:56 + * copyright: @ruansee.com + * Describe: + */ +public class PrintModel { +// "content":"文字内容", +// * "printType":1 + + private String content; + private int printType; + private int contentWidth; + private int contentHeight; + private int pageHeight; + private int pageWidth; + private int zoomLevel; + + public int getZoomLevel() { + if (zoomLevel>32) return 32; + return Math.max(zoomLevel, 1); + } + + public void setZoomLevel(int zoomLevel) { + this.zoomLevel = zoomLevel; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public int getPrintType() { + return printType; + } + + public void setPrintType(int printType) { + this.printType = printType; + } + + public int getContentWidth() { + return contentWidth; + } + + public void setContentWidth(int contentWidth) { + this.contentWidth = contentWidth; + } + + public int getContentHeight() { + return contentHeight; + } + + public void setContentHeight(int contentHeight) { + this.contentHeight = contentHeight; + } + + public int getPageHeight() { + if (pageHeight<100)return 100; + return Math.min(pageHeight,2000); + } + + public void setPageHeight(int pageHeight) { + this.pageHeight = pageHeight; + } + + public int getPageWidth() { + if (pageWidth<100)return 100; + return Math.min(pageWidth,2000); + } + + public void setPageWidth(int pageWidth) { + this.pageWidth = pageWidth; + } +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/provider/BluetoothBroadcastReceiver.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/provider/BluetoothBroadcastReceiver.java new file mode 100644 index 0000000..55d7d27 --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/provider/BluetoothBroadcastReceiver.java @@ -0,0 +1,47 @@ +package com.ycgis.macall.personalcenter.m.provider; + +import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +import com.ycgis.macall.personalcenter.m.adapterbean.BluetoothOV; +import com.ycgis.macall.personalcenter.util.BluetoothManage; + +import org.greenrobot.eventbus.EventBus; + +/** + * created by: Macall + * create time: 2025/5/29 17:37 + * copyright: @ruansee.com + * Describe: + */ +public class BluetoothBroadcastReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR); + int prevBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR); + if (bondState == BluetoothDevice.BOND_BONDING) { + + // 正在配对 + } else if (bondState == BluetoothDevice.BOND_BONDED) { + // 配对成功 + + } else if (bondState == BluetoothDevice.BOND_NONE) { + + // 取消配对/配对失败 + } + } + if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) { + // 设备已连接 + } else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) { + // 设备已断开 + } + } + +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/m/requestbean/BaseRequestModel.java b/app/src/main/java/com/ycgis/macall/personalcenter/m/requestbean/BaseRequestModel.java index 68d5e37..d5dd039 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/m/requestbean/BaseRequestModel.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/m/requestbean/BaseRequestModel.java @@ -14,6 +14,8 @@ public class BaseRequestModel { private int total; // private int counts; private T data; + private T rows; + // public int getCounts() { // return counts; @@ -23,6 +25,15 @@ public class BaseRequestModel { // this.counts = counts; // } + + public T getRows() { + return rows; + } + + public void setRows(T rows) { + this.rows = rows; + } + public int getTotal() { return total; } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/app/AppCache.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/app/AppCache.java index 39c29f5..ab6dab5 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/app/AppCache.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/app/AppCache.java @@ -37,11 +37,11 @@ public class AppCache { //统一认证token private String token; + /* 用户信息加密 */ private String userInfo; private String imei,imsi; - private AppCache() { } @@ -55,7 +55,6 @@ public class AppCache { return appCache; } - public void setIpAndPort(String ip,String port){ this.ip = ip; this.port = port; @@ -125,11 +124,12 @@ public class AppCache { } public String getUserInfo() { - return userInfo; + return StringUtil.get(userInfo,RuanseeApplication.getStringValue("appUserInfo")); } public void setUserInfo(String userInfo) { this.userInfo = userInfo; + RuanseeApplication.saveData("appUserInfo",userInfo); } public String getImei() { diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/app/MyAppGlideModule.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/app/MyAppGlideModule.java index f0f98ba..4e9abab 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/app/MyAppGlideModule.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/app/MyAppGlideModule.java @@ -18,6 +18,7 @@ import com.bumptech.glide.module.AppGlideModule; import com.bumptech.glide.request.RequestOptions; import com.rs.macall.androidx.basemodel.request.OkHttpUtils; import com.ycgis.macall.personalcenter.R; +import com.ycgis.macall.personalcenter.p.request.interceptors.HttpLoggingInterceptor; import com.ycgis.macall.personalcenter.util.FileUtils; import org.jetbrains.annotations.NotNull; @@ -34,7 +35,7 @@ public class MyAppGlideModule extends AppGlideModule { @Override public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) { - OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(OkHttpUtils.getClient(30,40,60)); + OkHttpUrlLoader.Factory factory = new OkHttpUrlLoader.Factory(OkHttpUtils.getClient(30,40,60,new HttpLoggingInterceptor())); registry.replace(GlideUrl.class, InputStream.class, factory); } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/app/RuanseeApplication.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/app/RuanseeApplication.java index e38b350..201c96c 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/app/RuanseeApplication.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/app/RuanseeApplication.java @@ -51,6 +51,7 @@ public class RuanseeApplication extends BaseApplication { .setBorderSwitch(isPrintLog) .setLogSwitch(isPrintLog) .setLog2FileSwitch(false); +// DeviceIdentifier.register(this); //统一服务组件 USMConfigure.getDefault().init("11811535", "grzx_test_app"); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/callback/BluetoothFragmentListener.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/callback/BluetoothFragmentListener.java new file mode 100644 index 0000000..d5019df --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/callback/BluetoothFragmentListener.java @@ -0,0 +1,17 @@ +package com.ycgis.macall.personalcenter.p.callback; + +import android.bluetooth.BluetoothDevice; + +/** + * created by: Macall + * create time: 2025/5/30 16:49 + * copyright: @ruansee.com + * Describe: + */ +public interface BluetoothFragmentListener { + + void onClickBluetoothDevice(BluetoothDevice device); + + void onError(int code,String msg); + +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/BtnSkip.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/BtnSkip.java new file mode 100644 index 0000000..c514dfc --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/BtnSkip.java @@ -0,0 +1,90 @@ +package com.ycgis.macall.personalcenter.p.presenter; + +import android.content.Context; +import android.util.ArrayMap; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; + +import com.ycgis.macall.personalcenter.R; + +import java.util.Map; + +/** + * created by: Macall + * create time: 2024/3/16 17:51 + * copyright: @ruansee.com + * Describe: + */ +public class BtnSkip { + private Map contentMap; + private Context context; + private int selColorId = R.color.colorWhite,defColorId = R.color.colorGrey8; + + public BtnSkip(Context context) { + this.context = context; + this.contentMap = new ArrayMap<>(); + } + + public BtnSkip setTextColor(int selColorId , int defColorId){ + this.defColorId = defColorId; + this.selColorId = selColorId; + return this; + } + + public BtnSkip add(int index, Content content){ + contentMap.put(index,content); + return this; + } + + public void clean(){ + context = null; + if (contentMap!=null){ + for (int key:contentMap.keySet()) { + Content content = contentMap.get(key); + if (content!=null){ + content.clean(); + } + } + contentMap.clear(); + } + + contentMap = null; + } + + public void unDateStatus(int index,boolean isSel){ + Content content = contentMap.get(index); + if (content == null) return; + content.setStatus(isSel); + } + + public class Content{ + private TextView view; + private ImageView image; + private int selDrawable,defDrawable; + + public Content(TextView view, ImageView image, int selDrawable, int defDrawable) { + this.view = view; + this.image = image; + this.selDrawable = selDrawable; + this.defDrawable = defDrawable; + } + + private void setStatus(boolean isSel){ + if (isSel){ + view.setTextColor(ContextCompat.getColor(context,selColorId)); + image.setImageDrawable(ContextCompat.getDrawable(context,selDrawable)); + }else { + view.setTextColor(ContextCompat.getColor(context,defColorId)); + image.setImageDrawable(ContextCompat.getDrawable(context,defDrawable)); + } + } + + public void clean(){ + view = null; + selDrawable = 0; + defColorId = 0; + } + } +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/WebViewPresenter.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/WebViewPresenter.java index ca2ebb7..bf8a5a6 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/WebViewPresenter.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/presenter/WebViewPresenter.java @@ -319,7 +319,6 @@ public class WebViewPresenter extends BasePresenter { } }; - public void showLoadWebError(String titleStr, String msg, String lxryName, String lxryPhone) { if (StringUtil.isNullOrEmpty(titleStr)){ titleStr = "温馨提示"; diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/request/AsyncBitmapLoader.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/request/AsyncBitmapLoader.java index 6fe9b05..1e84999 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/request/AsyncBitmapLoader.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/request/AsyncBitmapLoader.java @@ -15,6 +15,7 @@ import com.rs.macall.androidx.basemodel.utils.TypConversion; import com.ycgis.macall.personalcenter.p.app.RuanseeApplication; import com.ycgis.macall.personalcenter.p.callback.BaseRequestCallback; import com.ycgis.macall.personalcenter.p.callback.ImageCallBack; +import com.ycgis.macall.personalcenter.p.request.interceptors.HttpLoggingInterceptor; import com.ycgis.macall.personalcenter.util.FileUtils; import com.ycgis.macall.personalcenter.v.activity.applyfo.ApplyForMainActivity; @@ -162,7 +163,7 @@ public class AsyncBitmapLoader { Request request = new Request.Builder() .url(url) .build(); - OkHttpUtils.getClient(10, 30, 40) + OkHttpUtils.getClient(10, 30, 40,new HttpLoggingInterceptor()) .newCall(request) .enqueue(new Callback() { @Override diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/request/RetrofitService.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/request/RetrofitService.java index 5c89b46..3512944 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/request/RetrofitService.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/request/RetrofitService.java @@ -27,6 +27,7 @@ public class RetrofitService { public static void resetRetrofitApi() { retrofitService = new Retrofit.Builder() .baseUrl(RuanseeApplication.getAppCache().getBaseUrlPath()) + .client(OkHttpUtils.getClient(10, 10, 10,new HttpLoggingInterceptor())) .addConverterFactory(new NullOnEmptyConverterFactory())//处理接口返回没有响应体body // 添加Gson转换器 .addConverterFactory(GsonConverterFactory.create()) @@ -36,7 +37,6 @@ public class RetrofitService { // )) // 添加Retrofit到RxJava的转换器 .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) - .client(OkHttpUtils.getClient(10, 10, 10,new HttpLoggingInterceptor())) .build() .create( RetrofitApi.class); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/p/request/interceptors/HttpLoggingInterceptor.java b/app/src/main/java/com/ycgis/macall/personalcenter/p/request/interceptors/HttpLoggingInterceptor.java index 1ad1f58..d5f0eee 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/p/request/interceptors/HttpLoggingInterceptor.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/p/request/interceptors/HttpLoggingInterceptor.java @@ -33,7 +33,6 @@ public class HttpLoggingInterceptor implements Interceptor { private static final Charset UTF8 = Charset.forName("UTF-8"); - private Map headers; public enum Level { /** @@ -111,16 +110,6 @@ public class HttpLoggingInterceptor implements Interceptor { this(Logger.DEFAULT); } - /** - * 设置请求Header - * - * @param headers header 集合 - */ - public HttpLoggingInterceptor(Map headers) { - this(Logger.DEFAULT); - this.headers = headers; - } - public HttpLoggingInterceptor(Logger logger) { this.logger = logger; } @@ -148,7 +137,7 @@ public class HttpLoggingInterceptor implements Interceptor { RuanseeApplication.getAppCache().setUserInfo(s); } requestBuilder.addHeader("userInfo", RuanseeApplication.getAppCache().getUserInfo()); - String se = requestS.url().toString(); +// String se = requestS.url().toString(); // if (StringUtil.hasContent(se)) { // if (!se.endsWith(".jpg") && !se.endsWith(".png")&&!se.contains("wzt")){ // se = se.replace("http://" + RuanseeApplication.getAppCache().getIp() + ":8081/", RuanseeApplication.getAppCache().getBaseUrlPath()); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/util/BluetoothManage.java b/app/src/main/java/com/ycgis/macall/personalcenter/util/BluetoothManage.java new file mode 100644 index 0000000..2c2c3de --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/util/BluetoothManage.java @@ -0,0 +1,383 @@ +package com.ycgis.macall.personalcenter.util; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothSocket; +import android.bluetooth.le.BluetoothLeScanner; +import android.bluetooth.le.ScanCallback; +import android.bluetooth.le.ScanResult; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.rs.macall.androidx.basemodel.callback.SimpleListClickListener; +import com.rs.macall.androidx.basemodel.decoration.MyDividerItemDecoration; +import com.rs.macall.androidx.basemodel.utils.BitMapUtils; +import com.rs.macall.androidx.basemodel.utils.LogUtils; +import com.ycgis.macall.personalcenter.R; +import com.ycgis.macall.personalcenter.m.adapterbean.BluetoothOV; +import com.ycgis.macall.personalcenter.m.datamodel.PrintModel; +import com.ycgis.macall.personalcenter.m.provider.BluetoothBroadcastReceiver; +import com.ycgis.macall.personalcenter.v.adapter.BluetoothListAdapter; + +import org.greenrobot.eventbus.EventBus; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +/** + * created by: Macall + * create time: 2025/5/29 11:22 + * copyright: @ruansee.com + * Describe: + */ +public class BluetoothManage { + private static BluetoothManage bluetoothManage; + public final static int REQUEST_OPEN_BLUETOOTH = 0x142; + private BluetoothAdapter bluetoothAdapter; + + private BluetoothSocket bluetoothSocket; + private OutputStream outputStream; + private InputStream inputStream; + private BluetoothBroadcastReceiver receiver; + + private CallBack callBack; + + // SPP UUID + private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); + + public void setCallBack(CallBack callBack) { + this.callBack = callBack; + } + + private BluetoothManage() { + + } + + + public static BluetoothManage getInstance() { + if (bluetoothManage == null) { + synchronized (BluetoothManage.class) { + if (bluetoothManage == null) { + bluetoothManage = new BluetoothManage(); + } + } + } + return bluetoothManage; + } + + /** + * 设备是否支持蓝牙 + * + * @return + */ + public boolean init() { + bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (bluetoothAdapter == null) { + // 设备不支持蓝牙 + return false; + } + return true; + } + + // 发送数据 + public boolean sendData(List dataList) { + if (outputStream != null) { + if (dataList == null) return false; + try { + for (int i = 0; i < dataList.size(); i++) { + PrintModel printModel = dataList.get(i); + if (printModel.getPrintType() == 1) { + outputStream.write(printModel.getContent().getBytes("GBK")); // 部分打印机需GBK编码 + } else if (printModel.getPrintType() == 2) { + Bitmap bitmap = generateQRCode(printModel.getContent(), 100); + if (bitmap == null) continue; + outputStream.write(decodeBitmap(bitmap)); // 部分打印机需GBK编码 + } else if (printModel.getPrintType() == 3) { + Bitmap bitmap = BitMapUtils.base64ToBitmap(printModel.getContent()); + if (bitmap == null) continue; + outputStream.write(decodeBitmap(bitmap)); // 部分打印机需GBK编码 + } + } + outputStream.flush(); + return true; + } catch (IOException | WriterException e) { + e.printStackTrace(); + } + } + return false; + } + + /** + * 判断蓝牙是否打开 + * + * @param activity + * @return 打开 true false 未打开,并跳转设置页面 + */ + public boolean isBluetoothOpen(Activity activity, boolean isSkipSetting) { + if (!bluetoothAdapter.isEnabled()) { + if (isSkipSetting) { + Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); + activity.startActivityForResult(enableBtIntent, REQUEST_OPEN_BLUETOOTH); + } + return false; + } + return true; + } + + + // 连接指定MAC地址的打印机 + public boolean connect(String macAddress) { + if (bluetoothAdapter == null) return false; + BluetoothDevice device = bluetoothAdapter.getRemoteDevice(macAddress); + try { + bluetoothSocket = device.createRfcommSocketToServiceRecord(SPP_UUID); + bluetoothSocket.connect(); + outputStream = bluetoothSocket.getOutputStream(); + return true; + } catch (IOException e) { + e.printStackTrace(); + close(); + return false; + } + } + + public boolean SPPOpen(BluetoothDevice myDevice) { + boolean error = false; + bluetoothAdapter = bluetoothAdapter; + + if (!bluetoothAdapter.isEnabled()) { + if (callBack != null) { + callBack.onConnect(false, "蓝牙适配器没有打开"); + } + return false; + } + bluetoothAdapter.cancelDiscovery(); + + try { + //bluetoothSocket = myDevice.createRfcommSocketToServiceRecord(SPP_UUID); + Method m = myDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); + bluetoothSocket = (android.bluetooth.BluetoothSocket) m.invoke(myDevice, 1); + } catch (SecurityException | IllegalArgumentException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + bluetoothSocket = null; + if (callBack != null) { + callBack.onConnect(false, "蓝牙端口错误"); + } + return false; + } + + try { + bluetoothSocket.connect(); + } catch (IOException e2) { + if (callBack != null) { + callBack.onConnect(false, e2.getLocalizedMessage()); + } + bluetoothSocket = null; + return false; + } + + try { + outputStream = bluetoothSocket.getOutputStream(); + } catch (IOException e3) { + outputStream = null; + error = true; + return false; + } + + try { + inputStream = bluetoothSocket.getInputStream(); + } catch (IOException e3) { + inputStream = null; + error = true; + return false; + } + + if (error) { + //SPPClose(); + return false; + } + + return true; + } + + public boolean disconnect() { + if (!SPPClose()) + return false; + return true; + } + + private boolean SPPClose() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + if (outputStream != null) { + try { + outputStream.flush(); + } catch (IOException e1) { + } + try { + outputStream.close(); + } catch (IOException e) { + } + outputStream = null; + } + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + } + inputStream = null; + } + if (bluetoothSocket != null) { + try { + bluetoothSocket.close(); + } catch (IOException e) { + } + bluetoothSocket = null; + } + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + return true; + } + + + // 检查是否已连接 + public boolean isConnected() { + return bluetoothSocket != null && bluetoothSocket.isConnected(); + } + + // 断开连接 + public void close() { + try { + if (outputStream != null) outputStream.close(); + if (bluetoothSocket != null) bluetoothSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + outputStream = null; + bluetoothSocket = null; + } + + public BluetoothBroadcastReceiver getReceiver() { + if (receiver == null) { + receiver = new BluetoothBroadcastReceiver(); + } + return receiver; + } + + public void searchBluetoothList(ScanCallback callback) { + if (callback == null) return; + BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); + if (bluetoothLeScanner != null) { + stop(callback); + bluetoothAdapter.getBluetoothLeScanner().startScan(callback); + } + } + + public void stop(ScanCallback callback) { + if (callback == null) return; + BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); + if (bluetoothLeScanner != null) { + bluetoothLeScanner.stopScan(callback); + } + } + + + /** + * 生成二位码图片 + * + * @param content + * @param size + * @return + * @throws WriterException + */ + public Bitmap generateQRCode(String content, int size) throws WriterException { + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, size, size); + Bitmap bmp = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565); + for (int x = 0; x < size; x++) { + for (int y = 0; y < size; y++) { + bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE); + } + } + return bmp; + } + + /** + * 位图转换 + * + * @param bmp + * @return + */ + public byte[] decodeBitmap(Bitmap bmp) { + int width = bmp.getWidth(); + int height = bmp.getHeight(); + int[] pixels = new int[width * height]; + bmp.getPixels(pixels, 0, width, 0, 0, width, height); + + // 生成 ESC/POS 位图指令 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + baos.write(0x1D); + baos.write(0x76); + baos.write(0x30); + baos.write(0x00); + baos.write(width / 8); // 宽度(以8为单位) + baos.write(0x00); + baos.write(height % 256); // 高度低字节 + baos.write(height / 256); // 高度高字节 + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x += 8) { + byte b = 0; + for (int n = 0; n < 8; n++) { + int pixel = pixels[y * width + x + n]; + int gray = (Color.red(pixel) + Color.green(pixel) + Color.blue(pixel)) / 3; + if (gray < 128) { + b |= (1 << (7 - n)); + } + } + baos.write(b); + } + } + return baos.toByteArray(); + } + + + public interface CallBack { + + void onConnect(boolean connect, String msg); + + void onPrintSuccess(); + + void onPrintFail(String msg); + + } + +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/util/FileUtils.java b/app/src/main/java/com/ycgis/macall/personalcenter/util/FileUtils.java index f3ae679..ab11910 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/util/FileUtils.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/util/FileUtils.java @@ -181,6 +181,11 @@ public class FileUtils { } } + /** + * 计算文件 + * @param file 文件 + * @return 大小单位Bit + */ public static long calculateFileSize(File file) { long totals = 0; if (!file.exists()) return 0; diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/util/LocationGPSManage.java b/app/src/main/java/com/ycgis/macall/personalcenter/util/LocationGPSManage.java index 4dfe602..027b84a 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/util/LocationGPSManage.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/util/LocationGPSManage.java @@ -68,6 +68,7 @@ public class LocationGPSManage implements LifecycleObserver { } private LocationGPSManage() { + } /** diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/util/ReadDeviceInfo.java b/app/src/main/java/com/ycgis/macall/personalcenter/util/ReadDeviceInfo.java index 6e2d600..38d1a76 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/util/ReadDeviceInfo.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/util/ReadDeviceInfo.java @@ -5,6 +5,7 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; +import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -26,6 +27,24 @@ import java.lang.reflect.Method; public class ReadDeviceInfo { private static final String TAG = "ReadDeviceInfo"; + + public static String getOAID(Context context) { + String oaid = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + oaid = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + } else { + oaid = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + } + //处理获取到的OAID + if (oaid == null || oaid.isEmpty()) { + // OAID获取失败 + } else { + // 成功获取到OAID,进行后续操作 + } + return oaid; + } + + /** * 获取默认的imei 一般都是IMEI 1 * diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/util/SearchHistoryUtils.java b/app/src/main/java/com/ycgis/macall/personalcenter/util/SearchHistoryUtils.java index 1b3e928..0a00159 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/util/SearchHistoryUtils.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/util/SearchHistoryUtils.java @@ -10,6 +10,7 @@ import com.ycgis.macall.personalcenter.p.app.RuanseeApplication; * copyright: @ruansee.com * Describe: */ +@Deprecated public class SearchHistoryUtils { public static final String SEARCH_HISTORY = "searchHistory"; diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/util/ToThirdPartyAppUtils.java b/app/src/main/java/com/ycgis/macall/personalcenter/util/ToThirdPartyAppUtils.java index dc25965..d4d90f2 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/util/ToThirdPartyAppUtils.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/util/ToThirdPartyAppUtils.java @@ -220,14 +220,8 @@ public class ToThirdPartyAppUtils implements LifecycleObserver { param.put("deptId", RuanseeApplication.getUserData().getDeptCode()); param.put("deptName", RuanseeApplication.getUserData().getDeptName()); param.put("type", operatorType); - String url = "http://192.168.43.183:8081/wzt/app/v1/zamh/addOperationRecords"; +// String url = "http://192.168.43.183:8081/wzt/app/v1/zamh/addOperationRecords"; - Object appId1 = param.get("appId"); - if (appId1 instanceof Long){ - long id = (long) appId1; - }else if(appId1 instanceof Integer) { - int id = (int) appId1; - } // MediaType mediaType = MediaType.parse("application/json;charset=utf-8"); MediaType mediaType = MediaType.Companion.parse("application/json;charset=utf-8"); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/AboutActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/AboutActivity.java index ef1a908..7f68bbb 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/AboutActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/AboutActivity.java @@ -8,8 +8,11 @@ import android.os.Bundle; import androidx.annotation.NonNull; +import com.anhui.police.market.callback.AbstractMarketResult; +import com.anhui.police.market.sdk.MarketConfigure; import com.fri.libfriapkrecord.read.SignRecordTools; import com.rs.macall.androidx.basemodel.base.BaseViewBindActivity; +import com.rs.macall.androidx.basemodel.utils.LogUtils; import com.rs.macall.androidx.basemodel.utils.StringUtil; import com.rs.macall.androidx.basemodel.utils.ToastUtil; import com.ycgis.macall.personalcenter.R; @@ -68,14 +71,42 @@ public class AboutActivity extends BaseViewBindActivity { viewBinding.aboutVersionNum.setText(version[0]); viewBinding.aboutVersionName.setText("V " + version[1]); String recordNumber = RuanseeApplication.getStringValue("NRRecordNumber"); - if (StringUtil.isNullOrEmpty(recordNumber)||recordNumber.contains("应用未备案")||recordNumber.contains("未获取")){ + if (StringUtil.isNullOrEmpty(recordNumber) || recordNumber.contains("应用未备案") || recordNumber.contains("未获取")) { //读取备案号 String apkPath = getNativeApkPath(getApplicationContext()); recordNumber = SignRecordTools.readNumbers(apkPath); - RuanseeApplication.saveData("NRRecordNumber",recordNumber); + RuanseeApplication.saveData("NRRecordNumber", recordNumber); } - viewBinding.tvBah.setText(String.format("全国注册备案号:%s",recordNumber)); -// jsdx(); + viewBinding.tvBah.setText(String.format("全国注册备案号:%s", recordNumber)); + + //3.0.20240111 没有添加检测更新 + MarketConfigure.detectAppUpdates(this, false, "", new AbstractMarketResult() { + @Override + public void onResult(String result, boolean upgrade) { + LogUtils.w(result); + } + + @Override + public void onConfirm(int stateType) { + LogUtils.w("stateType:" + stateType); + + } + + @Override + public void onCancel() { + LogUtils.w("onCancel"); + } + + @Override + public void onWarning() { + LogUtils.w("onWarning"); + } + + @Override + public void onResult(String result) { + LogUtils.w(result); + } + }); } //获取系统内APK文件路径 @@ -96,24 +127,24 @@ public class AboutActivity extends BaseViewBindActivity { private void jsdx() { Observable.create(emitter -> { String s = FileUtils.initFilePath(getContext()); - File file = new File(s); - if (!file.exists()){ + File file = new File(s); + if (!file.exists()) { throw new FileNotFoundException("没有找到指定文件夹"); } long l = FileUtils.calculateFileSize(file); - emitter.onNext("缓存文件大小: "+FileUtils.formatFileSize(l, FileUtils.FileSizeFormType.M)); + emitter.onNext("缓存文件大小: " + FileUtils.formatFileSize(l, FileUtils.FileSizeFormType.M)); emitter.onComplete(); }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new ResultObserver("") { @Override protected void onNext(String identifierKey, @NotNull Object data) { - ToastUtil.centered(getContext(),data.toString()); + ToastUtil.centered(getContext(), data.toString()); } @Override public void onError(@NotNull Throwable e) { - ToastUtil.centered(getContext(),e.getMessage()); + ToastUtil.centered(getContext(), e.getMessage()); } @Override diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/BluetoothActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/BluetoothActivity.java new file mode 100644 index 0000000..9fcbb95 --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/BluetoothActivity.java @@ -0,0 +1,234 @@ +package com.ycgis.macall.personalcenter.v.activity; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.util.Log; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.rs.macall.androidx.basemodel.base.BaseViewBindActivity; +import com.rs.macall.androidx.basemodel.callback.SimpleListClickListener; +import com.rs.macall.androidx.basemodel.decoration.MyDividerItemDecoration; +import com.rs.macall.androidx.basemodel.utils.ToastUtil; +import com.ycgis.macall.personalcenter.R; +import com.ycgis.macall.personalcenter.databinding.ActivityBluetoothBinding; +import com.ycgis.macall.personalcenter.m.datamodel.PrintModel; +import com.ycgis.macall.personalcenter.util.BluetoothManage; +import com.ycgis.macall.personalcenter.v.adapter.BluetoothListAdapter; +import com.ycgis.zpSDK.BluetoothSocket; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class BluetoothActivity extends BaseViewBindActivity { + public static final String EXTRA_BLUETOOTH_DEVICE_ADDRESS = "Bluetooth Device Adrress"; + public static final String EXTRA_BLUETOOTH_DEVICE_NAME = "Bluetooth Device Name"; + + public String TAG = "zpSDK"; + public BluetoothAdapter btAdapter = null; + private BluetoothListAdapter listAdapter1, listAdapter2; + private List pdDataList = new ArrayList<>(), searchDataList = new ArrayList<>(); + + private boolean isLinkPrinter = false; + + @Override + protected ActivityBluetoothBinding getViewBinding() { + return ActivityBluetoothBinding.inflate(getLayoutInflater()); + } + + @Override + protected void init() { + viewBinding.rvSearchList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + viewBinding.rvSearchList.addItemDecoration(new MyDividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); + viewBinding.rvYpd.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + viewBinding.rvYpd.addItemDecoration(new MyDividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); + viewBinding.btnSearch.setVisibility(View.VISIBLE); + viewBinding.searchProgress.setVisibility(View.GONE); + viewBinding.btnSearch.setOnClickListener(customClickListener); + } + + @Override + protected void readInstanceState(Bundle savedInstanceState) { + + } + + @Override + protected void start() { + viewBinding.baseTitle.contentTitle.setText("蓝牙测试"); + viewBinding.baseTitle.leftImage.setImageDrawable(getDrawables(R.drawable.back_cliener)); + boolean init = BluetoothManage.getInstance().init(); + if (!init) { + ToastUtil.centered(getContext(), "当前设备不支持蓝牙!"); + return; + } + if (!BluetoothManage.getInstance().isBluetoothOpen(getActivity(), true)) { + ToastUtil.centered(getContext(), "请先打开蓝牙!"); + return; + } + btAdapter = BluetoothAdapter.getDefaultAdapter(); + + bonded_devices_get(); + + //register broadcast receiver + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothDevice.ACTION_FOUND); + filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); + filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); + filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + registerReceiver(mBroadcastReceiver, filter); + } + + @Override + protected void bindViewClick(View v) { + if (v.getId() == R.id.titleleft) { + finish(); + return; + } + + if (v.getId() == R.id.btn_search) { + discovry_do(); + return; + } + + if (v.getId() == R.id.btn_printer) { + //{"content":"二维码内容","printType":2},{"content":"base64","printType":3} + String prContent = "[{\"content\":\"皖A97B21\n\",\"printType\":1},{\"content\":\"测试全部中文\",\"printType\":2}]"; + Type type = new TypeToken>() { + }.getType(); + List data = new Gson().fromJson(prContent, type); + boolean b = BluetoothSocket.getInstance().sendData(data); + if (b) { + ToastUtil.centered(getContext(),"打印完成"); + } else { + ToastUtil.centered(getContext(),"打印失败"); +// mAgentWeb.getJsAccessEntrace().quickCallJs("callBluetoothError", "-4", "打印失败!"); + } + } + + } + + //get the Bonded devices + //获取配对列表 + private void bonded_devices_get() { + pdDataList.clear(); + Set PairedDevices = btAdapter.getBondedDevices(); + if (PairedDevices.size() > 0) { + for (BluetoothDevice device : PairedDevices) { +// String device_info = device.getName()+"\n"+device.getAddress(); + pdDataList.add(device); + } + } + initDataPd(); + } + + private void lk(BluetoothDevice device) { + baseShowDialog("正在链接"); + if (!BluetoothSocket.getInstance().ConnectPrinter(device.getAddress())) { + //Toast.makeText(this, "Connect Fail", Toast.LENGTH_SHORT).show(); + baseDismissDialog(); + viewBinding.tvPrinter.setText("链接失败"); + viewBinding.btnPrinter.setVisibility(View.GONE); + isLinkPrinter = false; + } else { + baseDismissDialog(); + viewBinding.tvPrinter.setText("已连接:" + device.getName()); + viewBinding.btnPrinter.setVisibility(View.VISIBLE); + viewBinding.btnPrinter.setOnClickListener(customClickListener); + isLinkPrinter = true; + } + } + + private void initDataPd() { + if (listAdapter1 == null) { + listAdapter1 = new BluetoothListAdapter(getContext(), pdDataList); + viewBinding.rvYpd.setAdapter(listAdapter1); + listAdapter1.setListClickListener(new SimpleListClickListener() { + @Override + public void onSingleClick(View v, int pointer) { + lk(listAdapter1.getDataItem(pointer)); + } + }); + } else { + listAdapter1.upData(pdDataList); + } + } + + /* + * 获取蓝牙设备,并开始搜索设备 + */ + //search BlueTooth devices + private void discovry_do() { + Log.d("BT", "-----------discovry_do---------"); + if (!btAdapter.isEnabled()) { + btAdapter.enable(); + while (btAdapter.getState() != BluetoothAdapter.STATE_ON) ; + } +// setProgressBarIndeterminateVisibility(true); +// setTitle("Search devices..."); + //获取蓝牙设备,并开始搜索设备 + if (btAdapter.isDiscovering()) { + Log.d("BT", "-----------btAdapter.cancelDiscovery()---------"); + btAdapter.cancelDiscovery(); + } + Log.d("BT", "-----------btAdapter.startDiscovery()---------"); + btAdapter.startDiscovery(); + Log.d("BT", "-----------btAdapter.startDiscovery()+END---------"); + + viewBinding.btnSearch.setVisibility(View.GONE); + viewBinding.searchProgress.setVisibility(View.VISIBLE); + } + + BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // TODO Auto-generated method stub + String action = intent.getAction(); + Log.d("BT", "----------onReceive----------" + action); + if (BluetoothDevice.ACTION_FOUND.equals(action)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (device.getBondState() != BluetoothDevice.BOND_BONDED) { + initSearch(device); + } + } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { + setProgressBarIndeterminateVisibility(false); + setTitle("Choose Device"); + viewBinding.btnSearch.setVisibility(View.VISIBLE); + viewBinding.searchProgress.setVisibility(View.GONE); + } + } + }; + + @Override + protected void onDestroy() { + super.onDestroy(); + unregisterReceiver(mBroadcastReceiver); + } + + private void initSearch(BluetoothDevice device) { + if (listAdapter2 == null) { + searchDataList.add(device); + listAdapter2 = new BluetoothListAdapter(getContext(), searchDataList); + viewBinding.rvSearchList.setAdapter(listAdapter2); + + listAdapter2.setListClickListener(new SimpleListClickListener() { + @Override + public void onSingleClick(View v, int pointer) { + lk(listAdapter2.getDataItem(pointer)); + } + }); + } else { + listAdapter2.addItem(device); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MainActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MainActivity.java index 4779d6b..928d45e 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MainActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MainActivity.java @@ -33,6 +33,7 @@ import com.rs.macall.androidx.basemodel.utils.ToastUtil; import com.ycgis.macall.personalcenter.R; import com.ycgis.macall.personalcenter.databinding.ActivityMainBinding; import com.ycgis.macall.personalcenter.p.app.RuanseeApplication; +import com.ycgis.macall.personalcenter.p.presenter.BtnSkip; import com.ycgis.macall.personalcenter.p.request.CommonCompositeManage; import com.ycgis.macall.personalcenter.p.rxjava.ResultObserver; import com.ycgis.macall.personalcenter.p.service.GetMessageService; @@ -52,7 +53,8 @@ import static android.app.Notification.EXTRA_CHANNEL_ID; import static android.provider.Settings.EXTRA_APP_PACKAGE; public class MainActivity extends BaseViewBindActivity { - + private BtnSkip btnSkip; + private int lastIndex = 0; @Override protected ActivityMainBinding getViewBinding() { @@ -89,6 +91,12 @@ public class MainActivity extends BaseViewBindActivity { switchMainButton(viewBinding.mainPageView.getCurrentItem()); } }); + btnSkip = new BtnSkip(getContext()); + btnSkip.setTextColor(R.color.bull,R.color.colorGrey5); + btnSkip.add(0,btnSkip.new Content(viewBinding.mainTvBottom1,viewBinding.mainIvBottom1,R.drawable.icon_main_home,R.drawable.icon_main_home_def)); + btnSkip.add(1,btnSkip.new Content(viewBinding.mainTvBottom2,viewBinding.mainIvBottom2,R.drawable.icon_main_message,R.drawable.icon_main_message_def)); + btnSkip.add(2,btnSkip.new Content(viewBinding.mainTvBottom3,viewBinding.mainIvBottom3,R.drawable.icon_main_work,R.drawable.icon_main_work_def)); + btnSkip.add(3,btnSkip.new Content(viewBinding.mainTvBottom4,viewBinding.mainIvBottom4,R.drawable.icon_main_my,R.drawable.icon_main_my_def)); } @Override @@ -256,54 +264,59 @@ public class MainActivity extends BaseViewBindActivity { startActivity(new Intent(getContext(), MyDetailsActivity.class)); } + //核查个人中心对接新警综 + public void onJumpMessage(View view) { viewBinding.mainPageView.setCurrentItem(1); switchMainButton(1); } private void switchMainButton(int buttonNum) { - switch (buttonNum) { - case 0: - viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home)); - viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message_def)); - viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work_def)); - viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my_def)); - viewBinding.mainTvBottom1.setTextColor(getColors(R.color.blue)); - viewBinding.mainTvBottom2.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom3.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom4.setTextColor(getColors(R.color.colorGrey5)); - break; - case 1: - viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home_def)); - viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message)); - viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work_def)); - viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my_def)); - viewBinding.mainTvBottom1.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom2.setTextColor(getColors(R.color.blue)); - viewBinding.mainTvBottom3.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom4.setTextColor(getColors(R.color.colorGrey5)); - break; - case 2: - viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home_def)); - viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message_def)); - viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work)); - viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my_def)); - viewBinding.mainTvBottom1.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom2.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom3.setTextColor(getColors(R.color.blue)); - viewBinding.mainTvBottom4.setTextColor(getColors(R.color.colorGrey5)); - break; - case 3: - viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home_def)); - viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message_def)); - viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work_def)); - viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my)); - viewBinding.mainTvBottom1.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom2.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom3.setTextColor(getColors(R.color.colorGrey5)); - viewBinding.mainTvBottom4.setTextColor(getColors(R.color.blue)); - break; - } + btnSkip.unDateStatus(lastIndex,false); + btnSkip.unDateStatus(buttonNum,true); + lastIndex = buttonNum; +// switch (buttonNum) { +// case 0: +// viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home)); +// viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message_def)); +// viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work_def)); +// viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my_def)); +// viewBinding.mainTvBottom1.setTextColor(getColors(R.color.blue)); +// viewBinding.mainTvBottom2.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom3.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom4.setTextColor(getColors(R.color.colorGrey5)); +// break; +// case 1: +// viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home_def)); +// viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message)); +// viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work_def)); +// viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my_def)); +// viewBinding.mainTvBottom1.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom2.setTextColor(getColors(R.color.blue)); +// viewBinding.mainTvBottom3.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom4.setTextColor(getColors(R.color.colorGrey5)); +// break; +// case 2: +// viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home_def)); +// viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message_def)); +// viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work)); +// viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my_def)); +// viewBinding.mainTvBottom1.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom2.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom3.setTextColor(getColors(R.color.blue)); +// viewBinding.mainTvBottom4.setTextColor(getColors(R.color.colorGrey5)); +// break; +// case 3: +// viewBinding.mainIvBottom1.setImageDrawable(getDrawables(R.drawable.icon_main_home_def)); +// viewBinding.mainIvBottom2.setImageDrawable(getDrawables(R.drawable.icon_main_message_def)); +// viewBinding.mainIvBottom3.setImageDrawable(getDrawables(R.drawable.icon_main_work_def)); +// viewBinding.mainIvBottom4.setImageDrawable(getDrawables(R.drawable.icon_main_my)); +// viewBinding.mainTvBottom1.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom2.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom3.setTextColor(getColors(R.color.colorGrey5)); +// viewBinding.mainTvBottom4.setTextColor(getColors(R.color.blue)); +// break; +// } } private boolean isExit = false; diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MyDetailsActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MyDetailsActivity.java index 3183b61..4bf8bef 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MyDetailsActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/MyDetailsActivity.java @@ -79,7 +79,6 @@ import top.zibin.luban.OnCompressListener; public class MyDetailsActivity extends BaseViewBindActivity implements PermissionListener { private InputDialog inputDialog; - private TextView tvUpdate; private MyDetailsViewModel viewModel; private String imei = "", imsi = ""; private File photoFile; @@ -100,6 +99,9 @@ public class MyDetailsActivity extends BaseViewBindActivity() { @Override public void onChanged(BaseBean baseBean) { @@ -226,10 +225,10 @@ public class MyDetailsActivity extends BaseViewBindActivity needPermissions = new ArrayList<>(); + needPermissions.add(Manifest.permission.CAMERA); + needPermissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + needPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); + needPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + needPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); + needPermissions.add(Manifest.permission.READ_PHONE_STATE); + needPermissions.add(Manifest.permission.CALL_PHONE); + needPermissions.add(Manifest.permission.ACCESS_NETWORK_STATE); + + if (Build.VERSION.SDK_INT >= 31) { + needPermissions.add("android.permission.BLUETOOTH_SCAN"); + needPermissions.add("android.permission.BLUETOOTH_CONNECT"); + needPermissions.add("android.permission.BLUETOOTH_ADVERTISE"); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(needPermissions, this); } else { @@ -232,7 +252,7 @@ public class OpenAppActivity extends BaseViewBindActivity { if (StringUtil.isNullOrEmpty(url1)) { - ToastUtil.centered(getContext(), "下载链接为空,请检查链接是否真实!"); + ToastUtil.showTest(getContext(), "下载链接为空,请检查链接是否真实!"); return; } String s1 = url1.toLowerCase(); if (!s1.startsWith("http://") && !s1.startsWith("https://")) { - ToastUtil.centered(getContext(), "URL缺少请求头,将默认使用Http协议下载"); + ToastUtil.showTest(getContext(), "URL缺少请求头,将默认使用Http协议下载"); url1 = "http://" + url1; } - String fileName = ""; if (StringUtil.hasContent(contentDisposition)) { String[] split = contentDisposition.split("="); @@ -413,7 +441,6 @@ public class OpenAppActivity extends BaseViewBindActivity jm.length()) { @@ -456,37 +483,39 @@ public class OpenAppActivity extends BaseViewBindActivity>() { + }.getType(); + List data = new Gson().fromJson(json, type); + boolean b = BluetoothSocket.getInstance().sendData(data); + if (b) { + ToastUtil.centered(getContext(),"打印完成"); + mAgentWeb.getJsAccessEntrace().quickCallJs("callBluetoothResult", "2", "打印完成!"); + } else { + ToastUtil.centered(getContext(),"打印失败"); + mAgentWeb.getJsAccessEntrace().quickCallJs("callBluetoothError", "-4", "打印失败!"); + } + } } + private void openBluetoothFragment() { +// 在Activity中 + BluetoothDialogFragment dialog = new BluetoothDialogFragment(); + dialog.setBluetoothFragmentListener(new BluetoothFragmentListener() { + @Override + public void onClickBluetoothDevice(BluetoothDevice device) { + linkBluetooth(device); + } + + @Override + public void onError(int code, String msg) { + mAgentWeb.getJsAccessEntrace().quickCallJs("callBluetoothError", code+"",msg); + } + }); + dialog.show(getSupportFragmentManager(), "MyDialog"); + } + + private boolean isLinkPrinter = false; + + /* + *链接蓝牙 + */ + private void linkBluetooth(BluetoothDevice device) { + baseShowDialog("正在链接"); + if (!BluetoothSocket.getInstance().ConnectPrinter(device.getAddress())) { + ToastUtil.centered(getContext(),"蓝牙连接失败"); + //Toast.makeText(this, "Connect Fail", Toast.LENGTH_SHORT).show(); + baseDismissDialog(); + mAgentWeb.getJsAccessEntrace().quickCallJs("callBluetoothError", "-3", "蓝牙连接失败!"); + isLinkPrinter = false; + } else { + ToastUtil.centered(getContext(),"蓝牙已连接"); + mAgentWeb.getJsAccessEntrace().quickCallJs("callBluetoothResult", "1", "蓝牙已连接!"); + baseDismissDialog(); + isLinkPrinter = true; + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/StartActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/StartActivity.java index 6dc40f9..936c81d 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/StartActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/StartActivity.java @@ -16,6 +16,8 @@ import com.anhui.police.auth.sdk.AuthType; import com.anhui.police.auth.sdk.callback.IAuthTaskType; import com.anhui.police.auth.sdk.callback.IAuthUserListener; +import com.base.code.binary.Base64; + import com.rs.macall.androidx.basemodel.base.BaseViewBindActivity; import com.rs.macall.androidx.basemodel.callback.PermissionListener; @@ -123,8 +125,8 @@ public class StartActivity extends BaseViewBindActivity im imei = ReadDeviceInfo.getDeviceId(getContext()); if (StringUtil.isNullOrEmpty(imei)) { imei = ReadDeviceInfo.getIMEI1(getContext()); - RuanseeApplication.getAppCache().setImei(imei); } + RuanseeApplication.getAppCache().setImei(imei); } String imsi = RuanseeApplication.getAppCache().getImsi(); if (StringUtil.isNullOrEmpty(imsi)) { @@ -134,13 +136,24 @@ public class StartActivity extends BaseViewBindActivity im } RuanseeApplication.getAppCache().setImsi(imsi); } + +// if(StringUtil.isNullOrEmpty(imei)){ +// imei = DeviceIdentifier.getIMEI(this);; +// } +// //5eb3e978a849befa +// String oaid = ReadDeviceInfo.getOAID(getContext()); +// if ( DeviceID.supportedOAID(this)){ +// oaid = DeviceIdentifier.getOAID(this); +// } +// LogUtils.w("oaid",oaid); +// ToastUtil.centered(getContext(),String.format(" IMEI = %S || imsi = %S || oaid = %S ",imei,imsi,oaid)); } private void setFormal() { // RuanseeApplication.getAppCache().setIpAndPort("192.168.43.183", "8081"); RuanseeApplication.getAppCache().setIpAndPort("20.90.2.2", "80"); // getAccessToken(); - if (RuanseeApplication.isHFVersion) { +// if (RuanseeApplication.isHFVersion) { // PService ps = new PService(this); // try { // viewBinding.tvLoadMsg.setText("单点登录成功!"); @@ -160,7 +173,7 @@ public class StartActivity extends BaseViewBindActivity im // viewBinding.tvLoadMsg.setText("用户登录失败!获取用户失败!"); // ysFinish(); // } - } else { +// } else { boolean isUpdateAuthType = RuanseeApplication.getBooleanValue("isUpdateAuthType", false); if (isUpdateAuthType) { AuthSDK sdk = AuthSDK.getDefault(); @@ -177,7 +190,7 @@ public class StartActivity extends BaseViewBindActivity im } else { AuthSDK.getDefault().getToken(0.8f, iTokenListener); } - } +// } } private IAuthUserListener iTokenListener = new IAuthUserListener() { @@ -251,10 +264,14 @@ public class StartActivity extends BaseViewBindActivity im } userData.setIp(RuanseeApplication.getAppCache().getLocalIp()); ApiModel.uploadOperationLog("3","3","用户登录应用"); - String substring = RuanseeApplication.getUserData().getDeptCode().substring(0, 4); RuanseeApplication.getUserData().setDepartmentCode(substring); RuanseeApplication.getUserData().setDepartmentName(AhdsAddressUtils.getAddressNameByCode(RuanseeApplication.getUserData().getDeptCode())); + + String s = userData.toJson(); + + String s1 = Base64.encodeBase64String(s.getBytes()); + RuanseeApplication.getAppCache().setUserInfo(s1); initWatermark(); viewBinding.startMsg.setText("正在获取用户信息!"); myHandler.sendEmptyMessageDelayed(2, 800); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/ApplyForMainActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/ApplyForMainActivity.java index 440293c..2691362 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/ApplyForMainActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/ApplyForMainActivity.java @@ -29,6 +29,7 @@ import com.ycgis.macall.personalcenter.p.app.UserData; import com.ycgis.macall.personalcenter.p.callback.BaseRequestCallback; import com.ycgis.macall.personalcenter.p.request.ApiModel; import com.ycgis.macall.personalcenter.p.request.RetrofitService; +import com.ycgis.macall.personalcenter.util.AhdsAddressUtils; import com.ycgis.macall.personalcenter.v.adapter.ApplyForMainAdapter; import org.jetbrains.annotations.NotNull; @@ -44,10 +45,12 @@ import java.util.Map; public class ApplyForMainActivity extends BaseViewBindActivity { private ApplyForMainAdapter applyForMainAdapter; + //TODO 正式环境地址 public static final String BASE_PHOTO_URL = "http://20.90.2.2"; public static final String BASE_URL = BASE_PHOTO_URL + "/yysq_app_out/"; -// public static final String BASE_PHOTO_URL = "http://192.168.0.110:8086"; + //TODO 测试环境地址 +// public static final String BASE_PHOTO_URL = "http://192.168.0.109:8086"; // public static final String BASE_URL = BASE_PHOTO_URL + "/app/"; private Map actionBeanMap; @@ -93,6 +96,8 @@ public class ApplyForMainActivity extends BaseViewBindActivity { @@ -22,7 +21,7 @@ public class ApplyProcessActivity extends BaseViewBindActivity finish()); } @Override diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/InitiateApplyForActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/InitiateApplyForActivity.java index 1517e72..e3089e8 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/InitiateApplyForActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/InitiateApplyForActivity.java @@ -41,11 +41,15 @@ import okhttp3.RequestBody; */ public class InitiateApplyForActivity extends BaseViewBindActivity { /** + * 弃用 * 用于缓存选择的用户和角色。 * key:应用ID * value : {"应用名称","角色名"} */ - private Map selectValue; +// @Deprecated +// private Map selectValue; + + private String[] selectCount; private String selectData; private String appId; @@ -90,8 +94,8 @@ public class InitiateApplyForActivity extends BaseViewBindActivity(); - selectValue.put(appId,new String[]{bean.getSysName(),bean.getRoleName()}); +// selectValue = new HashMap<>(); +// selectValue.put(appId,new String[]{bean.getSysName(),bean.getRoleName()}); } }else { viewBinding.btnSelectApp.setOnClickListener(customClickListener); @@ -126,36 +130,44 @@ public class InitiateApplyForActivity extends BaseViewBindActivity>() { - }.getType(); - try { - Map selectValues = new Gson().fromJson(selectData, type); - if (selectValues==null){ - ToastUtil.centered(getContext(),"Type conversion exception"); - return; - } - if (selectValue!=null){ - selectValue.clear(); - } - selectValue = selectValues; - Set strings = selectValue.keySet(); - StringBuilder builder = new StringBuilder(); - String sp = ""; - for (String key : strings) { - builder.append(sp); - String[] strings1 = selectValue.get(key); - builder.append(strings1[0]); - builder.append("("); - builder.append(strings1[1]); - builder.append(")"); - sp = ";"; - } - viewBinding.tvSelectApp.setText(builder.toString()); - }catch (Exception e){ - e.printStackTrace(); - ToastUtil.centered(getContext(),"错误:"+e.getMessage()); + + selectCount = data.getStringArrayExtra("selectContent"); + if (selectCount == null||StringUtil.isContainEmpty(selectCount)){ + ToastUtil.centered(getContext(),"参数错误"); + return; } + viewBinding.tvSelectApp.setText(selectCount[1]); + +// selectData = data.getStringExtra("selectData"); +// Type type = new TypeToken>() { +// }.getType(); +// try { +// Map selectValues = new Gson().fromJson(selectData, type); +// if (selectValues==null){ +// ToastUtil.centered(getContext(),"Type conversion exception"); +// return; +// } +// if (selectValue!=null){ +// selectValue.clear(); +// } +// selectValue = selectValues; +// Set strings = selectValue.keySet(); +// StringBuilder builder = new StringBuilder(); +// String sp = ""; +// for (String key : strings) { +// builder.append(sp); +// String[] strings1 = selectValue.get(key); +// builder.append(strings1[0]); +// builder.append("("); +// builder.append(strings1[1]); +// builder.append(")"); +// sp = ";"; +// } +// viewBinding.tvSelectApp.setText(builder.toString()); +// }catch (Exception e){ +// e.printStackTrace(); +// ToastUtil.centered(getContext(),"错误:"+e.getMessage()); +// } } // if (requestCode == 1016) {//选择角色返回 // if (data == null) { @@ -187,7 +199,7 @@ public class InitiateApplyForActivity extends BaseViewBindActivity> requestData = new ArrayList<>(); - Set strings = selectValue.keySet(); +// Set strings = selectValue.keySet(); Map param = new HashMap<>(); + + param.put("roleId", selectCount[0]); + param.put("roleName", selectCount[1]); + param.put("contact", phone); param.put("reason", reason); param.put("opType", getTextString(viewBinding.spSpinner)); - for (String key : strings) { - String[] strings1 = selectValue.get(key); - Map param1 = new HashMap<>(param); - param1.put("appId", key); - param1.put("appName", strings1[0]); - param1.put("appRole", strings1[1]); - requestData.add(param1); - } +// for (String key : strings) { +// String[] strings1 = selectValue.get(key); +// Map param1 = new HashMap<>(param); +// param1.put("appId", key); +// param1.put("appName", strings1[0]); +// param1.put("appRole", strings1[1]); +// requestData.add(param1); +// } MediaType mediaType = MediaType.Companion.parse("application/json;charset=utf-8"); - RequestBody stringBody = RequestBody.Companion.create(new Gson().toJson(requestData), mediaType); + RequestBody stringBody = RequestBody.Companion.create(new Gson().toJson(param), mediaType); Map headMap = new HashMap<>(1); headMap.put("app-yysq-token", RuanseeApplication.getAppCache().getApply_token()); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/PersonnelReviewActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/PersonnelReviewActivity.java new file mode 100644 index 0000000..b322d02 --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/PersonnelReviewActivity.java @@ -0,0 +1,259 @@ +package com.ycgis.macall.personalcenter.v.activity.applyfo; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.LinearLayoutManager; + +import android.content.Intent; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.inputmethod.EditorInfo; +import android.widget.TextView; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.rs.macall.androidx.basemodel.base.BaseViewBindActivity; +import com.rs.macall.androidx.basemodel.callback.SimpleListClickListener; +import com.rs.macall.androidx.basemodel.decoration.MyDividerItemDecoration; +import com.rs.macall.androidx.basemodel.utils.LogUtils; +import com.rs.macall.androidx.basemodel.utils.SmartRefreshLayoutHelp; +import com.rs.macall.androidx.basemodel.utils.StringUtil; +import com.rs.macall.androidx.basemodel.utils.ToastUtil; +import com.rs.macall.androidx.basemodel.utils.TypConversion; +import com.scwang.smart.refresh.layout.api.RefreshLayout; +import com.scwang.smart.refresh.layout.listener.OnRefreshLoadMoreListener; +import com.ycgis.macall.personalcenter.R; +import com.ycgis.macall.personalcenter.databinding.ActivityPersonnelReviewBinding; +import com.ycgis.macall.personalcenter.m.adapterbean.ApplyBean; +import com.ycgis.macall.personalcenter.m.adapterbean.BaseBean; +import com.ycgis.macall.personalcenter.p.app.RuanseeApplication; +import com.ycgis.macall.personalcenter.p.callback.BaseRequestCallback; +import com.ycgis.macall.personalcenter.p.request.ApiModel; +import com.ycgis.macall.personalcenter.p.request.RetrofitService; +import com.ycgis.macall.personalcenter.v.adapter.InitiateRecordAdapter; + +import org.jetbrains.annotations.NotNull; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 人员审查 + */ +public class PersonnelReviewActivity extends BaseViewBindActivity { + private InitiateRecordAdapter adapter; + + private int page; + private final int pageSize = 10; + private int total; + + @Override + protected boolean isImmersiveStatusBar() { + return true; + } + + @Override + protected ActivityPersonnelReviewBinding getViewBinding() { + return ActivityPersonnelReviewBinding.inflate(getLayoutInflater()); + } + + @Override + protected void init() { + viewBinding.reviewSearch.editQuery.setHint("请输入警号姓名搜索"); + SmartRefreshLayoutHelp.setRefreshAndLoad(getContext(), viewBinding.reviewSrf); + viewBinding.reviewRv.addItemDecoration(new MyDividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL)); + viewBinding.reviewRv.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + viewBinding.reviewTitle.titleleft.setOnClickListener(v -> finish()); + viewBinding.reviewTitle.leftImage.setImageDrawable(getDrawable(R.drawable.ic_back)); + viewBinding.reviewTitle.contentTitle.setText("人员审查"); + viewBinding.reviewSearch.editQuery.setImeOptions(EditorInfo.IME_ACTION_SEARCH); + } + + @Override + protected void readInstanceState(Bundle savedInstanceState) { + + } + + @Override + protected void start() { + viewBinding.reviewSearch.editQuery.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + if (actionId == EditorInfo.IME_ACTION_SEARCH) { + String editText = getEditText(viewBinding.reviewSearch.editQuery); + searchData(editText); + return true; + } + return false; + } + }); + viewBinding.reviewSrf.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() { + @Override + public void onLoadMore(@NonNull @NotNull RefreshLayout refreshLayout) { + if (pageSize * page >= total) { + //没有gengd + refreshLayout.finishLoadMoreWithNoMoreData(); + return; + } + page++; + getData(); + } + + @Override + public void onRefresh(@NonNull @NotNull RefreshLayout refreshLayout) { + refreshLayout.resetNoMoreData(); + page = 1; + getData(); + } + }); + viewBinding.reviewSrf.autoRefresh(); + } + + private void searchData(String searchWord) { + if (StringUtil.isNullOrEmpty(searchWord)) { + ToastUtil.centered(getContext(), "请输入警号或者姓名进行搜索!"); + return; + } + viewBinding.reviewSrf.autoRefresh(); + } + + private void getData() { + String editText = getEditText(viewBinding.reviewSearch.editQuery); + Map headMap = new HashMap<>(1); + headMap.put("app-yysq-token", RuanseeApplication.getAppCache().getApply_token()); + Map param = new HashMap<>(); + param.put("pageSize", String.valueOf(pageSize)); + param.put("pageNum", String.valueOf(page)); + if (StringUtil.hasContent(editText)) { + if (StringUtil.isInteger(editText)) { + param.put("userName", editText); + } else { + param.put("nickName", editText); + } + } + ApiModel.request(RetrofitService.getBaseInstance().applyGet(ApplyForMainActivity.BASE_URL + "apply/shenchalist", headMap, param), + new BaseRequestCallback() { + + @Override + public void onRequestSuccess(JsonObject result) { + LogUtils.d(result.toString()); + try { + JSONObject object = new JSONObject(result.toString()); + int code = TypConversion.getJsonInt(object, "code", -1); + if (code == 200) { + total = TypConversion.getJsonInt(object, "total", -1); + JSONArray rows = TypConversion.getJSONArray(object, "rows"); + + List dataList = new ArrayList<>(); + for (int i = 0; i < rows.length(); i++) { + JSONObject jsonObject = TypConversion.getJSONObject(rows, i); + if (jsonObject == null) return; + ApplyBean bean = new ApplyBean(); + bean.setBaseType(3); + bean.setApplyReason(TypConversion.getJsonStr(jsonObject, "reason")); + bean.setId(TypConversion.getJsonStr(jsonObject, "id")); + + bean.setRoleName(TypConversion.getJsonStr(jsonObject, "roleName")); + bean.setNode(TypConversion.getJsonStr(jsonObject, "appRole")); + bean.setPhone(TypConversion.getJsonStr(jsonObject, "contact")); + bean.setName(TypConversion.getJsonStr(jsonObject, "nickName")); + bean.setCode(TypConversion.getJsonStr(jsonObject, "userName")); + bean.setDeptCode(TypConversion.getJsonStr(jsonObject, "deptId")); + bean.setDeptName(TypConversion.getJsonStr(jsonObject, "deptName")); + bean.setIdCordNum(TypConversion.getJsonStr(jsonObject, "idcard")); + bean.setState(1); + bean.setTime(TypConversion.getJsonStr(jsonObject, "opTime")); + bean.setUserId(TypConversion.getJsonStr(jsonObject, "userId")); + bean.setApplyReason(TypConversion.getJsonStr(jsonObject, "reason")); + String opType = TypConversion.getJsonStr(jsonObject, "opType"); + bean.setType("申请".equals(opType) ? 1 : 2); + dataList.add(bean); + } + if (viewBinding.reviewSrf.isRefreshing()) { + viewBinding.reviewSrf.finishRefresh(); + if (dataList.isEmpty()) { + getErrorList(0, "暂无审核记录!"); + return; + } + initData(dataList); + } else { + viewBinding.reviewSrf.finishLoadMore(); + if (!dataList.isEmpty()) { + adapter.addData(dataList); + } + } + } else { + if (viewBinding.reviewSrf.isRefreshing()) { + viewBinding.reviewSrf.finishRefresh(); + getErrorList(-1, TypConversion.getJsonStr(object, "msg")); + } else { + viewBinding.reviewSrf.finishLoadMore(); + ToastUtil.centered(getContext(), TypConversion.getJsonStr(object, "msg")); + } + } + } catch (JSONException e) { + e.printStackTrace(); + if (viewBinding.reviewSrf.isRefreshing()) { + viewBinding.reviewSrf.finishRefresh(); + getErrorList(-1, e.getMessage()); + } else { + viewBinding.reviewSrf.finishLoadMore(); + ToastUtil.centered(getContext(), e.getMessage()); + } + } + } + + @Override + public void onRequestFailure(String msg) { + LogUtils.e(msg); + if (viewBinding.reviewSrf.isRefreshing()) { + viewBinding.reviewSrf.finishRefresh(); + getErrorList(-1, msg); + } else { + viewBinding.reviewSrf.finishLoadMore(); + ToastUtil.centered(getContext(), msg); + } + } + }); + + } + + private void getErrorList(int type, String msg) { + List baseBeans = new ArrayList<>(); + BaseBean baseBean = new BaseBean() { + }; + baseBean.setBaseType(type); + baseBean.setBaseMessage(msg); + baseBeans.add(baseBean); + initData(baseBeans); + } + + private void initData(List baseBeans) { + if (adapter == null) { + adapter = new InitiateRecordAdapter(getContext(), baseBeans); + adapter.setListClickListener(new SimpleListClickListener() { + @Override + public void onSingleClick(View v, int pointer) { + BaseBean dataItem = adapter.getDataItem(pointer); + if (dataItem instanceof ApplyBean) { + ApplyBean bean = (ApplyBean) dataItem; + Intent intent = new Intent(getContext(), ApplyDetailsActivity.class); + intent.putExtra("data", new Gson().toJson(bean)); + intent.putExtra("operatingType", 3); + startActivity(intent); + } + } + }); + viewBinding.reviewRv.setAdapter(adapter); + } else { + adapter.upData(baseBeans); + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/SelectSystemActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/SelectSystemActivity.java index 571212d..91e6b1d 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/SelectSystemActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/applyfo/SelectSystemActivity.java @@ -82,6 +82,7 @@ public class SelectSystemActivity extends BaseViewBindActivity headMap = new HashMap<>(1); headMap.put("app-yysq-token", RuanseeApplication.getAppCache().getApply_token()); - ApiModel.request(RetrofitService.getBaseInstance().applyGet(ApplyForMainActivity.BASE_URL + "app/alllist", headMap, new HashMap<>()), + ApiModel.request(RetrofitService.getBaseInstance().applyGet(ApplyForMainActivity.BASE_URL + "role/alllist", headMap, new HashMap<>()), new BaseRequestCallback() { @Override public void onRequestFailure(String msg) { @@ -203,8 +220,8 @@ public class SelectSystemActivity extends BaseViewBindActivity data = applyAppBean.getData(); - handlerData(data); + List data = applyAppBean.getData(); + handlerData2(data); } catch (Exception e) { e.printStackTrace(); List dataList = new ArrayList<>(); @@ -219,6 +236,24 @@ public class SelectSystemActivity extends BaseViewBindActivity data) { + List dataList = new ArrayList<>(); + if (data == null || data.isEmpty()) { + BaseBean baseBean = new BaseBean() { + }; + baseBean.setBaseType(0); + baseBean.setBaseMessage("暂无应用"); + dataList.add(baseBean); + } else { + for (ApplyAppBean.DataBean2 b : data) { + b.setBaseType(4); + dataList.add(b); + } + } + initAppData(dataList); + } + + private void handlerData(List data) { Map stringMap = null; if (StringUtil.hasContent(selectData)) { @@ -238,13 +273,13 @@ public class SelectSystemActivity extends BaseViewBindActivity strings = stringMap.keySet(); for (String key : strings) { String[] strings1 = stringMap.get(key); for (int i = 0; i < dataList.size(); i++) { BaseBean baseBean = dataList.get(i); - if (baseBean instanceof ApplyAppBean.DataBean){ + if (baseBean instanceof ApplyAppBean.DataBean) { ApplyAppBean.DataBean bean = (ApplyAppBean.DataBean) baseBean; int selectId = TypConversion.strToInt(key); if (bean.getId() == selectId) { @@ -254,7 +289,7 @@ public class SelectSystemActivity extends BaseViewBindActivity dataList) { if (appAdapter == null) { @@ -326,18 +363,50 @@ public class SelectSystemActivity extends BaseViewBindActivity data = appAdapter.getData(); + int lastIndex = -1; + for (int i = 0; i < data.size(); i++) { + BaseBean baseBean = data.get(i); + if (baseBean instanceof ApplyAppBean.DataBean2) { + ApplyAppBean.DataBean2 d = (ApplyAppBean.DataBean2) baseBean; + if (d.isSelect()) { + lastIndex = i; + d.setSelect(false); + break; + } + } + } + dataItem = (ApplyAppBean.DataBean2) item; + dataItem.setSelect(true); + appAdapter.notifyItemChanged(pointer, 1); + selectContent[0] = String.valueOf(dataItem.getId()); + selectContent[1] = dataItem.getRoleName(); + if (lastIndex == -1)return; + appAdapter.notifyItemChanged(lastIndex, 1); + return; + } + if (item instanceof ApplyAppBean.DataBean) { ApplyAppBean.DataBean dataItem = (ApplyAppBean.DataBean) item; if (dataItem.getBaseType() != 1) return; - if (dataItem.isSelect()){ + if (dataItem.isSelect()) { dataItem.setSelect(false); - appAdapter.notifyItemChanged(pointer,1); + appAdapter.notifyItemChanged(pointer, 1); List data = appAdapter.getData(); - for (int i =0;i { private TravelAssistantAdapter historyAdapter, popularAdapter; private TravelSearchListAdapter searchAdapter; + private int level = 2; @Override protected ActivityTravelAssistantBinding getViewBinding() { @@ -77,6 +82,7 @@ public class TravelAssistantActivity extends BaseViewBindActivity finish()); + viewBinding.travelTitle.rightText.setText("一般人员▼"); viewBinding.trvaelSearch.editQuery.setHint("搜索城市 如:北京/bj/beijing"); viewBinding.trvaelSearch.editQuery.setImeOptions(EditorInfo.IME_ACTION_SEARCH); viewBinding.trvaelSearch.btnClean.setOnClickListener(new CustomClickListener() { @@ -86,6 +92,12 @@ public class TravelAssistantActivity extends BaseViewBindActivity { if (actionId == EditorInfo.IME_ACTION_SEARCH) { String searchWord = getEditText(viewBinding.trvaelSearch.editQuery); @@ -95,7 +107,6 @@ public class TravelAssistantActivity extends BaseViewBindActivity() { @Override @@ -294,7 +319,7 @@ public class TravelAssistantActivity extends BaseViewBindActivity data = historyAdapter.getData(); @@ -322,10 +347,10 @@ public class TravelAssistantActivity extends BaseViewBindActivity-1){ + if (index > -1) { historyAdapter.removeItem(index); - }else { - if (historyAdapter.getItemCount()>=12){ + } else { + if (historyAdapter.getItemCount() >= 12) { historyAdapter.removeItem(data.size() - 1); } } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/travel/TravelDetailsActivity.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/travel/TravelDetailsActivity.java index afab357..e54bd12 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/travel/TravelDetailsActivity.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/activity/travel/TravelDetailsActivity.java @@ -1,6 +1,5 @@ package com.ycgis.macall.personalcenter.v.activity.travel; - import android.content.Intent; import android.os.Bundle; @@ -15,7 +14,6 @@ import com.ycgis.macall.personalcenter.databinding.ActivityTravelDetailsBinding; import com.ycgis.macall.personalcenter.p.app.RuanseeApplication; import com.ycgis.macall.personalcenter.p.callback.BaseRequestCallback; import com.ycgis.macall.personalcenter.p.request.ApiModel; -import com.ycgis.macall.personalcenter.p.request.CommonComposite; import com.ycgis.macall.personalcenter.p.request.CommonCompositeManage; import com.ycgis.macall.personalcenter.p.request.RetrofitService; @@ -24,6 +22,7 @@ import org.json.JSONObject; public class TravelDetailsActivity extends BaseViewBindActivity { private String cityName; + // 1 是 司局级人员 2 是一般人员 private String level; @Override @@ -52,7 +51,11 @@ public class TravelDetailsActivity extends BaseViewBindActivity finish()); baseShowDialog("正在加载请稍后..."); diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/BluetoothListAdapter.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/BluetoothListAdapter.java new file mode 100644 index 0000000..c883373 --- /dev/null +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/BluetoothListAdapter.java @@ -0,0 +1,89 @@ +package com.ycgis.macall.personalcenter.v.adapter; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothDevice; +import android.content.Context; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.rs.macall.androidx.basemodel.base.BaseRecyclerAdapter; +import com.ycgis.macall.personalcenter.R; +import com.ycgis.macall.personalcenter.m.adapterbean.BluetoothOV; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * created by: Macall + * create time: 2025/5/29 16:38 + * copyright: @ruansee.com + * Describe: + */ +public class BluetoothListAdapter extends BaseRecyclerAdapter { + + public BluetoothListAdapter(Context context, List dataList) { + super(context, dataList); + } + + @NonNull + @NotNull + @Override + public BaseRecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) { + View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_bluetooth_list, parent, false); + return new SimpleViewHolder(inflate).findViewById(R.id.bluetooth_name).findViewById(R.id.bluetooth_mac).findViewById(R.id.bluetooth_status); + } + + @SuppressLint("SetTextI18n") + @Override + public void onBindViewHolder(@NonNull @NotNull BaseRecyclerAdapter.ViewHolder viewHolder, int position) { + BluetoothDevice dataItem = getDataItem(position); + if (viewHolder instanceof BaseRecyclerAdapter.SimpleViewHolder){ + SimpleViewHolder holder =(SimpleViewHolder)viewHolder; + TextView name = holder.getView(R.id.bluetooth_name, TextView.class); + TextView address = holder.getView(R.id.bluetooth_mac, TextView.class); + TextView status = holder.getView(R.id.bluetooth_status, TextView.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + name.setText(dataItem.getAlias()); + } else { + name.setText(dataItem.getName()); + } + address.setText(dataItem.getAddress()); + status.setText(getStatusStr(dataItem.getBondState())+" "+ getTypeStr(dataItem.getType()) ); + } + } + + + public String getStatusStr(int status) { + if (status == 11) { + return "正在配对"; + } + if (status == 12) { + return "已配对"; + } + return "未配对"; + } + + public String getTypeStr(int type) { + switch (type) { + case 1: + + return "BR/EDR"; + case 2: + + return "LE-only"; + case 3: + + return "BR/EDR/LE"; + case 0: + default: + + return "未知"; + } + } +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/InitiateRecordAdapter.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/InitiateRecordAdapter.java index 4b76c99..278ca11 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/InitiateRecordAdapter.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/InitiateRecordAdapter.java @@ -1,6 +1,7 @@ package com.ycgis.macall.personalcenter.v.adapter; import android.content.Context; +import android.text.Html; import android.view.View; import android.view.ViewGroup; @@ -140,6 +141,8 @@ public class InitiateRecordAdapter extends BaseRecyclerAdapter(dataItem, position) { @Override diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/SelectSystemAdapter.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/SelectSystemAdapter.java index 65e0151..52439f0 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/SelectSystemAdapter.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/adapter/SelectSystemAdapter.java @@ -1,6 +1,7 @@ package com.ycgis.macall.personalcenter.v.adapter; import android.content.Context; +import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -13,7 +14,9 @@ import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; import com.rs.macall.androidx.basemodel.base.BaseRecyclerAdapter; +import com.rs.macall.androidx.basemodel.utils.StringUtil; import com.ycgis.macall.personalcenter.R; +import com.ycgis.macall.personalcenter.databinding.ItemApplySelectRoleBinding; import com.ycgis.macall.personalcenter.databinding.ItemSelecctRoleBinding; import com.ycgis.macall.personalcenter.databinding.ItemSelectAppBinding; import com.ycgis.macall.personalcenter.m.adapterbean.ApplyAppBean; @@ -66,16 +69,54 @@ public class SelectSystemAdapter extends BaseRecyclerAdapter(binding); + } return null; } @Override public void onBindViewHolder(@NonNull @NotNull BaseRecyclerAdapter.ViewHolder viewHolder, int position) { + BaseBean item = getDataItem(position); if (viewHolder instanceof BaseRecyclerAdapter.ViewBindingHolder) { ViewBindingHolder holder = (ViewBindingHolder) viewHolder; + if (holder.viewBind instanceof ItemApplySelectRoleBinding){ + ItemApplySelectRoleBinding binding = (ItemApplySelectRoleBinding) holder.viewBind; + if (item instanceof ApplyAppBean.DataBean2){ + ApplyAppBean.DataBean2 dataItem = (ApplyAppBean.DataBean2) item; + if (dataItem.isSelect()) { + binding.ivSelect.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.icon_item_sel)); + binding.getRoot().setBackground(ContextCompat.getDrawable(context, R.color.colorGreen4)); + } else { + binding.ivSelect.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.select_def)); + binding.getRoot().setBackground(ContextCompat.getDrawable(context, R.color.colorWhite)); + } + if (StringUtil.hasContent(dataItem.getRoleName())){ + StringBuilder builder = new StringBuilder(); + if (dataItem.getRoleName().contains("普通")){ + builder.append(""); + builder.append(dataItem.getRoleName()); + builder.append(" ("); + builder.append(dataItem.getRemark()); + builder.append(")"); + }else { + builder.append(""); + builder.append(dataItem.getRoleName()); + builder.append(" ("); + builder.append(dataItem.getRemark()); + builder.append(")"); + } + binding.tvAppName.setText(Html.fromHtml(builder.toString())); + } + + } + return; + } + if (holder.viewBind instanceof ItemSelectAppBinding) { ItemSelectAppBinding binding = (ItemSelectAppBinding) holder.viewBind; - BaseBean item = getDataItem(position); if (item instanceof SelectAppBean) { SelectAppBean dataItem = (SelectAppBean) item; binding.tvAppName.setText(dataItem.getAppName()); @@ -156,11 +197,25 @@ public class SelectSystemAdapter extends BaseRecyclerAdapter pdDataList = new ArrayList<>(), searchDataList = new ArrayList<>(); + private BluetoothFragmentListener bluetoothFragmentListener; + + public void setBluetoothFragmentListener(BluetoothFragmentListener bluetoothFragmentListener) { + this.bluetoothFragmentListener = bluetoothFragmentListener; + } + + @Override + public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Nullable + @org.jetbrains.annotations.Nullable + @Override + public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { + viewBinding = FragmendDialogBluetoothBinding.inflate(getLayoutInflater()); + initView(); + startPage(); + return viewBinding.getRoot(); + } + + private void initView() { + viewBinding.rvSearchList.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + viewBinding.rvSearchList.addItemDecoration(new MyDividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); + viewBinding.rvYpd.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); + viewBinding.rvYpd.addItemDecoration(new MyDividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL)); + viewBinding.btnSearch.setVisibility(View.VISIBLE); + viewBinding.searchProgress.setVisibility(View.GONE); + viewBinding.btnSearch.setOnClickListener(customClickListener); + } + + private void startPage() { + boolean init = BluetoothManage.getInstance().init(); + if (!init) { + ToastUtil.centered(getContext(), "当前设备不支持蓝牙!"); + if (bluetoothFragmentListener!=null) bluetoothFragmentListener.onError(-1,"当前设备不支持蓝牙"); + dismiss(); + return; + } + if (!BluetoothManage.getInstance().isBluetoothOpen(getActivity(), true)) { + ToastUtil.centered(getContext(), "请先打开蓝牙!"); + if (bluetoothFragmentListener!=null) bluetoothFragmentListener.onError(-2,"蓝牙未打卡"); + dismiss(); + return; + } + btAdapter = BluetoothAdapter.getDefaultAdapter(); + BluetoothDevice remoteDevice = BluetoothSocket.getInstance().getRemoteDevice(); + if (remoteDevice != null){ + viewBinding.tvPrinters.setText("已连接|"+remoteDevice.getName()); + }else { + viewBinding.tvPrinters.setText("未连接打印机"); + } + + bonded_devices_get(); + + //register broadcast receiver + IntentFilter filter = new IntentFilter(); + filter.addAction(BluetoothDevice.ACTION_FOUND); + filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); + filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); + filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + getActivity().registerReceiver(mBroadcastReceiver, filter); + } + + private void onBindView(int viewId){ + if (viewId == R.id.btn_search) { + discovry_do(); + } + } + + private CustomClickListener customClickListener = new CustomClickListener() { + @Override + public void onSingleClick(View v) { + onBindView(v.getId()); + } + }; + + @Override + public void onStart() { + super.onStart(); + // 设置Dialog宽度 + if (getDialog() != null && getDialog().getWindow() != null) { + getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, + DimensionConvert.dip2px(getContext(),680)); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + //获取蓝牙设备,并开始搜索设备 + if (btAdapter.isDiscovering()) { + Log.d("BT", "-----------btAdapter.cancelDiscovery()---------"); + btAdapter.cancelDiscovery(); + } + getActivity().unregisterReceiver(mBroadcastReceiver); +// BluetoothSocket.getInstance().disconnect(); + } + + + //get the Bonded devices + //获取配对列表 + private void bonded_devices_get() { + pdDataList.clear(); + Set PairedDevices = btAdapter.getBondedDevices(); + if (PairedDevices.size() > 0) { + for (BluetoothDevice device : PairedDevices) { + if (device == null)continue; + if (StringUtil.isNullOrEmpty(device.getAddress()))continue; +// String device_info = device.getName()+"\n"+device.getAddress(); + pdDataList.add(device); + } + } + initDataPd(); + } + + private void initDataPd() { + if (listAdapter1 == null) { + listAdapter1 = new BluetoothListAdapter(getContext(), pdDataList); + viewBinding.rvYpd.setAdapter(listAdapter1); + listAdapter1.setListClickListener(new SimpleListClickListener() { + @Override + public void onSingleClick(View v, int pointer) { + if (bluetoothFragmentListener != null){ + bluetoothFragmentListener.onClickBluetoothDevice(listAdapter1.getDataItem(pointer)); + } + dismiss(); +// lk(listAdapter1.getDataItem(pointer)); + } + }); + } else { + listAdapter1.upData(pdDataList); + } + } + + /* + * 获取蓝牙设备,并开始搜索设备 + */ + //search BlueTooth devices + private void discovry_do() { + Log.d("BT", "-----------discovry_do---------"); + if (!btAdapter.isEnabled()) { + btAdapter.enable(); + while (btAdapter.getState() != BluetoothAdapter.STATE_ON) ; + } + //获取蓝牙设备,并开始搜索设备 + if (btAdapter.isDiscovering()) { + Log.d("BT", "-----------btAdapter.cancelDiscovery()---------"); + btAdapter.cancelDiscovery(); + } + Log.d("BT", "-----------btAdapter.startDiscovery()---------"); + btAdapter.startDiscovery(); + Log.d("BT", "-----------btAdapter.startDiscovery()+END---------"); + + viewBinding.btnSearch.setVisibility(View.GONE); + viewBinding.searchProgress.setVisibility(View.VISIBLE); + } + + + + private void initSearch(BluetoothDevice device) { + if (StringUtil.isNullOrEmpty(device.getAddress()))return; + if (listAdapter2 == null) { + searchDataList.add(device); + listAdapter2 = new BluetoothListAdapter(getContext(), searchDataList); + viewBinding.rvSearchList.setAdapter(listAdapter2); + listAdapter2.setListClickListener(new SimpleListClickListener() { + @Override + public void onSingleClick(View v, int pointer) { + if (bluetoothFragmentListener != null){ + bluetoothFragmentListener.onClickBluetoothDevice(listAdapter2.getDataItem(pointer)); + } + dismiss(); + } + }); + } else { + listAdapter2.addItem(device); + } + } + + BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // TODO Auto-generated method stub + String action = intent.getAction(); + Log.d("BT", "----------onReceive----------" + action); + if (BluetoothDevice.ACTION_FOUND.equals(action)) { + BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); + if (device.getBondState() != BluetoothDevice.BOND_BONDED) { + initSearch(device); + } + } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { + viewBinding.btnSearch.setVisibility(View.VISIBLE); + viewBinding.searchProgress.setVisibility(View.GONE); + } + } + }; + +} diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/FrequentlyQuestionsDetailsFragment.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/FrequentlyQuestionsDetailsFragment.java index ad8c0f8..4b087fe 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/FrequentlyQuestionsDetailsFragment.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/FrequentlyQuestionsDetailsFragment.java @@ -2,13 +2,12 @@ package com.ycgis.macall.personalcenter.v.fragment; import android.content.Context; import android.graphics.Point; -import android.graphics.drawable.Drawable; + import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.coordinatorlayout.widget.CoordinatorLayout; -import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; @@ -23,14 +22,11 @@ import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.rs.macall.androidx.basemodel.callback.CustomClickListener; import com.rs.macall.androidx.basemodel.utils.DimensionConvert; -import com.rs.macall.androidx.basemodel.utils.MResource; import com.rs.macall.androidx.basemodel.utils.StringUtil; -import com.rs.macall.androidx.basemodel.view.Watermark; import com.ycgis.macall.personalcenter.R; import com.ycgis.macall.personalcenter.databinding.FragmentFrequentlyQuestionsDetailsBinding; import com.ycgis.macall.personalcenter.m.adapterbean.FrequentlyItemBean; import com.ycgis.macall.personalcenter.p.app.AppCache; -import com.ycgis.macall.personalcenter.p.app.RuanseeApplication; import com.ycgis.macall.personalcenter.v.photoview.ShowPhotoDialog; import org.jetbrains.annotations.NotNull; diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/Home2Fragment.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/Home2Fragment.java index 05e5e15..b3c13cb 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/Home2Fragment.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/Home2Fragment.java @@ -1,8 +1,10 @@ package com.ycgis.macall.personalcenter.v.fragment; import android.app.Activity; +import android.content.ContentValues; import android.content.Intent; import android.graphics.Bitmap; +import android.net.Uri; import android.os.Bundle; import androidx.annotation.Nullable; @@ -13,11 +15,15 @@ import androidx.lifecycle.ViewModelProviders; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; +import android.os.Environment; +import android.provider.MediaStore; import android.text.Html; import android.view.View; import android.widget.ImageView; import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.bumptech.glide.request.RequestOptions; import com.king.zxing.CameraScan; @@ -127,8 +133,8 @@ public class Home2Fragment extends BaseViewBindFragment { protected void startView(View view) { setUserInfoUI(); //45 *1 * 24 *20 - viewModel.addBannerData(this, this::initBanner); - viewModel.getBanner(); +// viewModel.addBannerData(this, this::initBanner); +// viewModel.getBanner(); viewModel.addAppList(this, this::initAppData); viewModel.getAppList(); viewModel.addMsgList(this, homeMessageBean -> { @@ -139,6 +145,18 @@ public class Home2Fragment extends BaseViewBindFragment { viewModel.getMessage(); } + /** + * 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法 + */ + private Uri createImageUri() { + String status = Environment.getExternalStorageState(); + // 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储 + if (status.equals(Environment.MEDIA_MOUNTED)) { + return getContext().getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); + } else { + return getContext().getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, new ContentValues()); + } + } @Subscribe(threadMode = ThreadMode.MAIN) public void hanMessage(MessageEvent event) { if (event.getCount() <= 0) return; @@ -184,11 +202,12 @@ public class Home2Fragment extends BaseViewBindFragment { Bitmap bitmap = new LoadPhotoImage().loadPhotoImage(RuanseeApplication.getUserData().getPhoto(), viewBinding.homeTvUserPhoto, new ImageCallBack() { @Override public void imageLoad(ImageView imageView, Bitmap bitmap) { + if (getActivity() == null)return; // viewBinding.homeTvUserPhoto.setImageBitmap(bitmap); if (getActivity().isDestroyed()) return; Glide.with(getContext()) .load(bitmap) - .apply(RequestOptions.bitmapTransform(new RoundedCorners(20))) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(viewBinding.homeTvUserPhoto); } @@ -201,10 +220,11 @@ public class Home2Fragment extends BaseViewBindFragment { }); if (bitmap != null) { + if (getActivity() == null)return; if (getActivity().isDestroyed()) return; Glide.with(getContext()) .load(bitmap) - .apply(RequestOptions.bitmapTransform(new RoundedCorners(20))) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(viewBinding.homeTvUserPhoto); } } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/MessageContentFragment.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/MessageContentFragment.java index acb1d09..cdee0b4 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/MessageContentFragment.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/MessageContentFragment.java @@ -84,6 +84,7 @@ public class MessageContentFragment extends BaseViewBindFragment { if (getActivity().isDestroyed())return; Glide.with(getContext()) .load(bitmap) - .apply(RequestOptions.bitmapTransform(new RoundedCorners(20))) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(viewBinding.myIvPolicePhoto); } @@ -138,13 +140,11 @@ public class MyFragment extends BaseViewBindFragment { // viewBinding.myIvPolicePhoto.setImageBitmap(bitmap); Glide.with(getContext()) .load(bitmap) - .apply(RequestOptions.bitmapTransform(new RoundedCorners(20))) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) .into(viewBinding.myIvPolicePhoto); } } - - @Override public void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) { if (resultCode == MyDetailsActivity.UPDATE_INFO){ @@ -196,11 +196,19 @@ public class MyFragment extends BaseViewBindFragment { item1.setTitle("认证管理"); item1.setActivityClass(AuthenticationActivity.class); dataList.add(item1); + item1 = new MyItem(); item1.setActivityClass(AboutActivity.class); item1.setIcon(R.drawable.icon_about); item1.setTitle("关于"); dataList.add(item1); + +// item1 = new MyItem(); +// item1.setActivityClass(BluetoothActivity.class); +// item1.setIcon(R.drawable.icon_about); +// item1.setTitle("蓝牙调试"); +// dataList.add(item1); + initData(dataList); } diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/WorkbenchFragment.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/WorkbenchFragment.java index 835b7b9..6336604 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/WorkbenchFragment.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/fragment/WorkbenchFragment.java @@ -74,7 +74,7 @@ public class WorkbenchFragment extends BaseViewBindFragment>>() { @Override public void onRequestFailure(String msg) { diff --git a/app/src/main/java/com/ycgis/macall/personalcenter/v/viewmodel/MyDetailsViewModel.java b/app/src/main/java/com/ycgis/macall/personalcenter/v/viewmodel/MyDetailsViewModel.java index bccff0b..7099601 100644 --- a/app/src/main/java/com/ycgis/macall/personalcenter/v/viewmodel/MyDetailsViewModel.java +++ b/app/src/main/java/com/ycgis/macall/personalcenter/v/viewmodel/MyDetailsViewModel.java @@ -45,7 +45,7 @@ public class MyDetailsViewModel extends BaseViewModel { final Map param = new HashMap<>(); AppCache cacheData = RuanseeApplication.getAppCache(); param.put("token", cacheData.getToken()); - param.put("clientType", "MOBILE"); + param.put("clientType", "MOBILE");//SERVER param.put("imsi1", imsi); param.put("deviceFlags", imei); param.put("sysCode", cacheData.getSysmCode()); diff --git a/app/src/main/java/com/ycgis/zpSDK/BluetoothSocket.java b/app/src/main/java/com/ycgis/zpSDK/BluetoothSocket.java new file mode 100644 index 0000000..1dd0b25 --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/BluetoothSocket.java @@ -0,0 +1,402 @@ +package com.ycgis.zpSDK; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.graphics.Bitmap; +import android.graphics.Color; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; +import com.rs.macall.androidx.basemodel.utils.BitMapUtils; +import com.rs.macall.androidx.basemodel.utils.StringUtil; +import com.ycgis.macall.personalcenter.m.datamodel.PrintModel; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; +import java.util.UUID; + + +public class BluetoothSocket { + public static String ErrorMessage = "No Error"; + private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); + private static BluetoothAdapter myBluetoothAdapter; + private static BluetoothDevice myDevice; + private static android.bluetooth.BluetoothSocket mySocket = null; + private static OutputStream myOutStream = null; + private static InputStream myInStream = null; + private static BluetoothSocket mBluetoothSocket = null; + + private final static String GBK = "GBK"; + + public static BluetoothSocket getInstance() { + if (mBluetoothSocket == null) + mBluetoothSocket = new BluetoothSocket(); + return mBluetoothSocket; + } + + + // 检查是否已连接 + public boolean isConnected() { + return mySocket != null && mySocket.isConnected(); + } + + /** + * TODO 仅且仅当 {@link #isConnected()} 结果为true时该方法返回连接设备 + * + * @return + */ + public BluetoothDevice getRemoteDevice() { + if (isConnected()) + return mySocket.getRemoteDevice(); + return null; + } + + + public boolean ConnectPrinter(String BDAddr) { + if (BDAddr.equals("") || BDAddr == null) { + ErrorMessage = "没有选择打印机"; + return false; + } + myBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); + if (myBluetoothAdapter == null) { + ErrorMessage = "蓝牙系统错误"; + return false; + } + myDevice = myBluetoothAdapter.getRemoteDevice(BDAddr); + if (myDevice == null) { + ErrorMessage = "读取蓝牙设备错误"; + return false; + } + if (!SPPOpen(myBluetoothAdapter, myDevice)) { + return false; + } + return true; + } + + public boolean SPPOpen(BluetoothAdapter bluetoothAdapter, BluetoothDevice btDevice) { + boolean error = false; + myBluetoothAdapter = bluetoothAdapter; + myDevice = btDevice; + + if (!myBluetoothAdapter.isEnabled()) { + ErrorMessage = "蓝牙适配器没有打开"; + return false; + } + myBluetoothAdapter.cancelDiscovery(); + + try { + //mySocket = myDevice.createRfcommSocketToServiceRecord(SPP_UUID); + Method m = myDevice.getClass().getMethod("createRfcommSocket", new Class[]{int.class}); + mySocket = (android.bluetooth.BluetoothSocket) m.invoke(myDevice, 1); + } catch (SecurityException e) { + mySocket = null; + ErrorMessage = "蓝牙端口错误"; + return false; + } catch (NoSuchMethodException e) { + mySocket = null; + ErrorMessage = "蓝牙端口错误"; + return false; + } catch (IllegalArgumentException e) { + mySocket = null; + ErrorMessage = "蓝牙端口错误"; + return false; + } catch (IllegalAccessException e) { + mySocket = null; + ErrorMessage = "蓝牙端口错误"; + return false; + } catch (InvocationTargetException e) { + mySocket = null; + ErrorMessage = "蓝牙端口错误"; + return false; + } + + try { + mySocket.connect(); + } catch (IOException e2) { + ErrorMessage = e2.getLocalizedMessage();//"无法连接蓝牙打印机"; + mySocket = null; + return false; + } + + try { + myOutStream = mySocket.getOutputStream(); + } catch (IOException e3) { + myOutStream = null; + error = true; + return false; + } + + try { + myInStream = mySocket.getInputStream(); + } catch (IOException e3) { + myInStream = null; + error = true; + return false; + } + + if (error) { + //SPPClose(); + return false; + } + + return true; + } + + public boolean disconnect() { + if (!SPPClose()) + return false; + return true; + } + + private boolean SPPClose() { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + if (myOutStream != null) { + try { + myOutStream.flush(); + } catch (IOException e1) { + } + try { + myOutStream.close(); + } catch (IOException e) { + } + myOutStream = null; + } + if (myInStream != null) { + try { + myInStream.close(); + } catch (IOException e) { + } + myInStream = null; + } + if (mySocket != null) { + try { + mySocket.close(); + } catch (IOException e) { + } + mySocket = null; + } + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + return true; + } + + + // 发送数据 + public boolean sendData(List dataList) { + if (!isConnected())return false; + if (myOutStream != null) { + if (dataList == null) return false; + try { + boolean isNewline = dataList.size()>1; + for (int i = 0; i < dataList.size(); i++) { + PrintModel printModel = dataList.get(i); + if (printModel == null) continue; + if (printModel.getPrintType() == 1) { + String content = printModel.getContent(); + if (StringUtil.isNullOrEmpty(content)){ + continue; + } + if (isNewline){ + if (!content.endsWith("\n")){ + content = content+"\n"; + } + } + printText(content,printModel); + } else if (printModel.getPrintType() == 2) { + printQrCode(printModel); + } else if (printModel.getPrintType() == 3) { + printBitMap(printModel); +// Bitmap bitmap = BitMapUtils.base64ToBitmap(printModel.getContent()); +// if (bitmap == null) continue; +// myOutStream.write(decodeBitmap(bitmap)); // 部分打印机需GBK编码 + } + } + myOutStream.flush(); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + return false; + } + + + public boolean printText(String content, PrintModel model) throws UnsupportedEncodingException { + zpPrinter zpSDK = new zpPrinter(); + zpSDK.pageSetup(model.getPageWidth(), model.getPageHeight()); + //zpSDK.drawBarCode(10,10,"123456789012",1,0,4,80); + zpSDK.alignLeft(); + zpSDK.drawText(10, 10,content, "思源黑体", 24, 0, 0, false, false); + String print = zpSDK.print(0, 0); + return Write(print.getBytes(GBK)); + } + + public boolean printBitMap(PrintModel model){ + Bitmap bitmap = BitMapUtils.base64ToBitmap(model.getContent()); + if (bitmap == null) return false; + zpPrinter zpSDK = new zpPrinter(); + zpSDK.pageSetup(model.getPageWidth(), model.getPageHeight()); + zpSDK.drawGraphic(10,10,model.getContentHeight(),model.getContentWidth(),bitmap); + byte[] bytes = zpSDK.printByte(0, 1); + byte[] gzipBytes = GZIPFrame.codec(bytes); + return Write(gzipBytes); // 部分打印机需GBK编码 + } + + public boolean printQrCode(PrintModel model) { + zpPrinter zpSDK = new zpPrinter(); + try { + zpSDK.pageSetup(model.getPageWidth(), model.getPageHeight()); + zpSDK.drawQrCode(10, 10, model.getContent(), 0, model.getZoomLevel(), 4); + String print = zpSDK.print(0, 0); +// return Write(print.getBytes("GBK")); // 部分打印机需GBK编码/ + return Write(print.getBytes("UTF-8")); // 部分打印机需GBK编码 + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return false; + } + } + + public boolean Write(byte[] Data) { + try { + myOutStream.write(Data); + } catch (IOException e) { + ErrorMessage = "发送蓝牙数据失败"; + return false; + } + return true; + } + + public boolean Write(byte[] Data, int DataLen) { + try { + myOutStream.write(Data, 0, DataLen); + } catch (IOException e) { + ErrorMessage = "发送蓝牙数据失败"; + return false; + } + return true; + } + + public void SPPFlush() { + int i = 0, DataLen = 0; + try { + DataLen = myInStream.available(); + } catch (IOException e1) { + } + for (i = 0; i < DataLen; i++) { + try { + myInStream.read(); + } catch (IOException e) { + + } + } + } + + public byte[] Read(int Timeout) { + byte[] data = null; + float rest = (float) Timeout; + int len = 0; + try { + len = myInStream.available(); + if (len > 0) { + myInStream.skip(myInStream.available()); + } + + } catch (IOException e) { + e.printStackTrace(); + } + + try { + while (rest > 0.0F) { + if (myInStream != null) { + int available = myInStream.available(); + if (available > 0) { + data = new byte[available]; + myInStream.read(data); + return data; + } + Thread.sleep(100L); + rest -= 0.1F; + } + } + + return null; + } catch (Exception var6) { + return null; + } + + } + + /** + * 生成二位码图片 + * + * @param content + * @param size + * @return + * @throws WriterException + */ + public Bitmap generateQRCode(String content, int size) throws WriterException { + QRCodeWriter writer = new QRCodeWriter(); + BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, size, size); + Bitmap bmp = Bitmap.createBitmap(size, size, Bitmap.Config.RGB_565); + for (int x = 0; x < size; x++) { + for (int y = 0; y < size; y++) { + bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE); + } + } + return bmp; + } + + /** + * 位图转换 + * + * @param bmp + * @return + */ + public byte[] decodeBitmap(Bitmap bmp) { + int width = bmp.getWidth(); + int height = bmp.getHeight(); + int[] pixels = new int[width * height]; + bmp.getPixels(pixels, 0, width, 0, 0, width, height); + + // 生成 ESC/POS 位图指令 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + baos.write(0x1D); + baos.write(0x76); + baos.write(0x30); + baos.write(0x00); + baos.write(width / 8); // 宽度(以8为单位) + baos.write(0x00); + baos.write(height % 256); // 高度低字节 + baos.write(height / 256); // 高度高字节 + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x += 8) { + byte b = 0; + for (int n = 0; n < 8; n++) { + int pixel = pixels[y * width + x + n]; + int gray = (Color.red(pixel) + Color.green(pixel) + Color.blue(pixel)) / 3; + if (gray < 128) { + b |= (1 << (7 - n)); + } + } + baos.write(b); + } + } + return baos.toByteArray(); + } + +} diff --git a/app/src/main/java/com/ycgis/zpSDK/GZIPFrame.java b/app/src/main/java/com/ycgis/zpSDK/GZIPFrame.java new file mode 100644 index 0000000..ed7eeeb --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/GZIPFrame.java @@ -0,0 +1,131 @@ +package com.ycgis.zpSDK; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Paint.Align; + +import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.CRC32; +import java.util.zip.GZIPOutputStream; + + +public class GZIPFrame { + private static Bitmap myBitmap = null; + private static Canvas myCanvas = null; + private static Paint myPaint = null; + private static int myBitmapHeight = 0; + private static int myBitmapWidth = 0; + //private static int PrinterDotWidth = 768; + private static int PrinterDotWidth = 1600; + private static int PrinterDotPerMM = 8; + + public static byte[] codec(byte []data) + { + byte[] gzipData=null; + ByteArrayOutputStream gzipStram = new ByteArrayOutputStream(); + try { + GZIPOutputStream zos = new GZIPOutputStream(new BufferedOutputStream(gzipStram)); + zos.write(data); + zos.close(); + }catch (IOException e) {e.printStackTrace();} + gzipData=gzipStram.toByteArray(); + long length=gzipData.length; + CRC32 crc32 = new CRC32(); + crc32.update(gzipData,8,(int)(length-8-4)); + long crc=crc32.getValue(); + + gzipData[4]=(byte)((length>>0)&0xFF); + gzipData[5]=(byte)((length>>8)&0xFF); + gzipData[6]=(byte)((length>>16)&0xFF); + gzipData[7]=(byte)((length>>24)&0xFF); + gzipData[gzipData.length-4]=(byte)((crc>>0)&0xFF); + gzipData[gzipData.length-3]=(byte)((crc>>8)&0xFF); + gzipData[gzipData.length-2]=(byte)((crc>>16)&0xFF); + gzipData[gzipData.length-1]=(byte)((crc>>24)&0xFF); + +/* + String outFilename= Environment.getExternalStorageDirectory().getPath()+"/1688/"+System.currentTimeMillis()+".gz"; + try + { + FileOutputStream out = new FileOutputStream(outFilename); + out.write(gzipData); + out.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } +*/ + return gzipData; + } + + public static byte[] Draw_Page_Bitmap_(Bitmap bmp) { + // matrix.postRotate(Rotate); + int w=bmp.getWidth(); + int h=bmp.getHeight(); + myBitmapWidth=w; + myBitmapHeight=h; + myBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565); + myCanvas = new Canvas(myBitmap); + myPaint = new Paint(); + myPaint.setColor(Color.BLACK); + myPaint.setTextSize(10); + myPaint.setTextAlign(Align.LEFT); + myPaint.setStrokeWidth(10); + myCanvas.drawColor(Color.WHITE); + /* myCanvas.drawBitmap(dstbmp,xx,yy, myPaint);*/ + myCanvas.drawBitmap(bmp,0,0, myPaint); + //------------------------- + int len; + if(myBitmapWidth>PrinterDotWidth)myBitmapWidth=PrinterDotWidth; + len = (myBitmapWidth+7) / 8; + byte[] bitmapdata = new byte[(len+4)*myBitmapHeight]; + int ndata=0; + int i = 0; + int j = 0; + int[] RowData = new int[myBitmapWidth * myBitmapHeight]; + myBitmap.getPixels(RowData, 0, myBitmapWidth, 0, 0, myBitmapWidth, myBitmapHeight); + + for(i = 0; i < myBitmapHeight;i++) + { + bitmapdata[ndata+0] = 0x1F; + bitmapdata[ndata+1] = 0x10; + bitmapdata[ndata+2] = (byte)(len%256); + bitmapdata[ndata+3] = (byte)(len/256); + for(j = 0; j < len; j++) + { + bitmapdata[ndata+4 + j] = 0; + } + for(j = 0; j < myBitmapWidth; j++) + { + int color = RowData[i * myBitmapWidth + j]; + int b = (color>>0)&0xff; + int g = (color>>8)&0xff; + int r = (color>>16)&0xff; + int grey = (r+g+b)/3; + //if( grey <12 ) + if( grey <153 ) + bitmapdata[ndata+4 + j/8] |= (byte)(0x80 >> (j%8)); + } + if(1==1) // ������ÿ��ĩβ��0x00 + { + int size; + for(size=len-1;size>=0;size--)if(bitmapdata[ndata+4+size]!=0)break; + size = size+1; + size=len; + bitmapdata[ndata+2] = (byte)(size%256); + bitmapdata[ndata+3] = (byte)(size/256); + ndata+=4+size; + } + + } + bitmapdata= codec(bitmapdata); + + + return bitmapdata; + } +} diff --git a/app/src/main/java/com/ycgis/zpSDK/UsbSocket.java b/app/src/main/java/com/ycgis/zpSDK/UsbSocket.java new file mode 100644 index 0000000..e571afc --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/UsbSocket.java @@ -0,0 +1,227 @@ +package com.ycgis.zpSDK; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbConstants; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.hardware.usb.UsbManager; +import android.os.Build; +import android.util.Log; +import android.widget.Toast; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; + +public class UsbSocket { + + Context context; + String TAG="zpSDK"; + static UsbSocket mUsbSocket=null; + private int sysVersion; + public static UsbSocket getInstance(Context context) + { + if (mUsbSocket==null) + mUsbSocket=new UsbSocket(context); + return mUsbSocket; + } + private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"; + UsbManager mUsbManager; + + UsbSocket(Context context) + { + this.context=context; + sysVersion = Integer.parseInt(Build.VERSION.SDK); +// if(sysVersion<19) +// context.onNewIntent(context.getIntent()); + context.registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED)); + context.registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED)); + } + + private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() + { + public void onReceive(Context context, Intent intent) + { + String action = intent.getAction(); + if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) + { + UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if(device.getVendorId()==1155&&device.getProductId()==22339) + { + Log.e(TAG, "USB打印机已接入"); + Toast.makeText(context,"USB打印机已接入", Toast.LENGTH_LONG).show(); + } + } + if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) + { + UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if(device.getVendorId()==1155&&device.getProductId()==22339) + { + Log.e(TAG, "USB打印机已断开"); + Toast.makeText(context,"USB打印机已断开", Toast.LENGTH_LONG).show(); + } + } + } + }; + + public void ConnectPrinter() + { + context.registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED)); + context.registerReceiver(mUsbReceiver, new IntentFilter(UsbManager.ACTION_USB_DEVICE_DETACHED)); + } + + public String Write(byte[] prnData) + { + UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + HashMap deviceList = usbManager.getDeviceList(); + Iterator deviceIterator = deviceList.values().iterator(); + while(deviceIterator.hasNext()) + { + //Log.d("zpSDK","USB deviceIterator"); + UsbDevice usbDevice = deviceIterator.next(); + //Log.d("zpSDK",String.valueOf(usbDevice.getVendorId())+","+String.valueOf(usbDevice.getProductId())); + if(usbDevice.getVendorId()!=1155||usbDevice.getProductId()!=22339)continue; + if(writePort(usbManager,usbDevice,prnData)) + { + Log.e(TAG, "USB打印成功"); + + //Looper.prepare(); + Toast.makeText(context,"USB打印成功", Toast.LENGTH_LONG).show(); + //Looper.loop(); + return "USB打印成功"; + } + else + { + Log.e(TAG, "USB打印失败"); + // Looper.prepare(); + Toast.makeText(context,"USB打印失败", Toast.LENGTH_LONG).show(); + // Looper.loop(); + return "USB打印失败"; + } + } + Log.e(TAG, "无法连接USB打印机"); + // Looper.prepare(); + Toast.makeText(context,"无法连接USB打印机", Toast.LENGTH_LONG).show(); + // Looper.loop(); + return "无法连接USB打印机"; + } + + boolean writePort(UsbManager manager,UsbDevice usbDev, byte[] data) + { + boolean success=false; + UsbEndpoint end_in = null; + UsbEndpoint end_out = null; + byte[] buffer = new byte[64]; + try { + UsbInterface interf = usbDev.getInterface(0); + UsbDeviceConnection connection = manager.openDevice(usbDev);//连接usb设备 + if (connection == null) { + Log.d(TAG, "mUsbDeviceConnection can't be null"); + return false; + } + if (connection.claimInterface(interf, true)) { + //Log.d(TAG,"claimInterface success"); + int endpointCount = interf.getEndpointCount(); + for (int i = 0; i < endpointCount; i++) { + UsbEndpoint endpoint = interf.getEndpoint(i); + if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { + if (UsbConstants.USB_DIR_IN == endpoint.getDirection()) { + end_in = endpoint;//获取读数据通道 + } else if(UsbConstants.USB_DIR_OUT == endpoint.getDirection()){ + end_out = endpoint;//获取写数据通道 + } + } + } + } else { + connection.close(); + Log.d(TAG,"claimInterface fail"); + return false; + } + + if (end_out != null) + { + // bulkTransfer通过给定的endpoint来进行大量的数据传输,传输的方向取决于该节点的方向, + // 传输成果返回传输字节数组的长度,失败返回负数 + int send_ret = connection.bulkTransfer(end_out, buffer,buffer.length,0 ); + send_ret=0; + int total_length=data.length; + //API28之前的系统,bulkTransfer最大包不能超过16384,所以要拆包 + int pack = data.length / 16384; + int j = 0; + for (j = 0; j < pack; j++) { + byte[] newBuffer = Arrays.copyOfRange(data, j * 16384, 16384 + j * 16384); + // 参数依次为:下行端点,字节数组消息,消息长度,响应时间 + send_ret += connection.bulkTransfer(end_out, newBuffer, newBuffer.length, 0); + } + if(send_ret= data.length)success=true; + if (connection != null) + { + connection.releaseInterface(interf); + connection.close(); + } + interf = null; + connection = null; + } + } catch (Exception e) + { + e.printStackTrace(); + } + return success; + } + + + public byte[] Read(int Timeout) + { +// UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); +// UsbDeviceConnection connection = manager.openDevice(usbDev); + UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); + HashMap deviceHashMap = usbManager.getDeviceList(); + Iterator iterator = deviceHashMap.values().iterator(); + + System.out.println("deviceHashMap.isEmpty()"+deviceHashMap.isEmpty()); + + UsbEndpoint inEndpoint=null; + byte[] byte2 = new byte[1024]; + + while(iterator.hasNext()) { + UsbDevice usbDevice = iterator.next(); + if(usbDevice.getVendorId()!=1155||usbDevice.getProductId()!=22339)continue; + UsbInterface usbInterface = usbDevice.getInterface(0);//USBEndpoint为读写数据所需的节点 + UsbDeviceConnection connection = usbManager.openDevice(usbDevice); + + if (connection.claimInterface(usbInterface, true)) { + int endpointCount = usbInterface.getEndpointCount(); + for (int i = 0; i < endpointCount; i++) { + UsbEndpoint endpoint = usbInterface.getEndpoint(i); + if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { + if (UsbConstants.USB_DIR_IN == endpoint.getDirection()) { + inEndpoint = endpoint;//获取读数据通道 + } + } + } + } else { + connection.close(); + Log.d(TAG,"claimInterface fail"); + return null; + } + + int ret = connection.bulkTransfer(inEndpoint, byte2, byte2.length, Timeout); + Log.i(TAG, "ret:" + ret); + Log.i(TAG, "bat is ok length:" + byte2.length); + for (Byte byte1 : byte2) { + Log.i(TAG,"byte1 :" + byte1); + } + } + return byte2; + } +} diff --git a/app/src/main/java/com/ycgis/zpSDK/WifiSocket.java b/app/src/main/java/com/ycgis/zpSDK/WifiSocket.java new file mode 100644 index 0000000..59a7577 --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/WifiSocket.java @@ -0,0 +1,216 @@ +package com.ycgis.zpSDK; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.Timer; +import java.util.TimerTask; + +public class WifiSocket { + + public static String ErrorMessage = "No Error"; + private static Socket wifiSocket = null; + private static OutputStream myOutStream = null; + private static InputStream myInStream = null; + private static WifiSocket mWifiSocket = null; + wifiListener mwifiListener=null; + boolean isWrite = true; + boolean isRead = true; + + private WifiSocket(wifiListener listener) { + mwifiListener = listener; + } + + public static WifiSocket getInstance(wifiListener listener){ + if (mWifiSocket==null) + mWifiSocket = new WifiSocket(listener); + return mWifiSocket; + } + + + public void ConnectPrinter(String ip) { + InetAddress mInetaddr = null; + int port = 9100; + if (ip == null||ip.equals("")) { + } else { + try { + mInetaddr = InetAddress.getByName(ip); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + InetAddress finalMInetaddr = mInetaddr; + Timer timer = new Timer(); + timer.schedule(new TimerTask() { + @Override + public void run() { + try { + wifiSocket = new Socket(finalMInetaddr, port); + + myOutStream = wifiSocket.getOutputStream(); + myInStream = wifiSocket.getInputStream(); + mwifiListener.receivedmsg("finish"); + } catch (UnknownHostException var4) { + mwifiListener.receivedmsg("timeout"); + } catch (IOException var5) { + mwifiListener.receivedmsg("timeout"); + } + } + }, 1500); + + mwifiListener.receivedmsg(""); + } + } + + + public boolean disconncet() { + try { + Thread.sleep(1000L); + } catch (InterruptedException var6) { + } + mwifiListener.receivedmsg(""); + mwifiListener.receivedstatus(null); + if (myOutStream != null) { + try { + myOutStream.flush(); + } catch (IOException var5) { + } + + try { + myOutStream.close(); + } catch (IOException var4) { + } + + myOutStream = null; + } + + if (myInStream != null) { + try { + myInStream.close(); + } catch (IOException var3) { + } + + myInStream = null; + } + + if (wifiSocket != null) { + try { + wifiSocket.close(); + } catch (IOException var2) { + } + + wifiSocket = null; + } + + try { + Thread.sleep(200L); + } catch (InterruptedException var1) { + } + + return true; + } + + public void Write(byte[] Data) { + + isWrite = true; + if (isWrite) + { + isWrite = false; + new Thread(){ + @Override + public void run() + { + try { + myOutStream.write(Data); + isWrite = true; + } catch (IOException var2) { + mwifiListener.receivedmsg("发送数据失败"); + } + } + }.start(); + } + + } + + public void Write(byte[] Data, int DataLen) { + + isWrite = true; + if (isWrite) + { + isWrite = false; + new Thread(){ + @Override + public void run() + { + try { + myOutStream.write(Data, 0, DataLen); + isWrite = true; + } catch (IOException var2) { + mwifiListener.receivedmsg("发送数据失败"); + } + } + }.start(); + } + } + + public static void Flush() { + int DataLen = 0; + + try { + DataLen = myInStream.available(); + } catch (IOException var4) { + } + + for(int i = 0; i < DataLen; ++i) { + try { + myInStream.read(); + } catch (IOException var3) { + } + } + } + + + + public void Read(int Timeout) { + new Thread(){ + @Override + public void run() { + byte[] buffer = new byte[1024]; + int bytes; + int len = 0; + + try { + len = myInStream.available(); + } catch (IOException var4) { + } + + if (len>0) + { + try { + myInStream.skip(myInStream.available()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + while (true) + { + try { + bytes = myInStream.read(buffer); + if (bytes>0) + { + final byte[] data = new byte[bytes]; + System.arraycopy(buffer, 0, data, 0, bytes); + mwifiListener.receivedstatus(data); + return; + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + }.start(); + } +} diff --git a/app/src/main/java/com/ycgis/zpSDK/_PrinterPageImpl.java b/app/src/main/java/com/ycgis/zpSDK/_PrinterPageImpl.java new file mode 100644 index 0000000..439f36a --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/_PrinterPageImpl.java @@ -0,0 +1,837 @@ +package com.ycgis.zpSDK; + + +import android.graphics.Bitmap; +import android.util.Log; + +import java.io.UnsupportedEncodingException; +import java.nio.IntBuffer; +import java.util.List; + + +public class _PrinterPageImpl +{ + private String printStr = ""; //add printer cmd string + private byte[] printByte = new byte[1024*1024*2]; //add printer cmd byte[] + private int printByteLen = 0; + private String LastprintStr = ""; //last cmd string + private byte[] LastprintByte = new byte[1024*1024*2]; + private int LastprintByteLen = 0; + private int PrintTime = 1; + private int mHeight ; + private int mWidth; + public void Create(int width, int height) { + printStr = "";printByteLen = 0; + mHeight = height; + mWidth = width; + + } + + public void setPrintTime(int time){ + PrintTime=time; + } + + void add(String str) + { + printStr+=str; + } + + void addByte(byte[] buffer) + { + System.arraycopy(buffer, 0, printByte, printByteLen, buffer.length); + printByteLen += buffer.length; + } + + public void Create(int width, int height,int r,int gap) { + + printStr = "";printByteLen = 0; + mHeight = height; + mWidth= width; + switch (r){ + case 0: + add("ZPROTATE\r\n"); + break; + case 1: + add("ZPROTATE90\r\n"); + break; + case 2: + add("ZPROTATE180\r\n"); + break; + case 3: + add("ZPROTATE270\r\n"); + break; + default: + break; + } + if (gap==1) + add("GAP-SENSE\r\n"); + else if (gap== 2) + add("BAR-SENSE LEFT\r\n"); + else if (gap== 3) + add("BAR-SENSE\r\n"); + + } + + public String getPrintStr() + { + return LastprintStr; + } + + public byte[] getPrintByte() + { + byte[] buffer = new byte[LastprintByteLen]; + System.arraycopy(LastprintByte, 0, buffer, 0, LastprintByteLen); + return buffer; + } + + public void prefeed(int len) + { + add(String.format("PREFEED %d\r\n", new Object[] {Integer.valueOf(len)})); + } + public void postfeed(int len) + { + add(String.format("POSTFEED %d\r\n", new Object[] {Integer.valueOf(len)})) ; + } + + + public void INVERSE(int x0, int y0, int x1, int y1, int width) { + + String str = String.format("INVERSE-LINE %d %d %d %d %d\r\n", x0, y0, x1, y1, width); + add(str); + + } + + public void DrawBitmap(Bitmap bmp, int x, int y, boolean rotate) { + + int w = bmp.getWidth(); + int h = bmp.getHeight(); + int byteCountW = (w + 7) / 8; + int[] bmpData = new int[w * h]; + byte[] outData = new byte[byteCountW * h]; + bmp.copyPixelsToBuffer(IntBuffer.wrap(bmpData)); + + int i1; + for(int yy = 0; yy < h; ++yy) { + for(int xx = 0; xx < w; ++xx) { + int c = bmpData[yy * w + xx]; + i1 = c >> 16 & 255; + int g = c >> 8 & 255; + int b = c & 255; + int gray = (i1 * 30 + g * 59 + b * 11 + 50) / 100; + if(gray < 128) { + outData[byteCountW * yy + xx / 8] = (byte)(outData[byteCountW * yy + xx / 8] | 128 >> xx % 8); + } + } + } + String cmd = "EG"; + if(rotate) { + cmd = "VEG"; + } + + String strCmdHeader = String.format("%s %d %d %d %d ", new Object[]{cmd, Integer.valueOf(byteCountW), Integer.valueOf(h), Integer.valueOf(x), Integer.valueOf(y)}); + String strData = ""; + + for( i1 = 0; i1 < outData.length; ++i1) { + strData = strData + this.ByteToString(outData[i1]); + } + + add(strCmdHeader + strData + "000\r\n"); + } + + + + public void DrawBitmapCG(Bitmap bmp, int x, int y, boolean rotate) { + + int w = bmp.getWidth(); + int h = bmp.getHeight(); + int byteCountW = (w + 7) / 8; + int[] bmpData = new int[w * h]; + byte[] outData = new byte[byteCountW * h]; + bmp.copyPixelsToBuffer(IntBuffer.wrap(bmpData)); + + int i1; + for(int yy = 0; yy < h; ++yy) { + for(int xx = 0; xx < w; ++xx) { + int c = bmpData[yy * w + xx]; + i1 = c >> 16 & 255; + int g = c >> 8 & 255; + int b = c & 255; + int gray = (i1 * 30 + g * 59 + b * 11 + 50) / 100; + if(gray < 128) { + outData[byteCountW * yy + xx / 8] = (byte)(outData[byteCountW * yy + xx / 8] | 128 >> xx % 8); + } + } + } + String cmd = "CG"; + if(rotate) { + cmd = "VCG"; + } + String strCmdHeader = String.format("%s %d %d %d %d ", new Object[]{cmd, Integer.valueOf(byteCountW), Integer.valueOf(h), Integer.valueOf(x), Integer.valueOf(y)}); + addByte(strCmdHeader.getBytes()); + addByte(outData); + } + + public void barcodeText(int font, int size, int offset, int rotate, int width, int ratio, int height, int x, int y, String data) { + + String cm = String.format("BARCODE 128 %d %d %d %d %d %s\r\n", width, ratio, height,x,y,data); + if (rotate==1) + cm = String.format("VBARCODE 128 %d %d %d %d %d %s\r\n", width, ratio, height,x,y,data); + + String str = String.format("BARCODE-TEXT %d %d %d\r\n", font, size, offset); + add(str); + add(cm); + add("BARCODE-TEXT OFF\r\n"); + + } + + + + public void DrawText(int text_x, int text_y, String text, int fontSize, int rotate, int bold, boolean reverse, boolean underline) { + + if (bold!=0) + { + setBold(bold); + } + if (underline) + { + underLine(true); + } + + String cmd = "T"; + if (rotate == 90) cmd = "VT"; + if (rotate == 180) cmd = "T180"; + if (rotate == 270) cmd = "T270"; + + int f_size = 24; + int f_height = 24; + + if (fontSize == 1) { + f_size = 55; + f_height = 16; + } + + if (fontSize == 2) { + f_size = 24; + f_height = 24; + } + + if (fontSize == 3) { + f_size = 56; + f_height = 32; + } + + if (fontSize == 4) { + f_size = 24; + setMag(2,2); + f_height = 48; + } + + if (fontSize == 5) { + f_size = 56; + setMag(2,2); + f_height = 64; + } + + if (fontSize == 6) { + f_size = 24; + setMag(3,3); + f_height = 72; + } + + if (fontSize == 7) { + f_size = 32; + setMag(4,4); + f_height = 96; + } + if (fontSize == 8) { + f_size = 24; + setMag(5,5); + f_height = 120; + } + if (fontSize == 9) { + f_size = 32; + setMag(6,6); + f_height = 192; + } + if (fontSize == 10) { + f_size = 24; + setMag(7,7); + f_height = 168; + } + if (fontSize == 11) { + f_size = 32; + setMag(8,8); + f_height = 256; + } + if (fontSize == 12) { + f_size = 24; + setMag(9,9); + f_height = 216; + } + + + String temp = String.format("%s %d %d %d %d %s\r\n", new Object[]{cmd, Integer.valueOf(f_size), Integer.valueOf(0), Integer.valueOf(text_x), Integer.valueOf(text_y), text}); + add(temp); + if (reverse) { + + byte[] bytetext = (byte[]) null; + try { + bytetext = text.getBytes("gbk"); + } catch (UnsupportedEncodingException e) { + return; + } + if (bytetext == null) + return; + int block_h = f_height; + int block_w = f_height / 2 * bytetext.length; + + INVERSE(text_x, text_y, text_x + block_w, text_y, f_height); + + } + if (underline) + { + underLine(false); + } + setMag(0,0); + if (bold!=0) + { + setBold(0); + } +// int f_name = 1; +// int f_size = 0; +// int f_height = 1; +// if (mBold!=bold) +// { +// mBold=bold; +// setBold(mBold); +// } +// if (mUnderLine!=underline) +// { +// mUnderLine=underline; +// underLine(mUnderLine); +// } +// +// String textScale = ""; +// boolean f_width; +// if (fontSize == 1) { +// f_name = 55; +// f_width = true; +// f_height = 16; +// f_size = 0; +// } else if (fontSize == 2) { +// f_name = 20; +// f_width = true; +// f_height = 20; +// f_size = 0; +// } else if (fontSize == 3) { +// f_name = 24; +// f_width = true; +// f_height = 24; +// f_size = 0; +// } else if (fontSize == 4) { +// f_name = 28; +// f_width = true; +// f_height = 28; +// f_size = 0; +// } else if (fontSize == 5) { +// f_name = 56; +// f_width = true; +// f_height = 32; +// f_size = 0; +// } else if (fontSize == 6) { +// f_name = 24; +// f_width = true; +// f_height = 48; +// f_size = 0; +// setMag(2,2); +// } else if (fontSize == 7) { +// f_name = 56; +// f_width = true; +// f_height = 64; +// f_size = 0; +// setMag(2,2); +// } else if (fontSize == 8) { +// f_name = 56; +// f_width = true; +// f_height = 96; +// f_size = 0; +// setMag(3,3); +// } else { +// f_name = 24; +// f_width = true; +// f_height = 24; +// f_size = 0; +// setMag(0,0); +// } +// +// String cmd = "T"; +// if (rotate != 0) { +// if (rotate == 1) { +// cmd = "VT"; +// } else if (rotate == 2) { +// cmd = "T180"; +// } else if (rotate == 3) { +// cmd = "T270"; +// } +// } +// +// +// String str = String.format("%s %s %s %d %d %s\r\n", cmd, Integer.valueOf(f_name), Integer.valueOf(f_size), text_x, text_y, text); +// printStr+=str; +// +// +// if (reverse) { +// Object var16 = null; +// +// byte[] bytetext; +// try { +// bytetext = text.getBytes("gbk"); +// } catch (UnsupportedEncodingException var19) { +// return; +// } +// +// if (bytetext == null) { +// return; +// } +// +// int block_w = f_height / 2 * bytetext.length; +// this.INVERSE(text_x, text_y, text_x + block_w, text_y, f_height); +// } +// +// if (underline) +// underLine(false); +// +// if (bold!=0) { +// setBold(0); +// } +// +// +// setMag(0,0); + + + + + + } + + + public void SetPace() + { + add("PACE\r\n"); + } + + + public void DrawText(int text_x, int text_y, String text, int fontType,int fontSize, int rotate, int bold, boolean reverse, boolean underline) { + + if (underline) + { + underLine(true); + } + if (bold!=0) + { + setBold(bold); + } + + String cmd = "T"; + if (rotate == 90) cmd = "VT"; + if (rotate == 180) cmd = "T180"; + if (rotate == 270) cmd = "T270"; + + + int f_height = fontSize; + if (f_height==0) + f_height=24; + + + String temp = String.format("%s %d %d %d %d %s\r\n", new Object[]{cmd, Integer.valueOf(fontType), Integer.valueOf(fontSize), Integer.valueOf(text_x), Integer.valueOf(text_y), text}); + add(temp); + if (reverse) { + + byte[] bytetext = (byte[]) null; + try { + bytetext = text.getBytes("gbk"); + } catch (UnsupportedEncodingException e) { + return; + } + if (bytetext == null) + return; + int block_h = f_height; + int block_w = f_height / 2 * bytetext.length; + + INVERSE(text_x, text_y, text_x + block_w, text_y, f_height); + } + } + + public void DrawText(int text_x, int text_y, String text, String fontType,int fontSize, int rotate, int bold, boolean reverse, boolean underline) { + + if (underline) + { + underLine(true); + } + if (bold!=0) + { + setBold(bold); + } + + String cmd = "T"; + if (rotate == 90) cmd = "VT"; + if (rotate == 180) cmd = "T180"; + if (rotate == 270) cmd = "T270"; + + + //int f_height = 24*fontSize; + int f_height = fontSize; + if (f_height==0) + f_height=24; + + // setMag(fontSize,fontSize); + + String temp = String.format("%s %s %d %d %d %s\r\n", new Object[]{cmd, fontType, Integer.valueOf(fontSize), Integer.valueOf(text_x), Integer.valueOf(text_y), text}); + add(temp); + if (reverse) { + + byte[] bytetext = (byte[]) null; + try { + bytetext = text.getBytes("gbk"); + } catch (UnsupportedEncodingException e) { + return; + } + if (bytetext == null) + return; + int block_h = f_height; + int block_w = f_height / 2 * bytetext.length; + + INVERSE(text_x, text_y, text_x + block_w, text_y, f_height); + + + } + if (underline) + { + underLine(false); + } + setMag(0,0); + if (bold!=0) + { + setBold(0); + } + } + + public void count(int mun) { + String str = String.format("COUNT %d\r\n", new Object[] {Integer.valueOf(mun)}); + add(str); + } + + public void setMag(int w, int h) { + String str = String.format("SETMAG %d %d\r\n",new Object[] {Integer.valueOf(w), Integer.valueOf(h)}); + add(str); + } + + public void Drawbox(int x0, int y0, int x1, int y1, int width) { + + String str = String.format("BOX %d %d %d %d %d\r\n", new Object[] {Integer.valueOf(x0), Integer.valueOf(y0), Integer.valueOf(x1), Integer.valueOf(y1), Integer.valueOf(width)}); + add(str); + } + + public void DrawLine(int x0, int y0, int x1, int y1, int width) { + String str = String.format("LINE %d %d %d %d %d\r\n", new Object[] {Integer.valueOf(x0), Integer.valueOf(y0), Integer.valueOf(x1), Integer.valueOf(y1), Integer.valueOf(width)}); + add(str); + } + + + public void DrawBarcode1D(String type, int x, int y, String text, int width, int height, int rotate) { + + String cmd = "BARCODE"; + if (rotate==1) + cmd = "VBARCODE"; + String str = String.format("%s %s %d 1 %d %d %d %s\r\n", new Object[] { cmd, type, Integer.valueOf(width - 1), Integer.valueOf(height), Integer.valueOf(x), Integer.valueOf(y), text }); + + add(str); + } + public void DrawBarcodeQRcode(int x, int y, String text, int size, String errLevel, boolean rotate,int len) { + + String cmd = "BARCODE"; + if (rotate) + cmd = "VBARCODE"; + String str = String.format("%s QR %d %d M %d U %d\r\n", new Object[] { cmd, Integer.valueOf(x), Integer.valueOf(y), Integer.valueOf(len),Integer.valueOf(size) }); + add(str); + String tm = String.format("%sA,", errLevel); + add(tm); + add(text); + add("\r\nENDQR\r\n"); + } + + + + public void alignLeft() { + add("LEFT\r\n"); + } + public void alignRight() { + add("RIGHT\r\n"); + } + public void alignCenter() { + add("CENTER\r\n"); + } + public void end() { + add("END\r\n"); + } + public void about() { + add("ABOUT\r\n"); + } + + public class CONCAT + { + String str; + public CONCAT(int font, int size, int offset, String str) + { + + this.str = String.format("%d %d %d %s\r\n", new Object[] { Integer.valueOf(font), Integer.valueOf(size), Integer.valueOf(offset), str }); + } + public String getStr() + { + return this.str; + } + } + + public void textConcatenation(int x, int y, List concat, int rotate) { + String temp = String.format("CONCAT %d %d\r\n", new Object[] {Integer.valueOf(x), Integer.valueOf(y)}); + if (rotate==1) { + temp = String.format("VCONCAT %d %d\r\n", new Object[] {Integer.valueOf(x), Integer.valueOf(y)}); + } + add(temp); + for (int i=0;i> 4 & 0xF); + byte d2 = (byte)(data & 0xF); + str = String.valueOf(IntToHex(d1)) + IntToHex(d2); + return str; + } + public String version(){ + return "V1.5"; + } + +} + + + diff --git a/app/src/main/java/com/ycgis/zpSDK/printPDF.java b/app/src/main/java/com/ycgis/zpSDK/printPDF.java new file mode 100644 index 0000000..a78568a --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/printPDF.java @@ -0,0 +1,139 @@ +package com.ycgis.zpSDK; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.Rect; +import android.graphics.pdf.PdfRenderer; +import android.os.Build; +import android.os.Environment; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import androidx.annotation.RequiresApi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; + +public class printPDF { + + Context mCotext; + ArrayList mbitmaps=null; + + public printPDF(Context con) + { + mCotext = con; + mbitmaps = new ArrayList(); + } + + + /** 打开PDF文件 + * @param pdfPath pdf路径 + * @param maxWeight 最大宽度 + * */ + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + public void openPDF(String pdfPath, int maxWeight) + { + mbitmaps = pdfToBitmap(pdfPath,maxWeight); + //savePDFToImage("PRINT"); + } + + + + + /** PDF成功转化为Bitmap,并返回list + * */ + public ArrayList getMbitmaps() + {return mbitmaps;} + + + + /** 把PDF以PNG的格式保存到本地文件夹 + * @param Path 保存路径 + * */ + void savePDFToImage(String Path) + { + String savePath= Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+Path; + if (mbitmaps==null) + return; + for (int i = 0; i < mbitmaps.size(); i++) { + try { + File file = new File(savePath); + if (!file.exists()) { + file.mkdirs(); + } + String localFile = savePath + "/" + i + ".png"; + Log.i("test_sign", "图片全路径localFile = " + localFile); + File f = new File(localFile); + FileOutputStream fos = new FileOutputStream(f); + mbitmaps.get(i).compress(Bitmap.CompressFormat.PNG, 100, fos); + fos.flush(); + fos.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + + private Bitmap zoomImage(Bitmap bgimage, int newWidth) { +// 获取这个图片的宽和高 + float width = bgimage.getWidth(); + float height = bgimage.getHeight(); +// 创建操作图片用的matrix对象 + Matrix matrix = new Matrix(); +// 计算宽高缩放率 + double scale = (float)newWidth / width; + // Log.d("zkprinter","bmp zoomImage scale:"+scale); +// 缩放图片动作 + matrix.postScale((float)scale,(float)scale); + Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width, + (int) height, matrix, true); + // Log.d("zkprinter","bmp zoomImage width:"+bitmap.getWidth()+",height:"+bitmap.getHeight()); + return bitmap; + } + + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + private ArrayList pdfToBitmap(String pdfPath, int maxWeight) { + File pdfFile = new File(pdfPath); + ArrayList bitmaps = new ArrayList<>(); + PdfRenderer renderer = null; + try { + renderer = new PdfRenderer(ParcelFileDescriptor.open(pdfFile, ParcelFileDescriptor.MODE_READ_ONLY)); + + } catch (Exception ex) { + ex.printStackTrace(); + } + if (renderer==null) + return null; + Bitmap bitmap; + final int pageCount = renderer.getPageCount(); + for (int i = 0; i < pageCount; i++) { + PdfRenderer.Page page = renderer.openPage(i); + int width = mCotext.getResources().getDisplayMetrics().densityDpi / 72 * page.getWidth(); + int height = mCotext.getResources().getDisplayMetrics().densityDpi / 72 * page.getHeight(); + //Log.d("zkprinter","bmp ori1 width:"+width+",height:"+height); + bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + //todo 以下三行处理图片存储到本地出现黑屏的问题,这个涉及到背景问题 + Canvas canvas = new Canvas(bitmap); + canvas.drawColor(Color.WHITE); + canvas.drawBitmap(bitmap, 0, 0, null); + Rect r = new Rect(0, 0, width, height); + page.render(bitmap, r, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); + //Log.d("zkprinter","bmp ori2 width:"+bitmap.getWidth()+",height:"+bitmap.getHeight()); + Bitmap b=zoomImage(bitmap,maxWeight); + bitmaps.add(b); + // close the page + page.close(); + } + // close the renderer + renderer.close(); + return bitmaps; + } +} diff --git a/app/src/main/java/com/ycgis/zpSDK/wifiListener.java b/app/src/main/java/com/ycgis/zpSDK/wifiListener.java new file mode 100644 index 0000000..1b83f84 --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/wifiListener.java @@ -0,0 +1,7 @@ +package com.ycgis.zpSDK; + +public interface wifiListener { + + void receivedmsg(String msg); + void receivedstatus(byte[] statue); +} diff --git a/app/src/main/java/com/ycgis/zpSDK/zpPrinter.java b/app/src/main/java/com/ycgis/zpSDK/zpPrinter.java new file mode 100644 index 0000000..a76762c --- /dev/null +++ b/app/src/main/java/com/ycgis/zpSDK/zpPrinter.java @@ -0,0 +1,392 @@ +package com.ycgis.zpSDK; + + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.util.Log; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.List; + + +public class zpPrinter +{ + private Context context; + static int w; + static int h; + String TAG = "zpSDK"; + + _PrinterPageImpl impl=new _PrinterPageImpl(); + +/*************CPCL指令接口********************CPCL指令接口*************************CPCL指令接口*****************************/ + +public void drawDATAMATRIX(int x,int y,int h,String str) +{ + impl.drawDATAMATRIX(x,y,h,str); +} + + /**执行打印操作 + * @param skip 走纸方式 + * 0:不走纸;1:设置标签检测;2:设置左黑标检测指令;3:设置右黑标检测指令; + * */ + public String print(int horizontal, int skip) { + impl.print(skip); + return impl.getPrintStr(); + } + + public byte[] printByte(int horizontal, int skip) { + impl.print(skip); + return impl.getPrintByte(); + } + + + /**设置打印次数 + * @param time 次数 + * 设置打印次数,默认为 1 次 + * */ + + public void setPrintTime(int time){impl.setPrintTime(time);} + + public void noPrint(int horizontal, int skip) { + impl.print(skip); + } + + public void noPrint() { + impl.print(); + } + + /**执行打印操作*/ + public String print() { + impl.print(); + return impl.getPrintStr(); + } + + /**打印填入的CPCL指令*/ + public void printPrintStr() + { + Log.e(TAG, impl.getPrintStr() ); + } + + public String getprintPrintStr() + { + return impl.getPrintStr(); + } + + /**设置页面宽高*/ + public void pageSetup(int pageWidth, int pageHeight) { + w = pageWidth; + h = pageHeight; + impl.Create(pageWidth, pageHeight); + } + + /**设置页面宽高* + * @param pageWidth 打印纸宽度 + * @param pageHeight 打印纸高度 + * @param r 旋转180度打印 0:不旋转;1:旋转90;2:旋转180;3:旋转270; + * @param gap 走纸方式 + * 0:不走纸;1:设置标签检测;2:设置左黑标检测指令;3:设置右黑标检测指令; + */ + + public void pageSetup(int pageWidth, int pageHeight,int r,int gap) { + w = pageWidth; + h = pageHeight; + impl.Create(pageWidth, pageHeight,r,gap); + } + + + + + /** + * 打印矩形框 + * + * @param top_left_x 矩形框左上角 x 坐标 + * @param top_left_y 矩形框左上角 y 坐标 + * @param bottom_right_x 矩形框右下角 x 坐标 + * @param bottom_right_y 矩形框右下角 y 坐标 + * @param lineWidth 边框线条宽度 + */ + public void drawBox(int lineWidth, int top_left_x, int top_left_y, int bottom_right_x, int bottom_right_y) { + impl.Drawbox(top_left_x, top_left_y, bottom_right_x, bottom_right_y, + lineWidth); + } + + /** + * 打印实线 + * + * @param start_x 线条起始点 x 坐标 + * @param start_y 线条起始点 y 坐标 + * @param end_x 线条结束点 x 坐标 + * @param end_y 线条结束点 y 坐标 + * @param lineWidth 线条宽度 + */ + public void drawLine(int lineWidth, int start_x, int start_y, int end_x, int end_y, boolean fullline) { + impl.DrawLine(start_x, start_y, end_x, end_y, lineWidth); + } + + /** + * 打印文字 + * + * @param text 要打印的文本内容 + * @param text_x 文字起始横坐标 + * @param text_y 文字起始纵坐标 + * @param fontSize fontSize - 字体大小 + * @param rotate 旋转角度(逆时针) 支持 0; 90; 180 ;270; + * @param bold 打印粗细 + * @param reverse 反向打印 + * @param underline 下划线 + */ + public void drawText(int text_x, int text_y, String text, int fontSize, int rotate, int bold, boolean reverse, boolean underline) { + impl.DrawText(text_x, text_y, text, fontSize, rotate, bold, reverse, underline); + } + + /** + * 打印文字 + * + * @param text 要打印的文本内容 + * @param text_x 文字起始横坐标 + * @param text_y 文字起始纵坐标 + * @param fontType fontType - 字体类型(int) + * @param fontSize fontSize - 字体大小 + * @param rotate 旋转角度(逆时针) 支持 0; 90; 180 ;270; + * @param bold 打印粗细 + * @param reverse 反向打印 + * @param underline 下划线 + */ + + public void drawText(int text_x, int text_y, String text, int fontType,int fontSize, int rotate, int bold, boolean reverse, boolean underline){ + impl.DrawText(text_x, text_y, text, fontType,fontSize, rotate, bold, reverse, underline); +} + + /** + * 打印文字 + * + * @param text 要打印的文本内容 + * @param text_x 文字起始横坐标 + * @param text_y 文字起始纵坐标 + * @param fontType fontType - 字体类型(string) + * @param fontSize fontSize - 字体大小 + * @param rotate 旋转角度(逆时针) 支持 0; 90; 180 ;270; + * @param bold 打印粗细 + * @param reverse 反向打印 + * @param underline 下划线 + */ + + public void drawText(int text_x, int text_y, String text, String fontType,int fontSize, int rotate, int bold, boolean reverse, boolean underline){ + impl.DrawText(text_x, text_y, text, fontType,fontSize, rotate, bold, reverse, underline); + } + + /** + * 打印条形码 + * + * @param text 条形码的内容 + * @param start_x 条形码起始横坐标 + * @param start_y 条形码起始纵坐标 + * @param height 条形码高度 + * @param linewidth 条形码线宽度 + * @param type 条形码类型 0:CODE39; 1:CODE128;2:CODE93; 3:CODEBAR; 4:EAN8; 5:EAN13; 6:UPCA; 7:UPC-E; 8:I2OF5 + * @param rotate 旋转角度 支持 0:水平条码;1:竖直条码 + */ + public void drawBarCode(int start_x, int start_y, String text, int type, int rotate, int linewidth, int height) { + String type_ = "128"; + if (type == 0) + type_ = "39"; + if (type == 1) + type_ = "128"; + if (type == 2) + type_ = "93"; + if (type == 3) + type_ = "CODABAR"; + if (type == 4) + type_ = "EAN8"; + if (type == 5) + type_ = "EAN13"; + if (type == 6) + type_ = "UPCA"; + if (type == 7) + type_ = "UPCE"; + if (type == 8) { + type_ = "I2OF5"; + } + + impl.DrawBarcode1D(type_,start_x, start_y, text, linewidth, height, rotate); + + } + + /** + * 打印二维码 + * + * @param text 二维码内容 + * @param start_x 二维码起始横坐标 + * @param start_y 二维码起始纵坐标 + * @param ver 二维码放大倍数,值的范围是1-32,默认填6 + * @param lel 二维码版本型号,值的范围是1-40,越大标识尺寸越大,尺寸17+n*4,0表示自动 + * @param rotate 旋转角度 + */ + public void drawQrCode(int start_x, int start_y, String text, int rotate, int ver, int lel) { impl.DrawBarcodeQRcode(start_x, start_y, text, ver,"M",false,lel); } + + + /** + * 打印图片 + * + * @param start_x 位图开始的X坐标 + * @param start_y 位图开始的Y坐标 + * @param bmp_size_x 位图高 + * @param bmp_size_y 位图宽 + * @param bmp 位图 + */ + //public void drawGraphic(int start_x, int start_y, int bmp_size_x, int bmp_size_y, Bitmap bmp) { impl.DrawBitmap(bmp,start_x, start_y,false); } + public void drawGraphic(int start_x, int start_y, int bmp_size_x, int bmp_size_y, Bitmap bmp) { impl.DrawBitmapCG(bmp,start_x, start_y,false); } + + public void drawImageFormFile(int start_x, int start_y, String filepath) { + + Bitmap bmp=null; + FileInputStream fis = null; + try { + fis = new FileInputStream(filepath); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return; + } + + bmp = BitmapFactory.decodeStream(fis); + impl.DrawBitmap(bmp,start_x, start_y,false); + } + + /**反白线段*/ + public void drawINVERSE(int x0, int y0, int x1, int y1, int width) { impl.INVERSE(x0, y0, x1, y1, width); } + /**打印前走纸 + * {length}: 走纸距离点数。8点=1mm + */ + public void prefeed(int len) { impl.prefeed(len); } + /**打印后走纸 + * {length}: 走纸距离点数。8点=1mm + */ + public void postfeed(int len) { impl.postfeed(len); } + /**左对齐*/ + public void alignLeft() { impl.alignLeft(); } + /**右对齐*/ + public void alignRight() { impl.alignRight(); } + /**中心对齐*/ + public void alignCenter() { impl.alignCenter(); } + /**结束指令*/ + public void end() { impl.end(); } + /**忽略指令*/ + public void about() { impl.about(); } + /**数字自动增减; + * ±65535内的任意整数*/ + public void count(int mun) { impl.count(mun); } + /**字符放大*/ + public void setMag(int w, int h) { impl.setMag(w,h); } + /**字符间距 + * 字符与字符之间的间隔大小,spacing*0.125mm + */ + public void setSP(int spacing){impl.setSP(spacing);} + + /**批量打印 + * 按下走纸键打印第二张,再按下打印第三张 + */ + public void setPace() { + impl.SetPace(); + } + + /**设置对比度指令 + {level}: 对比度等级 + 0 = 默认 + 1 = 中等 + 2 = 黑 + 3 = 非常黑 + 设置打印对比度。对比度越高,打印越黑,打印速度越慢 + */ + public void contRast(int level) { impl.contRast(level); } + /**打印速度 + * {speed level}: 0-5的数值,0是最慢的速度 + */ + public void speed(int level) { impl.speed(level); } + /**设置字体为粗体 + * {level} = 0 取消粗体模式 + * {level} > 1 设置打印字体为粗体 + */ + public void setBold(int level) { impl.setBold(level); } + /**延时打印 + * 延时1/8的时间*/ + public void printWait(int time) { impl.printWait(time); } + + /** + * 条码识别符 + * + * @param font 识别符字体编号 + * @param size 识别符字号 + * @param offset 离条码远近的偏移点数 8点=1mm + * @param rotate 旋转角度 支持 0:水平条码;1:竖直条码 + * @param width 窄条码的宽度点数,默认1 + * @param ratio 宽条码和窄条码的比率,默认1 + * @param height 条码高度点数(8点/mm) + * @param x 条码开始的X轴坐标 + * @param y 条码开始的Y轴坐标 + * @param data 条码数据 + */ + public void barcodeText(int font, int size, int offset, int rotate, int width, int ratio, int height, int x, int y, String data) { + impl.barcodeText(font, size, offset, rotate, width, ratio, height, x, y, data); + } + + /** + * 文字关联 + * + * @param x X轴 开始坐标 + * @param y Y轴 开始坐标 + * @param concat 离条码远近的偏移点数 8点=1mm + * @param rotate 旋转角度 支持 0:水平条码;1:竖直条码 + // * class CONCAT + // * { + // * @param str 要打印的文本内容 + // * @param font 字体的名字或者编号 + // * @param size 字体字号 + // * @param offset 开始坐标的偏移点数 8点=1mm + // * public CONCAT(int font,int size,int offset,String str) + // * } + */ + public void textConcatenation(int x, int y, List<_PrinterPageImpl.CONCAT> concat, int rotate) { + impl.textConcatenation(x, y, concat, rotate); + } + + /** + * 多行打印 + * + * @param height 每行文字的高度 + * @param fontSize 字体标号 + * @param fontSize 字体大小 + * @param x X轴开始坐标 + * @param y Y轴开始坐标 + * @param rotate 旋转角度(逆时针) 支持 0 90 180 270 + * @param strs 需要打印的文字 + */ + public void multLine(int height, int fontType,int fontSize, int x, int y, int rotate, String... strs) { + impl.multLine(height, fontType,fontSize,x, y, rotate, strs); + } + + /** + * 水印文字灰度级 + * @param level 设置水印文字的灰度0-255,值越大颜色越深 + */ + public void backGround(int level) { impl.backGround(level); } + + /** + * 打印水印 + * + * @param font 字体名字或者编号 + * @param size 字号 + * @param x X轴开始坐标 + * @param y Y轴开始坐标 + * @param rotate 旋转角度(逆时针) 支持 0 90 180 270 + * @param str 需要打印的文字 + * @param lev 水印深浅0-255 + */ + public void bkText(int font, int size, int x, int y, int lev,String str, int rotate) { + impl.bkText(font, size, x, y, lev,str, rotate); + } + + /**版本信息*/ + public String version() { return impl.version(); } +} diff --git a/app/src/main/res/drawable-xxxhdpi/sr_yysqlc.png b/app/src/main/res/drawable-xxxhdpi/sr_yysqlc.png deleted file mode 100644 index 116d5ac..0000000 Binary files a/app/src/main/res/drawable-xxxhdpi/sr_yysqlc.png and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/sr_yysqlc_ii.png b/app/src/main/res/drawable-xxxhdpi/sr_yysqlc_ii.png new file mode 100644 index 0000000..65b21c0 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/sr_yysqlc_ii.png differ diff --git a/app/src/main/res/layout/activity_apply_details.xml b/app/src/main/res/layout/activity_apply_details.xml index f0b4b6e..bce72df 100644 --- a/app/src/main/res/layout/activity_apply_details.xml +++ b/app/src/main/res/layout/activity_apply_details.xml @@ -141,6 +141,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" + android:visibility="gone" android:background="@color/colorWhite" android:orientation="horizontal" android:minHeight="@dimen/dp40" @@ -183,7 +184,7 @@ @@ -194,7 +195,7 @@ android:layout_height="wrap_content" android:layout_marginEnd="@dimen/dp8" android:gravity="center_vertical" - android:hint="角色名称" + android:hint="权限名称" android:textColor="@color/colorGrey8" android:textColorHint="@color/colorGrey5" android:textSize="@dimen/sp16" /> diff --git a/app/src/main/res/layout/activity_apply_process.xml b/app/src/main/res/layout/activity_apply_process.xml index b022d14..bc1467a 100644 --- a/app/src/main/res/layout/activity_apply_process.xml +++ b/app/src/main/res/layout/activity_apply_process.xml @@ -98,14 +98,19 @@ + app:layout_constraintTop_toBottomOf="@+id/base_title" + app:layout_constraintVertical_bias="0.0" /> - + diff --git a/app/src/main/res/layout/activity_bluetooth.xml b/app/src/main/res/layout/activity_bluetooth.xml new file mode 100644 index 0000000..2e68457 --- /dev/null +++ b/app/src/main/res/layout/activity_bluetooth.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + +