diff --git a/app/build.gradle b/app/build.gradle index ce5cec5..167b9ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -156,6 +156,24 @@ dependencies { // implementation(name: 'EsignSDK', ext: 'aar') + //交通厅 + implementation 'com.lzy.net:okgo:3.0.4' + implementation 'com.alibaba:fastjson:1.2.61' + implementation 'org.bouncycastle:bcprov-jdk15on:1.55' + implementation 'org.apache.commons:commons-lang3:3.5' +// implementation(name: 'locationgd-androidx_2.1.0', ext: 'aar')//交通厅 + implementation files('libs/locationgd-androidx_2.1.0.aar') + + //安联 + //当引入的与之前引入的库有重复冲突部分的时候,使用compileOnly + implementation files('libs\\mdp_sdk.jar') + implementation 'com.loopj.android:android-async-http:1.4.9' + implementation 'com.j256.ormlite:ormlite-android:4.48' + implementation 'com.j256.ormlite:ormlite-core:4.48' + compileOnly 'com.github.hotchemi:permissionsdispatcher:2.3.1' + annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:2.3.1' + + //友盟 implementation 'com.umeng.umsdk:common:9.6.3'// 必选 implementation 'com.umeng.umsdk:asms:1.8.0'// 必选 diff --git a/app/libs/arm64-v8a/libBaiduMapSDK_base_v5_1_0.so b/app/libs/arm64-v8a/libBaiduMapSDK_base_v5_1_0.so new file mode 100644 index 0000000..4d7ea83 Binary files /dev/null and b/app/libs/arm64-v8a/libBaiduMapSDK_base_v5_1_0.so differ diff --git a/app/libs/arm64-v8a/libBaiduMapSDK_map_v5_1_0.so b/app/libs/arm64-v8a/libBaiduMapSDK_map_v5_1_0.so new file mode 100644 index 0000000..0bdae20 Binary files /dev/null and b/app/libs/arm64-v8a/libBaiduMapSDK_map_v5_1_0.so differ diff --git a/app/libs/arm64-v8a/libindoor.so b/app/libs/arm64-v8a/libindoor.so new file mode 100644 index 0000000..f8e8ca8 Binary files /dev/null and b/app/libs/arm64-v8a/libindoor.so differ diff --git a/app/libs/arm64-v8a/liblocSDK7b.so b/app/libs/arm64-v8a/liblocSDK7b.so new file mode 100644 index 0000000..6bab09a Binary files /dev/null and b/app/libs/arm64-v8a/liblocSDK7b.so differ diff --git a/app/libs/armeabi-v7a/libBaiduMapSDK_base_v5_1_0.so b/app/libs/armeabi-v7a/libBaiduMapSDK_base_v5_1_0.so new file mode 100644 index 0000000..6366af7 Binary files /dev/null and b/app/libs/armeabi-v7a/libBaiduMapSDK_base_v5_1_0.so differ diff --git a/app/libs/armeabi-v7a/libBaiduMapSDK_map_v5_1_0.so b/app/libs/armeabi-v7a/libBaiduMapSDK_map_v5_1_0.so new file mode 100644 index 0000000..312c582 Binary files /dev/null and b/app/libs/armeabi-v7a/libBaiduMapSDK_map_v5_1_0.so differ diff --git a/app/libs/armeabi-v7a/libindoor.so b/app/libs/armeabi-v7a/libindoor.so new file mode 100644 index 0000000..177ad25 Binary files /dev/null and b/app/libs/armeabi-v7a/libindoor.so differ diff --git a/app/libs/armeabi-v7a/liblocSDK7b.so b/app/libs/armeabi-v7a/liblocSDK7b.so new file mode 100644 index 0000000..dd040ea Binary files /dev/null and b/app/libs/armeabi-v7a/liblocSDK7b.so differ diff --git a/app/libs/locationgd-androidx_2.1.0.aar b/app/libs/locationgd-androidx_2.1.0.aar new file mode 100644 index 0000000..205f699 Binary files /dev/null and b/app/libs/locationgd-androidx_2.1.0.aar differ diff --git a/app/libs/mdp_sdk.jar b/app/libs/mdp_sdk.jar new file mode 100644 index 0000000..20ebea2 Binary files /dev/null and b/app/libs/mdp_sdk.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5a9cf45..e8e37d8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,6 +16,9 @@ + + + @@ -423,6 +426,47 @@ android:configChanges="orientation|keyboardHidden|screenSize|navigation" android:launchMode="singleInstance" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/base/App.kt b/app/src/main/java/com/dahe/gldriver/base/App.kt index 94502e0..488df6d 100644 --- a/app/src/main/java/com/dahe/gldriver/base/App.kt +++ b/app/src/main/java/com/dahe/gldriver/base/App.kt @@ -1,16 +1,21 @@ package com.dahe.gldriver.base +import android.app.ActivityManager import android.app.Application import android.app.PendingIntent import android.app.PendingIntent.* import android.content.Context import android.content.Intent +import android.os.Process import android.util.Log +import com.alct.mdp.MDPLocationCollectionManager import com.dahe.gldriver.BuildConfig import com.dahe.gldriver.R import com.dahe.gldriver.net.Api import com.dahe.gldriver.oss.OssServiceUtil import com.dahe.gldriver.push.PushHelper +import com.dahe.gldriver.third.JTTProcess +import com.dahe.gldriver.third.SPUtil import com.dahe.gldriver.ui.HomeActivity import com.dahe.gldriver.utils.OrderUtils import com.dahe.mylibrary.CommonBaseLibrary @@ -54,6 +59,8 @@ class App : Application() { // EsignSdk.getInstance().init(AppConfig.E_KEY, AppConfig.E_LICENSE) initUmeng() + initThird() + var pendingIntent: PendingIntent = getActivity( applicationContext, 0, Intent(applicationContext, HomeActivity::class.java), @@ -93,6 +100,26 @@ class App : Application() { super.attachBaseContext(base) } + private fun initThird() { + val state: String = SPUtil.getSP(this, "state_data", "authorization_state") + if ("1" == state) { + try { + //安联初始化 + if (packageName == getCurrentProcessName(this)) { + //Log.e("--使用的测试环境--",BuildConfig.OPEN_API_URL); + MDPLocationCollectionManager.initialize(this, BuildConfig.OPEN_AL_URL) + } + + //初始化交通厅 + JTTProcess.init(this) + SPUtil.insSP(this, "state_data", "authorization_state", "1") + } catch (e: Exception) { + SPUtil.insSP(this, "state_data", "authorization_state", "0") + } + } + } + + //忽略https的证书校验 fun handleSSLHandshake() { try { @@ -168,4 +195,18 @@ class App : Application() { companion object { var app: App? = null } + + fun getCurrentProcessName(context: Context): String? { + var currentProcessName = "" + val pid = Process.myPid() + val mActivityManager = context.getSystemService(ACTIVITY_SERVICE) as ActivityManager + if (mActivityManager.runningAppProcesses != null && mActivityManager.runningAppProcesses.size > 0) { + for (appProcess in mActivityManager.runningAppProcesses) { + if (appProcess.pid == pid) { + currentProcessName = appProcess.processName + } + } + } + return currentProcessName + } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/bean/FqBean.java b/app/src/main/java/com/dahe/gldriver/bean/FqBean.java new file mode 100644 index 0000000..3dd8aef --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/bean/FqBean.java @@ -0,0 +1,119 @@ +package com.dahe.gldriver.bean; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/11/23 19:16 + * @description: + */ +public class FqBean { + + private int pageSize; + private int currentPage; + private int totalCount; + private int totalPage; + private List driverInvoices; + //{"currentPage":100,"driverInvoices":[],"pageSize":1,"totalCount":0,"totalPage":0} + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = currentPage; + } + + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + public int getTotalPage() { + return totalPage; + } + + public void setTotalPage(int totalPage) { + this.totalPage = totalPage; + } + + public List getDriverInvoices() { + if (driverInvoices == null) { + return new ArrayList<>(); + } + return driverInvoices; + } + + public void setDriverInvoices(List driverInvoices) { + this.driverInvoices = driverInvoices; + } + + public class Invoice{ + String invoiceReceiverName; //受票方,string类型 + double taxRate; //发票税率,double类型 + double taxAmount; //税额, double类型 + double totalAmount; //金额, double类型 + double totalAmountIncludeTax; //金额+税额,double类型 + String driverInvoiceCode; //发票编号,string类型 + + public String getInvoiceReceiverName() { + return invoiceReceiverName == null ? "" : invoiceReceiverName; + } + + public void setInvoiceReceiverName(String invoiceReceiverName) { + this.invoiceReceiverName = invoiceReceiverName; + } + + public double getTaxRate() { + return taxRate; + } + + public void setTaxRate(double taxRate) { + this.taxRate = taxRate; + } + + public double getTaxAmount() { + return taxAmount; + } + + public void setTaxAmount(double taxAmount) { + this.taxAmount = taxAmount; + } + + public double getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(double totalAmount) { + this.totalAmount = totalAmount; + } + + public double getTotalAmountIncludeTax() { + return totalAmountIncludeTax; + } + + public void setTotalAmountIncludeTax(double totalAmountIncludeTax) { + this.totalAmountIncludeTax = totalAmountIncludeTax; + } + + public String getDriverInvoiceCode() { + return driverInvoiceCode == null ? "" : driverInvoiceCode; + } + + public void setDriverInvoiceCode(String driverInvoiceCode) { + this.driverInvoiceCode = driverInvoiceCode; + } + } +} diff --git a/app/src/main/java/com/dahe/gldriver/bean/JTT.java b/app/src/main/java/com/dahe/gldriver/bean/JTT.java new file mode 100644 index 0000000..35d3d69 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/bean/JTT.java @@ -0,0 +1,140 @@ +package com.dahe.gldriver.bean; + +/** + * @author hlh + * @version 1.0.0 + * @date 2022/2/16 17:37 + * @description: + */ +public class JTT { + + private int code; + private DataDTO data; + private String msg; + private boolean success; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataDTO getData() { + return data; + } + + public void setData(DataDTO data) { + this.data = data; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public static class DataDTO { + private String createTime; + private boolean delFlag; + private int id; + private String trafficCode; + private String trafficId; + private String trafficName; + private String trafficNum; + private String trafficSecret; + private String trafficType; + private String updateTime; + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public boolean isDelFlag() { + return delFlag; + } + + public void setDelFlag(boolean delFlag) { + this.delFlag = delFlag; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTrafficCode() { + return trafficCode; + } + + public void setTrafficCode(String trafficCode) { + this.trafficCode = trafficCode; + } + + public String getTrafficId() { + return trafficId; + } + + public void setTrafficId(String trafficId) { + this.trafficId = trafficId; + } + + public String getTrafficName() { + return trafficName; + } + + public void setTrafficName(String trafficName) { + this.trafficName = trafficName; + } + + public String getTrafficNum() { + return trafficNum; + } + + public void setTrafficNum(String trafficNum) { + this.trafficNum = trafficNum; + } + + public String getTrafficSecret() { + return trafficSecret; + } + + public void setTrafficSecret(String trafficSecret) { + this.trafficSecret = trafficSecret; + } + + public String getTrafficType() { + return trafficType; + } + + public void setTrafficType(String trafficType) { + this.trafficType = trafficType; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/dahe/gldriver/bean/LUInputBean.kt b/app/src/main/java/com/dahe/gldriver/bean/LUInputBean.kt new file mode 100644 index 0000000..e2fec15 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/bean/LUInputBean.kt @@ -0,0 +1,16 @@ +package com.dahe.gldriver.bean + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/8/13 10:27 + * @description:装卸货输入参数实体 + */ +class LUInputBean { + var imageId: List? = null + var latitude: String? = null + var locationAddress: String? = null + var longitude: String? = null + var waybillId: String? = null + var realLoadTime: String? = null +} diff --git a/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt b/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt index e521afa..a60fdfc 100644 --- a/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt +++ b/app/src/main/java/com/dahe/gldriver/bean/OrderDetailBean.kt @@ -15,6 +15,7 @@ data class OrderDetailBean( val loadingDeadline: String, val orderChildList: List, val orderId: String, + val orderNum: String, val orderStatus: String, val phone: String, @@ -34,7 +35,11 @@ data class OrderDetailBean( val vehicleType: String, val waybillId: String, val vehicleNum: String, + val loadingAreaCode: String, + val receiverAreaCode: String, val waybillInfo: WaybillInfo + + ) data class CaptainInfo( @@ -64,6 +69,7 @@ data class OrderChild( val city: String, val cityCode: String, val cost: String, + val isPassingPoints: String,//是否途经点(0=否,1=是) val displayOrder: String, val isPassingPoStrings: String, val latitude: String, @@ -99,7 +105,7 @@ data class WaybillInfo( val trailerId: String, val trailerVehicleNum: String, val unloadTime: String, - val vehicleNum: String, + var vehicleNum: String, val carLong: String, val approvedLoad: String, val vehicleType: String, diff --git a/app/src/main/java/com/dahe/gldriver/third/ALProcess.kt b/app/src/main/java/com/dahe/gldriver/third/ALProcess.kt new file mode 100644 index 0000000..35d87e1 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/third/ALProcess.kt @@ -0,0 +1,105 @@ +package com.dahe.gldriver.third + +import android.content.Context +import android.os.Handler +import android.util.Log +import com.alct.mdp.MDPLocationCollectionManager +import com.alct.mdp.callback.OnDownloadResultListener +import com.alct.mdp.callback.OnResultListener +import com.alct.mdp.model.Identity +import com.dahe.gldriver.BuildConfig +import com.dahe.gldriver.bean.FqBean +import com.dahe.gldriver.utils.SPUtils.Companion.instance +import com.google.gson.Gson + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/8/16 10:35 + * @description:安联流程 + */ +class ALProcess { + companion object { + //企业代码 + private const val ENTERPRISE_CODE = "E0019169" + + //企业app的身份码 + private const val APP_IDENTITY = "b4a472a025e443b383970cdd5465552e" + + //企业app验证码 + private const val APP_KEY = "b948efbb4c2a4ba0805c534f2fba0c89" + + //企业代码-测试 + private const val ENTERPRISE_CODE_TEXT = "E0019093" + + //企业app的身份码-测试 + private const val APP_IDENTITY_TEXT = "a15b4ba5bd2542cc9a6bea9bdadf9ef9" + + //企业app验证码-测试 + private const val APP_KEY_TEXT = "07a6256cad5642138ed6e962a5a157be" + fun verification(con: Context?) { + val (_, _, _, _, idcard) = instance.getUserInfo(con) + val idy = Identity() + //企业代码 + idy.enterpriseCode = if (BuildConfig.isTest) ENTERPRISE_CODE_TEXT else ENTERPRISE_CODE + //企业app的身份码 + idy.appIdentity = if (BuildConfig.isTest) APP_IDENTITY_TEXT else APP_IDENTITY + //企业app验证码 + idy.appKey = if (BuildConfig.isTest) APP_KEY_TEXT else APP_KEY + //司机身份证 + idy.driverIdentity = idcard + //idy.setDriverIdentity("410725198311042012"); + MDPLocationCollectionManager.register(con, idy, object : OnResultListener { + override fun onSuccess() { + Log.e("--success--", "验证成功") + getFq(con) + } + + override fun onFailure(s: String, s1: String) { + Log.e("--error--", s + s1 + "") + // new MessageUtils().showCenMessage(con,s1); + } + }) + } + + fun getFq(con: Context?) { + MDPLocationCollectionManager.getInvoices( + con, + 100, + 1, + object : OnDownloadResultListener { + override fun onSuccess(o: Any) { + Log.e("--获取发票列表成功--", Gson().toJson(o)) + try { + val fb = Gson().fromJson(Gson().toJson(o), FqBean::class.java) + applyFq(con, fb) + } catch (e: Exception) { + Log.e("--失败--", "数据解析失败") + } + } + + override fun onFailure(s: String, s1: String) { + Log.e("--获取发票列表失败--", s + s1 + "") + } + }) + } + + fun applyFq(con: Context?, fb: FqBean) { + for (driverInvoice in fb.driverInvoices) { + MDPLocationCollectionManager.confirmInvoice( + con, + if (BuildConfig.isTest) ENTERPRISE_CODE_TEXT else ENTERPRISE_CODE, + driverInvoice.driverInvoiceCode, + object : OnResultListener { + override fun onSuccess() { + Log.e("--成功--", "申请发票成功") + } + + override fun onFailure(s: String, s1: String) { + Log.e("--失败--", "申请发票失败$s$s1") + } + }) + } + } + } +} diff --git a/app/src/main/java/com/dahe/gldriver/third/JTTConstant.kt b/app/src/main/java/com/dahe/gldriver/third/JTTConstant.kt new file mode 100644 index 0000000..ae4bef2 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/third/JTTConstant.kt @@ -0,0 +1,13 @@ +package com.dahe.gldriver.third + +/** + * @author hlh + * @version 1.0.0 + * @date 2022/1/10 11:34 + * @description:交通厅参数 + */ +object JTTConstant { + const val JTT_DATA_NAME = "jtt_data" + const val JTT_DATA_JTTORDER_KEY = "JTT_order_key" + const val JTT_DATA_ORDER_KEY = "order_key" +} diff --git a/app/src/main/java/com/dahe/gldriver/third/JTTProcess.kt b/app/src/main/java/com/dahe/gldriver/third/JTTProcess.kt new file mode 100644 index 0000000..f0ae8e2 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/third/JTTProcess.kt @@ -0,0 +1,267 @@ +package com.dahe.gldriver.third + +import android.app.Application +import android.content.Context +import android.content.Intent +import android.util.Log +import com.dahe.gldriver.bean.JTT +import com.dahe.gldriver.bean.OrderDetailBean +import com.dahe.gldriver.utils.SPUtils +import com.dahe.gldriver.utils.StringUtil +import com.google.gson.Gson +import com.hdgq.locationlib.LocationOpenApi +import com.hdgq.locationlib.entity.ShippingNoteInfo +import com.hdgq.locationlib.listener.OnResultListener +import com.hdgq.locationlib.listener.OnSendResultListener + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/12/10 9:38 + * @description:交通厅位置上传sdk + */ +object JTTProcess { + private const val APPID = "com.arpa.hndahesudintocctmsdriver" + private const val APP_SECURITY = + "01e20fc6585a42738ac88a12321dc41bff473b4b20184aacbbcee7d7864359a6" + private const val CODE = "41110447" + private const val ENVIRONMENT = "release" + private val gson = Gson() + + //初始化+获取授权 + fun init(app: Application?) { + LocationOpenApi.init(app) + //auth(app.getBaseContext()); + } + + //获取授权 + fun auth(con: Context) { + val jttStr: String = SPUtil.getSP(con, "data", "jtt") + val jtt = gson.fromJson(jttStr, JTT::class.java) + if (jtt.data == null) { + return + } + LocationOpenApi.auth(con, APPID, StringUtil.isNull(jtt.data.trafficCode, APP_SECURITY), + StringUtil.isNull(jtt.data.trafficId, CODE), + ENVIRONMENT, object : OnResultListener { + override fun onFailure(s: String, s1: String) { + Log.e("交通厅-获取授权", s + s1) + } + + override fun onSuccess(list: List) { + Log.e("交通厅-获取授权", gson.toJson(list)) + if (list.size > 0) { + SPUtil.insSP( + con, + JTTConstant.JTT_DATA_NAME, + JTTConstant.JTT_DATA_JTTORDER_KEY, + gson.toJson( + list[0] + ) + ) + val `in` = Intent(con, JTTSendService::class.java) + con.startService(`in`) + } + } + }) + } + + //开启定位-装货 + //shippingNoteInfos 为运单信息列表,考虑到一车多单的情况,本版SDK 一辆车运单数最大支持数为 10。 + fun start(con: Context, sob: OrderDetailBean, remark: String?) { + val snis = arrayOfNulls(1) + val sni = ShippingNoteInfo() + val startWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "1" } + val endWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "2" } + sni.shippingNoteNumber = sob.orderNum + sni.serialNumber = "0000" + sni.startLatitude = startWay.latitude.toDouble() + sni.startLongitude = startWay.longitude.toDouble() + sni.startLocationText = startWay.province + startWay.city + startWay.area + startWay.address + sni.startCountrySubdivisionCode = sob.loadingAreaCode + sni.endLatitude = endWay.latitude.toDouble() + sni.endLongitude = endWay.longitude.toDouble() + sni.endLocationText = endWay.province + endWay.city + endWay.area + endWay.address + sni.endCountrySubdivisionCode = sob.receiverAreaCode + snis[0] = sni + // Log.e("起点代码",sob.getData().getStartCountrySubdivisionCode()); +// Log.e("终点代码",sob.getData().getEndCountrySubdivisionCode()); +// AMapLocationClient.updatePrivacyShow(con,true,true); +// AMapLocationClient.updatePrivacyAgree(con,true); + + LocationOpenApi.start( + con, + sob.waybillInfo.vehicleNum, + if (SPUtils.instance.getUserInfo(con).idcardName == null) "" else SPUtils.instance.getUserInfo( + con + ).idcardName, + remark, + snis, + object : OnResultListener { + override fun onFailure(s: String, s1: String) { + Log.e("交通厅-开启定位失败", s + s1 + "") + } + + override fun onSuccess(list: List) { + Log.e("交通厅-开启定位成功", gson.toJson(list)) + if (list.size > 0) { + SPUtil.insSP( + con, + JTTConstant.JTT_DATA_NAME, + JTTConstant.JTT_DATA_JTTORDER_KEY, + gson.toJson( + list[0] + ) + ) + val `in` = Intent(con, JTTSendService::class.java) + con.startService(`in`) + } + } + }) + } + + //发送定位 + //参数 ShippingNoteInfo 和 start 接口中的参数 ShippingNoteInfo 相 + //同,这里 shippingNoteInfo 信息只需传入运单号和分单号即可 + fun send(con: Context?, sob: OrderDetailBean, remark: String?) { + val snis = arrayOfNulls(1) + val sni = ShippingNoteInfo() + sni.shippingNoteNumber = sob.orderNum + sni.serialNumber = "0000" + sni.startCountrySubdivisionCode = sob.loadingAreaCode + sni.endCountrySubdivisionCode = sob.receiverAreaCode + snis[0] = sni + LocationOpenApi.send( + con, + sob.waybillInfo.vehicleNum, + if (SPUtils.instance.getUserInfo(con).idcardName == null) "" else SPUtils.instance.getUserInfo( + con + ).idcardName, + remark, + snis, + object : OnSendResultListener { + override fun onFailure(s: String, s1: String, list: List) { + Log.e("交通厅-发送定位失败", s + s1 + "") + } + + override fun onSuccess(list: List) { + Log.e("交通厅-发送定位成功", gson.toJson(list)) + } + }) + } + + //暂停定位 + //运单运输过程中,如果出现换驾驶员、换车或换手机的情况,则需驾驶员在原手机上操作,对运送运单列表执行暂停操作, + //调用本接口将运单列表中所有运单标记为暂停状态,并结束本手机的运单定位。 + fun pause(con: Context?, sob: OrderDetailBean, remark: String?) { + val snis = arrayOfNulls(1) + val sni = ShippingNoteInfo() + val startWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "1" } + val endWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "2" } + sni.shippingNoteNumber = sob.orderNum + sni.serialNumber = "0000" + sni.startLatitude = startWay.latitude.toDouble() + sni.startLongitude = startWay.longitude.toDouble() + sni.startLocationText = startWay.province + startWay.city + startWay.area + startWay.address + sni.startCountrySubdivisionCode = sob.loadingAreaCode + sni.endLatitude = endWay.latitude.toDouble() + sni.endLongitude = endWay.longitude.toDouble() + sni.endLocationText = endWay.province + endWay.city + endWay.area + endWay.address + sni.endCountrySubdivisionCode = sob.receiverAreaCode + snis[0] = sni + LocationOpenApi.pause( + con, + sob.waybillInfo.vehicleNum, + if (SPUtils.instance.getUserInfo(con).idcardName == null) "" else SPUtils.instance.getUserInfo( + con + ).idcardName, + remark, + snis, + object : OnResultListener { + override fun onFailure(s: String, s1: String) { + Log.e("交通厅-暂停定位失败", s + s1 + "") + } + + override fun onSuccess(list: List) { + Log.e("交通厅-暂停定位成功", gson.toJson(list)) + } + }) + } + + //重启定位 + //对应 pause 接口,本接口的作用是对已暂停的运单列表执行重启定位操作 + fun restart(con: Context?, sob: OrderDetailBean, remark: String?) { + val snis = arrayOfNulls(1) + val sni = ShippingNoteInfo() + val startWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "1" } + val endWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "2" } + sni.shippingNoteNumber = sob.orderNum + sni.serialNumber = "0000" + sni.startLatitude = startWay.latitude.toDouble() + sni.startLongitude = startWay.longitude.toDouble() + sni.startLocationText = startWay.province + startWay.city + startWay.area + startWay.address + sni.startCountrySubdivisionCode = sob.loadingAreaCode + sni.endLatitude = endWay.latitude.toDouble() + sni.endLongitude = endWay.longitude.toDouble() + sni.endLocationText = endWay.province + endWay.city + endWay.area + endWay.address + sni.endCountrySubdivisionCode = sob.receiverAreaCode + snis[0] = sni + LocationOpenApi.restart( + con, + sob.waybillInfo.vehicleNum, + if (SPUtils.instance.getUserInfo(con).idcardName == null) "" else SPUtils.instance.getUserInfo( + con + ).idcardName, + remark, + snis, + object : OnResultListener { + override fun onFailure(s: String, s1: String) { + Log.e("交通厅-重启定位失败", s + s1 + "") + } + + override fun onSuccess(list: List) { + Log.e("交通厅-重启定位成功", gson.toJson(list)) + } + }) + } + + //结束定位-卸货 + fun stop(con: Context, sob: OrderDetailBean, remark: String?) { + val snis = arrayOfNulls(1) + val sni = ShippingNoteInfo() + val startWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "1" } + val endWay = sob.orderChildList.filter { it.isPassingPoints!="0" }.first { it.type == "2" } + sni.shippingNoteNumber = sob.orderNum + sni.serialNumber = "0000" + sni.startLatitude = startWay.latitude.toDouble() + sni.startLongitude = startWay.longitude.toDouble() + sni.startLocationText = startWay.province + startWay.city + startWay.area + startWay.address + sni.startCountrySubdivisionCode = sob.loadingAreaCode + sni.endLatitude = endWay.latitude.toDouble() + sni.endLongitude = endWay.longitude.toDouble() + sni.endLocationText = endWay.province + endWay.city + endWay.area + endWay.address + sni.endCountrySubdivisionCode = sob.receiverAreaCode + snis[0] = sni + //remark="[00]车辆损坏货物无法送达"; + //sob.getData().setCarNumber("豫PK2861"); + LocationOpenApi.stop( + con, + sob.waybillInfo.vehicleNum, + if (SPUtils.instance.getUserInfo(con).idcardName == null) "" else SPUtils.instance.getUserInfo( + con + ).idcardName, + remark, + snis, + object : OnResultListener { + override fun onFailure(s: String, s1: String) { + Log.e("交通厅-结束定位失败", s + s1 + "") + } + + override fun onSuccess(list: List) { + Log.e("交通厅-结束定位成功", gson.toJson(list)) + val stopIntent = Intent(con, JTTSendService::class.java) + con.stopService(stopIntent) + } + }) + } +} diff --git a/app/src/main/java/com/dahe/gldriver/third/JTTSendService.java b/app/src/main/java/com/dahe/gldriver/third/JTTSendService.java new file mode 100644 index 0000000..ece7658 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/third/JTTSendService.java @@ -0,0 +1,112 @@ +package com.dahe.gldriver.third; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; + +import com.dahe.gldriver.bean.OrderDetailBean; +import com.google.gson.Gson; +import com.hdgq.locationlib.entity.ShippingNoteInfo; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/12/24 14:16 + * @description: + */ +public class JTTSendService extends Service { + + private Context con; + private String snn=""; + private Gson gson=new Gson(); + private OrderDetailBean sob=null; + + private Handler hd=new Handler(msg -> { + switch (msg.what){ + case 66: + JTTProcess.INSTANCE.send(con,sob,""); + break; + case 67: + JTTProcess.INSTANCE.pause(getBaseContext(),sob,""); + sob.getWaybillInfo().setVehicleNum("豫PK2861"); + new Timer().schedule(new TimerTask() { + @Override + public void run() { + MsgUtil.addHdMsgWat(hd,68); + } + },6000,100000000); + break; + case 68: + JTTProcess.INSTANCE.restart(getBaseContext(),sob,"[03]换车"); + break; + } + return false; + }); + + @Nullable + @Override + public IBinder onBind(Intent intent) {return null; } + + private int sum=0; + private ShippingNoteInfo sf; + + @Override + public void onCreate() { + super.onCreate(); + Log.e("交通厅","开启位置上传"); + con=this; + String str= SPUtil.getSP(con, JTTConstant.JTT_DATA_NAME,JTTConstant.JTT_DATA_JTTORDER_KEY); + String str2=SPUtil.getSP(con,JTTConstant.JTT_DATA_NAME,JTTConstant.JTT_DATA_ORDER_KEY); + sf=gson.fromJson(str,ShippingNoteInfo.class); + sob=gson.fromJson(str2,OrderDetailBean.class); + new Thread(){ + @Override + public void run() { + while (true){ + String str= SPUtil.getSP(con,JTTConstant.JTT_DATA_NAME,JTTConstant.JTT_DATA_JTTORDER_KEY); + if ("".equals(str)) { + break; + } + sf=gson.fromJson(str, ShippingNoteInfo.class); + try { + Thread.sleep(sf.getInterval()+1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + MsgUtil.addHdMsgWat(hd,66); + try { + Thread.sleep(6000); + } catch (InterruptedException e) { + e.printStackTrace(); + } +// sum++; +// if(sum==3){ +// MsgUtil.addHdMsgWat(hd,67); +// } + } + } + }.start(); + } + + //开始 + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.e("服务开启","-----"); + return START_STICKY; + + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + +} diff --git a/app/src/main/java/com/dahe/gldriver/third/MsgUtil.java b/app/src/main/java/com/dahe/gldriver/third/MsgUtil.java new file mode 100644 index 0000000..7242b13 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/third/MsgUtil.java @@ -0,0 +1,25 @@ +package com.dahe.gldriver.third; + +import android.os.Handler; +import android.os.Message; + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/7/30 16:29 + * @description: + */ +public class MsgUtil { + + public static void addHdMsgWat(Handler hd,int what){ + Message msg=Message.obtain(); + msg.what=what; + hd.sendMessage(msg); + } + public static void addHdMsgWatBody(Handler hd,int what,String body){ + Message msg=Message.obtain(); + msg.what=what; + msg.obj=body; + hd.sendMessage(msg); + } +} diff --git a/app/src/main/java/com/dahe/gldriver/third/SPUtil.java b/app/src/main/java/com/dahe/gldriver/third/SPUtil.java new file mode 100644 index 0000000..c4f1869 --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/third/SPUtil.java @@ -0,0 +1,20 @@ +package com.dahe.gldriver.third; + +import android.content.Context; +import android.content.SharedPreferences; + +public class SPUtil { + + private static SharedPreferences sp=null; + public static String getSP(Context con, String dataname, String name){ + sp=con.getSharedPreferences(dataname,con.MODE_PRIVATE); + return sp.getString(name,""); + } + + public static void insSP(Context con, String dataname, String name, String body){ + SharedPreferences.Editor editor=con.getSharedPreferences(dataname,con.MODE_PRIVATE).edit(); + editor.putString(name,body); + editor.commit(); + } + +} diff --git a/app/src/main/java/com/dahe/gldriver/ui/LauncherActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/LauncherActivity.kt index 9601319..025bc0b 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/LauncherActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/LauncherActivity.kt @@ -1,9 +1,17 @@ package com.dahe.gldriver.ui +import android.app.ActivityManager +import android.content.Context import android.os.Bundle +import android.os.Process +import com.alct.mdp.MDPLocationCollectionManager import com.amap.api.location.AMapLocationClient import com.amap.api.maps.MapsInitializer +import com.dahe.gldriver.BuildConfig +import com.dahe.gldriver.base.App import com.dahe.gldriver.databinding.ActivityLauncherBinding +import com.dahe.gldriver.third.JTTProcess +import com.dahe.gldriver.third.SPUtil import com.dahe.gldriver.ui.account.LoginActivity import com.dahe.gldriver.utils.CommonPopUtils import com.dahe.gldriver.utils.SPUtils @@ -47,6 +55,7 @@ class LauncherActivity : BaseActivity() { AMapLocationClient.updatePrivacyShow(mContext, true, true) AMapLocationClient.updatePrivacyAgree(mContext, true) MapsInitializer.updatePrivacyAgree(this, true) + initThird() goNext() } } else { @@ -54,6 +63,24 @@ class LauncherActivity : BaseActivity() { } } + private fun initThird() { + val state: String = SPUtil.getSP(mContext, "state_data", "authorization_state") + if ("1" != state) { + try { + //安联初始化 + if (packageName == getCurrentProcessName(this)) { + //Log.e("--使用的测试环境--",BuildConfig.OPEN_API_URL); + MDPLocationCollectionManager.initialize(this, BuildConfig.OPEN_AL_URL) + } + //初始化交通厅 + JTTProcess.init(application) + SPUtil.insSP(mContext, "state_data", "authorization_state", "1") + } catch (e: Exception) { + SPUtil.insSP(mContext, "state_data", "authorization_state", "0") + } + } + } + override fun onDestroy() { super.onDestroy() mDisposable?.dispose() @@ -86,4 +113,18 @@ class LauncherActivity : BaseActivity() { } } + + private fun getCurrentProcessName(context: Context): String? { + var currentProcessName = "" + val pid = Process.myPid() + val mActivityManager = context.getSystemService(ACTIVITY_SERVICE) as ActivityManager + if (mActivityManager.runningAppProcesses != null && mActivityManager.runningAppProcesses.size > 0) { + for (appProcess in mActivityManager.runningAppProcesses) { + if (appProcess.pid == pid) { + currentProcessName = appProcess.processName + } + } + } + return currentProcessName + } } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt b/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt index 4fffdca..d3dd98d 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/home/HomeFragment.kt @@ -201,7 +201,6 @@ class HomeFragment : BaseFragment(), RefreshCallBack { private fun initRecy() { adapter = binding.recyclerView.run { layoutManager = LinearLayoutManager(mContext, RecyclerView.VERTICAL, false) - setHasFixedSize(true) addItemDecoration( RecycleViewDivider( LinearLayout.VERTICAL, diff --git a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt index 7390eb8..2f0645f 100644 --- a/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt +++ b/app/src/main/java/com/dahe/gldriver/ui/waybill/activity/WaybillUpPicActivity.kt @@ -1,12 +1,18 @@ package com.dahe.gldriver.ui.waybill.activity import android.os.Bundle +import android.util.Log import android.view.View -import android.widget.ImageView +import android.widget.Toast import androidx.recyclerview.widget.GridLayoutManager +import com.alct.mdp.MDPLocationCollectionManager +import com.alct.mdp.callback.OnResultListener +import com.alct.mdp.model.Goods +import com.alct.mdp.model.Image +import com.alct.mdp.model.Location import com.amap.api.maps.model.LatLng import com.dahe.gldriver.base.AppConfig -import com.dahe.gldriver.bean.OcrPersonBean +import com.dahe.gldriver.bean.LUInputBean import com.dahe.gldriver.bean.UpPicBean import com.dahe.gldriver.bean.WaybillPhoto import com.dahe.gldriver.databinding.ActivityWaybillUppicBinding @@ -14,6 +20,7 @@ import com.dahe.gldriver.net.BaseObserver import com.dahe.gldriver.net.DataManager import com.dahe.gldriver.net.RxHttpCallBack import com.dahe.gldriver.oss.OssServiceUtil +import com.dahe.gldriver.third.JTTProcess import com.dahe.gldriver.utils.GDLocationUtils import com.dahe.gldriver.utils.OcrUtils import com.dahe.gldriver.utils.OrderUtils @@ -22,21 +29,20 @@ import com.dahe.mylibrary.adapter.GridImageAdapter.OnItemClickListener import com.dahe.mylibrary.base.BaseActivity import com.dahe.mylibrary.net.CommonResponseBean import com.dahe.mylibrary.utils.ActivityUtils +import com.dahe.mylibrary.utils.BitmapUtil +import com.dahe.mylibrary.utils.FileUtil import com.dahe.mylibrary.utils.LoadingUtils import com.dahe.mylibrary.utils.PopsUtils import com.dahe.mylibrary.utils.ToastUtils import com.dahe.mylibrary.weight.FullyGridLayoutManager -import com.dahe.mylibrary.weight.GlideEngine -import com.luck.picture.lib.basic.PictureSelector import com.luck.picture.lib.decoration.GridSpacingItemDecoration import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.utils.DensityUtil -import com.luck.picture.lib.widget.SquareRelativeLayout -import com.lxj.xpopup.XPopup -import com.lxj.xpopup.interfaces.OnSrcViewUpdateListener -import com.lxj.xpopup.util.SmartGlideImageLoader import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.schedulers.Schedulers +import java.io.File +import java.text.SimpleDateFormat +import java.util.Date /** * @ClassName WaybillUpPicActivity @@ -52,6 +58,9 @@ class WaybillUpPicActivity : BaseActivity() { var orderId: String = "" var waybillId: String = "" lateinit var latLng: LatLng + lateinit var bdLatLng: LatLng + + private val lub: LUInputBean = LUInputBean() override fun initView(savedInstanceState: Bundle?) { upBean = UpPicBean() @@ -89,11 +98,11 @@ class WaybillUpPicActivity : BaseActivity() { myAdapter.selectMax = 1 myAdapter.setOnItemClickListener(object : OnItemClickListener { override fun onItemClick(v: View?, position: Int) { - selGoodPic(type,myAdapter) + selGoodPic(type, myAdapter) } override fun openPicture() { - selGoodPic(type,myAdapter) + selGoodPic(type, myAdapter) } }) adapter = myAdapter @@ -177,59 +186,291 @@ class WaybillUpPicActivity : BaseActivity() { btnUnload.setOnClickListener { - upBean.run { - orderId = this@WaybillUpPicActivity.orderId - waybillId = this@WaybillUpPicActivity.waybillId - latitude = latLng.latitude.toString() - longitude = latLng.longitude.toString() - this.type = if (type == 1) "1" else "2" - } - - if (type == 1) { - if (upBean.waybillPhotoList.find { it.type == "1" } == null) { - showToast("请上传装货照片") - return@setOnClickListener - } - } - - if (type == 2) { - if (upBean.waybillPhotoList.find { it.type == "3" } == null) { - showToast("请上传卸货照片") - return@setOnClickListener - } - if (upBean.waybillPhotoList.find { it.receiptType == "4" || it.receiptType == "5" } == null) { - showToast("卸货请上传卸货回单照片") - return@setOnClickListener - } - } - - DataManager.getInstance().driverLoadOrUnload(upBean) - .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) - .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { - override fun onSuccess(t: CommonResponseBean) { - super.onSuccess(t) - if (1 == type) { - ActivityUtils.startActivity( - mContext, - WaybillSuccActivity::class.java, - intent.extras - ) - //装货成功-开启轨迹上传 - OrderUtils.getInstance().upLocation(mContext) - } else { - OrderUtils.getInstance().stopUpLocation(mContext) - ActivityUtils.startActivity( - mContext, - WaybillSuccActivity::class.java, - intent.extras - ) - } - } - })) + subMit(type) } } } + private fun subMit(orderType: Int?) { + upBean.run { + orderId = this@WaybillUpPicActivity.orderId + waybillId = this@WaybillUpPicActivity.waybillId + latitude = latLng.latitude.toString() + longitude = latLng.longitude.toString() + type = if (orderType == 1) "1" else "2" + } + + if (orderType == 1) { + if (upBean.waybillPhotoList.find { it.type == "1" } == null) { + showToast("请上传装货照片") + return + } + } + + if (orderType == 2) { + if (upBean.waybillPhotoList.find { it.type == "3" } == null) { + showToast("请上传卸货照片") + return + } + if (upBean.waybillPhotoList.find { it.receiptType == "4" || it.receiptType == "5" } == null) { + showToast("卸货请上传卸货回单照片") + return + } + } + + + //装货 +// lub.latitude = latLng.latitude.toString() +// lub.longitude = latLng.longitude.toString() +// lub.locationAddress = binding.tvLoca.text.toString() +// //todo imageId需确定 +// lub.imageId = upBean.waybillPhotoList.filter { it.type == "1" }.map { it.photoUrl.toInt() } +// lub.waybillId = "" + + val l = Location() + l.baiduLongitude = bdLatLng.longitude + l.baiduLatitude = bdLatLng.latitude + l.location = binding.tvLoca.text.toString() + l.time = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date()) + + + + DataManager.getInstance().driverLoadOrUnload(upBean) + .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) + .subscribe(BaseObserver(mContext, object : RxHttpCallBack() { + override fun onSuccess(t: CommonResponseBean) { + super.onSuccess(t) + if (1 == orderType) { + ActivityUtils.startActivity( + mContext, + WaybillSuccActivity::class.java, + intent.extras + ) + //装货成功-开启轨迹上传 + OrderUtils.getInstance().upLocation(mContext) + } else { + OrderUtils.getInstance().stopUpLocation(mContext) + ActivityUtils.startActivity( + mContext, + WaybillSuccActivity::class.java, + intent.extras + ) + } + } + })) + + + } + + private fun load(location: Location) { + MDPLocationCollectionManager.pickup(mContext, "", location, object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "装货上传成功") + + //上传安联和交通厅,平台-装货 +// JTTProcess.start(mContext, sob, "") + upLoadImage() + + } + + override fun onFailure(p0: String?, p1: String?) { + Log.e("上报安联失败(装货):", p0 + p1) + } + }) + } + + private fun unLoad(location: Location) { + MDPLocationCollectionManager.unload(mContext, "getShippingNoteNumber()", location, + object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "卸货上传成功") + //交通厅 +// if (sob.getData().getReport() === 1) { +// JTTProcess.stop(mContext, sob, "") +// } + //卸货状态-平台 +// hyr.dischargeCargo(lub) + //卸货照片-安联 + upUnloadImage() + + //卸货回单 + upTrafficSign() + upTrafficReceipt() + receiptImage() + } + + override fun onFailure(s: String, s1: String) { + Log.e("上报安联失败(卸货):", s + s1) +// MessageUtils().showCenMessage(con, s1) + } + }) + } + + + //上传安联装货 + fun upLoadImage() { + ///storage/emulated/0/Android/data/com.oneclouds.wangluohuoyun/files/Pictures/163124593063154.jpg + val file: File = File("") + val image = Image() + val base: String = BitmapUtil.imageToBase64("path") + image.fileData = "data:image/" + FileUtil.lastName(file) + ";base64," + base + image.fileExt = FileUtil.lastName(file) + image.fileName = FileUtil.fileName(file) + image.imageTakenDate = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date()) + image.baiduLongitude = bdLatLng.longitude + image.baiduLatitude = bdLatLng.latitude + image.location = binding.tvLoca.text.toString() + MDPLocationCollectionManager.uploadPickupImage( + mContext, + "sob.getData().getShippingNoteNumber()", + image, + object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "装货照片上传成功") + Toast.makeText(mContext, "上传成功", Toast.LENGTH_SHORT).show() + finish() + } + + override fun onFailure(s: String, s1: String) { + Log.e("上报安联失败(装货照片):", s + s1) + } + }) + } + + //上传安联卸货 + fun upUnloadImage() { + val file: File = File("path") + val image = Image() + val base = BitmapUtil.imageToBase64("path") + image.fileData = "data:image/" + FileUtil.lastName(file) + ";base64," + base + image.fileExt = FileUtil.lastName(file) + image.fileName = FileUtil.fileName(file) + image.imageTakenDate = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date()) + image.baiduLongitude = bdLatLng.longitude + image.baiduLatitude = bdLatLng.latitude + image.location = binding.tvLoca.text.toString() + MDPLocationCollectionManager.uploadUnloadImage( + mContext, + "sob.getData().getShippingNoteNumber()", + image, + object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "卸货照片上传成功") + Toast.makeText(mContext, "上传成功", Toast.LENGTH_SHORT).show() + finish() + } + + override fun onFailure(s: String, s1: String) { + Log.e("上报安联失败(卸货照片):", s + s1) + // SPUtil.insSP(con,"make","卸货",sob.getData().getShippingNoteNumber()); +// SPUtil.insSP(con,"make","卸货-"+sob.getData().getShippingNoteNumber(),gson.toJson(image)); +// Intent serviceIn=new Intent(con, MakeUpAlService.class); +// startService(serviceIn); + } + }) + } + + + //上传安联-签收 + fun upTrafficSign() { + //安联 + val l = Location() + l.baiduLongitude = latLng.longitude + l.baiduLatitude = latLng.latitude + l.location = binding.tvLoca.text.toString() + l.time = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date()) + val gs: List = java.util.ArrayList() +// for (wayChild in sob.getData().getWayChildren()) { +// if (wid == wayChild.getId() + "") { +// for (good in wayChild.getGoods()) { +// val g = Goods() +// g.goodsName = good.getGoodName() +// g.unit = good.getGoodUnit() +// g.itemNo = good.getId() +// //实收 +// g.quantity = 1 +// //应收 +// g.receivedQuantity = 1 +// //破损 +// g.damageQuantity = 1 +// //丢失 +// g.quantity = 1 +// } +// } +// } + MDPLocationCollectionManager.sign( + mContext, + "sob.getData().getShippingNoteNumber()", + l, + gs, + object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "签收成功") + } + + override fun onFailure(s: String, s1: String) { + Log.e("上报安联失败(签收):", s + s1) + } + }) + } + + //上传安联-回单 + fun upTrafficReceipt() { + //安联 + val l = Location() + l.baiduLongitude = latLng.longitude + l.baiduLatitude = latLng.latitude + l.location = binding.tvLoca.text.toString() + l.time = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date()) + MDPLocationCollectionManager.pod( + mContext, + "sob.getData().getShippingNoteNumber()", + l, + object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "回单上传成功") + } + + override fun onFailure(s: String, s1: String) { + Log.e("上报安联失败(回单):", s + s1) + } + }) + } + + //卸货回单照片 + fun receiptImage() { + ///storage/emulated/0/Android/data/com.oneclouds.wangluohuoyun/files/Pictures/163124593063154.jpg + val file: File = File("") + val image = Image() + val base = BitmapUtil.imageToBase64("path") + image.fileData = "data:image/" + FileUtil.lastName(file) + ";base64," + base + image.fileExt = FileUtil.lastName(file) + image.fileName = FileUtil.fileName(file) + image.imageTakenDate = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(Date()) + image.baiduLongitude = latLng.longitude + image.baiduLatitude = latLng.latitude + image.location = binding.tvLoca.text.toString() + MDPLocationCollectionManager.uploadPODImage( + mContext, + "sob.getData().getShippingNoteNumber()", + image, + object : OnResultListener { + override fun onSuccess() { + Log.e("上报安联", "回单照片上传成功") + Toast.makeText(mContext, "上传成功", Toast.LENGTH_SHORT).show() + finish() + } + + override fun onFailure(s: String, s1: String) { + Log.e("上报安联失败(回单照片):", s + s1) + // SPUtil.insSP(con,"make","回单",sob.getData().getShippingNoteNumber()); +//// SPUtil.insSP(con,"make","回单-"+sob.getData().getShippingNoteNumber(),gson.toJson(image)); +//// Intent serviceIn=new Intent(con, MakeUpAlService.class); +//// startService(serviceIn); + } + }) + } + private val mData: List = ArrayList() override fun initDate() { @@ -247,6 +488,7 @@ class WaybillUpPicActivity : BaseActivity() { it.getLongitude()//经 度 it.getLatitude()//纬 度 latLng = LatLng(it.latitude, it.longitude) + bdLatLng = GDLocationUtils.instance.convertGPSToBaidu(latLng) binding.tvLoca.text = it.address } else { showToast("定位失败,请检查定位权限是否开启") @@ -255,7 +497,7 @@ class WaybillUpPicActivity : BaseActivity() { } } - private fun selGoodPic(goodType:Int?,myAdapter: GridImageAdapter) { + private fun selGoodPic(goodType: Int?, myAdapter: GridImageAdapter) { PopsUtils.getInstance().showSelPic(mContext, false, myAdapter) { OssServiceUtil.getInstance().run { asyncPutImage(it[0].realPath, this@WaybillUpPicActivity) @@ -291,4 +533,6 @@ class WaybillUpPicActivity : BaseActivity() { } } + + } \ No newline at end of file diff --git a/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt b/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt index 9bbf063..50d46bc 100644 --- a/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt +++ b/app/src/main/java/com/dahe/gldriver/utils/GDLocationUtils.kt @@ -11,6 +11,8 @@ import android.os.Build import com.amap.api.location.AMapLocationClient import com.amap.api.location.AMapLocationClientOption import com.amap.api.location.AMapLocationListener +import com.amap.api.maps.model.LatLng +import com.baidu.mapapi.utils.CoordinateConverter import com.dahe.gldriver.R import com.dahe.gldriver.service.MyNotification @@ -118,6 +120,13 @@ class GDLocationUtils private constructor(){ } } + fun convertGPSToBaidu(srLatLng: LatLng): LatLng { + val converter = CoordinateConverter() + converter.from(CoordinateConverter.CoordType.COMMON) + converter.coord(com.baidu.mapapi.model.LatLng(srLatLng.latitude,srLatLng.longitude)) + return LatLng(converter.convert().latitude,converter.convert().longitude) + } + fun stopLocation(){ if(null != mLocationClient){ diff --git a/app/src/main/java/com/dahe/gldriver/utils/StringUtil.java b/app/src/main/java/com/dahe/gldriver/utils/StringUtil.java new file mode 100644 index 0000000..9bf6b4b --- /dev/null +++ b/app/src/main/java/com/dahe/gldriver/utils/StringUtil.java @@ -0,0 +1,19 @@ +package com.dahe.gldriver.utils; + +/** + * @author hlh + * @version 1.0.0 + * @date 2021/8/7 17:54 + * @description:字符串工具类 + */ +public class StringUtil { + + public static String isNull(String in_str,String out_str){ + if(in_str==null || in_str.equals("null") || in_str.trim().equals("")){ + return out_str; + } + return in_str; + } + + +} diff --git a/mylibrary/src/main/java/com/dahe/mylibrary/utils/BitmapUtil.java b/mylibrary/src/main/java/com/dahe/mylibrary/utils/BitmapUtil.java new file mode 100644 index 0000000..045e206 --- /dev/null +++ b/mylibrary/src/main/java/com/dahe/mylibrary/utils/BitmapUtil.java @@ -0,0 +1,662 @@ +package com.dahe.mylibrary.utils; + +import android.content.Context; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Matrix; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.media.ExifInterface; +import android.text.TextUtils; +import android.util.Base64; +import android.webkit.WebView; +import android.widget.ImageView; +import android.widget.ScrollView; + +import androidx.annotation.DrawableRes; +import androidx.annotation.Nullable; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.DataSource; +import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.load.engine.GlideException; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.bumptech.glide.request.target.SimpleTarget; +import com.bumptech.glide.request.target.Target; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * @author hlh + * @version 1.0.0 + * @date 2022/3/7 17:55 + * @description: + */ +public class BitmapUtil { + + private static RequestOptions options; + + static { + initOptions(); + } + + private static void initOptions() { + options = new RequestOptions() +// .placeholder(R.drawable.ic_image_default) //加载成功之前占位图 +// .error(R.drawable.ic_image_default) //加载错误之后的错误图 + .dontAnimate() +// .override(400,400) //指定图片的尺寸 + //指定图片的缩放类型为fitCenter (等比例缩放图片,宽或者是高等于ImageView的宽或者是高。) +// .fitCenter() + //指定图片的缩放类型为centerCrop (等比例缩放图片,直到图片的狂高都大于等于ImageView的宽度,然后截取中间的显示。) +// .centerCrop()//指定图片的缩放类型为centerCrop +// .circleCrop()//指定图片为圆形 +// .skipMemoryCache(true) //跳过内存缓存 + .diskCacheStrategy(DiskCacheStrategy.ALL); //缓存所有版本的图像 +// .diskCacheStrategy(DiskCacheStrategy.NONE) //跳过磁盘缓存 +// .diskCacheStrategy(DiskCacheStrategy.DATA) //只缓存原来分辨率的图片 +// .diskCacheStrategy(DiskCacheStrategy.RESOURCE); //只缓存最终的图片 + } + + private static RequestOptions buildOptions(@DrawableRes int res) { + RequestOptions options = new RequestOptions() + .placeholder(res) //加载成功之前占位图 + .error(res) //加载错误之后的错误图 + .dontAnimate() + .diskCacheStrategy(DiskCacheStrategy.ALL); + return options; + } + + /** + * 显示gif + * + * @param context + * @param url + * @param imageView + */ + public static void showGIF(Context context, String url, ImageView imageView) { + Glide.with(context) + .asGif() + .load(url) + .apply(options) + .into(imageView); + } + + /** + * 显示gif,自定义默认图 + * + * @param context + * @param url + * @param res + * @param imageView + */ + public static void showGIF(Context context, String url, @DrawableRes int res, ImageView imageView) { + Glide.with(context) + .asGif() + .load(url) + .apply(buildOptions(res)) + .into(imageView); + } + + /** + * 显示图片,自定义option + * + * @param context + * @param url + * @param imageView + */ + public static void showImage(Context context, String url, RequestOptions options, ImageView imageView) { + Glide.with(context) + .load(url) + .apply(options) + .into(imageView); + } + + /** + * 显示图片,先显示默认图 + * + * @param context + * @param url + * @param imageView + */ + public static void showImage(Context context, String url, ImageView imageView) { + Glide.with(context) + .load(url) + .apply(options) + .into(imageView); + } + + /** + * 显示图片,先显示默认图 + * + * @param context + * @param url + * @param imageView + */ + public static void showImage(Context context, String url, ImageView imageView, RequestListener callback) { + Glide.with(context) + .load(url) + .apply(options) + .listener(callback) + .into(imageView); + } + + + /** + * 显示图片,先显示默认图 + * + * @param context + * @param url + * @param imageView + */ + public static void showRadiusImage(Context context, String url, int radius, ImageView imageView) { + + +// RequestOptions options = new RequestOptions().transform(new CenterCrop(), new RoundedCorners(DisplayUtil.dipToPixel(radius))); +// options +// .dontAnimate() +// .diskCacheStrategy(DiskCacheStrategy.ALL); +// +// Glide.with(context) +// .load(url) +// .apply(options) +// .into(imageView); + + } + + /** + * 显示图片,自己设定默认图 + * + * @param context + * @param url + * @param imageView + */ + public static void showImage(Context context, String url, @DrawableRes int placeholder, ImageView imageView) { + Glide.with(context) + .asBitmap().fitCenter() + .load(url) + .apply(buildOptions(placeholder)) + .into(imageView); + +// LogUtils.d(AppConstants.LOG_TAG_PIC, "图片url = " + (!TextUtils.isEmpty(url) ? url : "url为空")); + } + + /** + * 加载本地图片 + * + * @param url + * @return + */ + public static Bitmap getLocalBitmap(String url) { + try { + BitmapFactory.Options options = new BitmapFactory.Options(); + options.inJustDecodeBounds = true; + BitmapFactory.decodeFile(url, options); + //计算采样率 + options.inSampleSize = calculateInSampleSize(options, 768, 1024); + options.inJustDecodeBounds = false; + options.inPreferredConfig = Bitmap.Config.RGB_565; + Bitmap bitmap = BitmapFactory.decodeFile(url, options); + //旋转图片 + int d = getPictureDegree(url); + if (d != 0) { + bitmap = rotateBitmap(bitmap, d); + } + return bitmap; + } catch (OutOfMemoryError e) { + e.printStackTrace(); + return null; + } + } + + public static void getCacheImage(Context context, String imgUrl, SimpleTarget callback) { + Glide.with(context).asBitmap().load(imgUrl).into(callback); + } + + /** + * 将文件生成Drawable + * + * @param path + * @return + */ + public static Drawable getDrawable(String path) { + Drawable bd = BitmapDrawable.createFromPath(path); + return bd; + } + + /** + * 返回Bitmap显示像素所占位数 + * + * @param config + * @return + */ + public static int getBytesPerPixel(Bitmap.Config config) { + if (config == Bitmap.Config.ARGB_8888) { + return 4; + } else if (config == Bitmap.Config.RGB_565) { + return 2; + } else if (config == Bitmap.Config.ARGB_4444) { + return 2; + } else if (config == Bitmap.Config.ALPHA_8) { + return 1; + } + return 1; + } + + /** + * 获取图片旋转角度 + * + * @param path + * @return + */ + public static int getPictureDegree(String path) { + int degree = 0; + try { + ExifInterface exifInterface = new ExifInterface(path); + int orientation = exifInterface.getAttributeInt( + ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_NORMAL); + switch (orientation) { + case ExifInterface.ORIENTATION_ROTATE_90: + degree = 90; + break; + case ExifInterface.ORIENTATION_ROTATE_180: + degree = 180; + break; + case ExifInterface.ORIENTATION_ROTATE_270: + degree = 270; + break; + } + } catch (IOException e) { + e.printStackTrace(); + } + return degree; + } + + /** + * 计算图片的缩放值 + * + * @param options + * @param reqWidth + * @param reqHeight + * @return + */ + public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { + final int height = options.outHeight; + final int width = options.outWidth; + int inSampleSize = 1; + + if (height > reqHeight || width > reqWidth) { + final int heightRatio = Math.round((float) height / (float) reqHeight); + final int widthRatio = Math.round((float) width / (float) reqWidth); + inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; + } + return inSampleSize; + } + + /** + * 旋转图片 + * + * @param bitmap + * @param degree + * @return + */ + public static Bitmap rotateBitmap(Bitmap bitmap, int degree) { + if (bitmap != null) { + Matrix m = new Matrix(); + m.postRotate(degree); + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); + return bitmap; + } + return bitmap; + } + + /** + * 保存Bitmap为文件 + * + * @param bitmap + * @param path + * @param fileName + * @return + */ + public static File saveBitmap(Bitmap bitmap, String path, String fileName) { + FileOutputStream outputStream = null; + try { + File mFolder = new File(path); + if (!mFolder.exists()) { + mFolder.mkdirs(); + } + File file = new File(mFolder, fileName); + outputStream = new FileOutputStream(file); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); + outputStream.flush(); + outputStream.close(); + bitmap.recycle(); + return file; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 给定宽高,根据宽高计算采样率压缩图片 并 旋转图片 + * + * @param photoPath 原图片路径 + * @param reqWidth 要求的宽 + * @param reqHeight 要求的高 + * @return + */ + public static Bitmap zipBitmapWithReq(String photoPath, int reqWidth, int reqHeight) { + // 压缩图片 + BitmapFactory.Options opts = new BitmapFactory.Options(); + opts.inJustDecodeBounds = true; + BitmapFactory.decodeFile(photoPath, opts); + opts.inSampleSize = BitmapUtil.calculateInSampleSize(opts, reqWidth, reqHeight); + opts.inJustDecodeBounds = false; + return BitmapFactory.decodeFile(photoPath, opts); + } + + /** + * 根据给定 质量百分比 压缩图片 + * + * @param bitmap + * @param quality 质量压缩比例(100为不压缩) + * @return + */ + public static Bitmap zipBitmapWithQuality(Bitmap bitmap, int quality) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); + byte[] bytes = baos.toByteArray(); + bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + return bitmap; + } + + /** + * 给定宽高,根据宽高计算采样率压缩图片并存为文件 + * + * @param photoPath 原图片路径 + * @param saveFilePath 压缩后图片保存路径 + * @param fileName 压缩后图片文件名 + * @param reqWidth 要求的宽 + * @param reqHeight 要求的高 + * @return + */ + public static File zipBitmapAndSave(String photoPath, String saveFilePath, String fileName, int reqWidth, int reqHeight) { + Bitmap bitmap = BitmapUtil.zipBitmapWithReq(photoPath, reqWidth, reqHeight); + // 旋转图片 + bitmap = BitmapUtil.rotateBitmap(bitmap, BitmapUtil.getPictureDegree(photoPath)); + return BitmapUtil.saveBitmap(bitmap, saveFilePath, fileName); + } + + /** + * 给定宽高,根据宽高计算采样率, + * 给定质量压缩比例 + * 多重压缩图片并存为文件 + * + * @param photoPath 原图片路径 + * @param saveFilePath 压缩后图片保存路径 + * @param fileName 压缩后图片文件名 + * @param reqWidth 要求的宽 + * @param reqHeight 要求的高 + * @param quality 质量压缩比例(100为不压缩) + * @return + */ + public static File zipBitmapMultiAndSave(String photoPath, String saveFilePath, String fileName, int reqWidth, int reqHeight, int quality) { + Bitmap bit = zipBitmapWithReq(photoPath, reqWidth, reqHeight); + bit = zipBitmapWithQuality(bit, quality); + // 旋转图片 + bit = BitmapUtil.rotateBitmap(bit, BitmapUtil.getPictureDegree(photoPath)); + return BitmapUtil.saveBitmap(bit, saveFilePath, fileName); + } + + /** + * 把Bitmap转Byte + */ + public static byte[] bitmap2Bytes(Bitmap bm) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + bm.compress(Bitmap.CompressFormat.PNG, 100, baos); + return baos.toByteArray(); + } + + /** + * 根据高度放大, 并显示中间部分 + * + * @param bitmap + * @param windowWidth + * @param windowHeight + * @return + */ + public static Bitmap compressBitmap(Bitmap bitmap, int windowWidth, int windowHeight) { + Matrix matrix = new Matrix(); + int bitmapWidth = bitmap.getWidth(); + int bitmapHeight = bitmap.getHeight(); + float scaleY = windowHeight > bitmapHeight ? Float.valueOf(windowHeight) / Float.valueOf(bitmapHeight) : 1.0f; + matrix.postScale(scaleY, scaleY); + int offsetX = scaleY > 1 ? (int) ((bitmapWidth * scaleY - bitmapWidth) / 2) : 0; + int showHeight = windowHeight > bitmapHeight ? windowHeight : bitmapHeight; + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true); + try { + return Bitmap.createBitmap(bitmap, offsetX, 0, windowWidth, showHeight); + } catch (Exception e) { + + } + return bitmap; + } + + public static Bitmap getTransparentBitmap(Bitmap sourceImg, int number) { + int[] argb = new int[sourceImg.getWidth() * sourceImg.getHeight()]; + sourceImg.getPixels(argb, 0, sourceImg.getWidth(), 0, 0, sourceImg.getWidth(), sourceImg.getHeight());// 获得图片的ARGB值 + number = number * 255 / 100; + for (int i = 0; i < argb.length; i++) { + argb[i] = (number << 24) | (argb[i] & 0x00FFFFFF); + } + sourceImg = Bitmap.createBitmap(argb, sourceImg.getWidth(), sourceImg.getHeight(), Bitmap.Config.ARGB_8888); + return sourceImg; + } + + + /** + * 截取ScrollView显示内容 + * + * @param scrollView + * @return + */ + public static Bitmap getScrollViewBitmap(ScrollView scrollView) { + int h = 0; + Bitmap bitmap = null; + for (int i = 0; i < scrollView.getChildCount(); i++) { + h += scrollView.getChildAt(i).getHeight(); + scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff")); + } + bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.RGB_565); + final Canvas canvas = new Canvas(bitmap); + scrollView.draw(canvas); + return bitmap; + } + + + /** + * 截取WebView显示内容 + * + * @param webView + * @return + */ + public static Bitmap getWebViewBitmap(WebView webView) { + Bitmap bm = null; + try { + int height = (int) (webView.getContentHeight() * webView.getScale()); + int width = webView.getWidth(); + int pH = webView.getHeight(); + if(width <= 0){ + width = 100; + } + if(height <= 0){ + height = 100; + } + bm = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); + Canvas canvas = new Canvas(bm); + int top = height; + while (top > 0) { + if (top < pH) { + top = 0; + } else { + top -= pH; + } + canvas.save(); + canvas.clipRect(0, top, width, top + pH); + webView.scrollTo(0, top); + webView.draw(canvas); + canvas.restore(); + } + } catch (OutOfMemoryError e) { + if (bm != null) { + bm.recycle(); + bm = null; + } + } + return bm; + } + + /** + * 通过drawable文件名获取Drawable + * + * @param context + * @param name + * @return + */ + public static Drawable getDrawableFromName(Context context, String name) { + try { + Resources resources = context.getResources(); + return resources.getDrawable(resources.getIdentifier(name, "drawable", context.getPackageName())); + } catch (Exception e) { + } + return null; + } + + /** + * base64字符串转换bitmap + * + * @param base64 + * @return + */ + public static Bitmap base64ToBitmap(String base64) { + Bitmap bitmap = null; + try { + byte[] bitmapArray = Base64.decode(base64.split(",")[1], Base64.DEFAULT); + bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length); + } catch (Exception e) { + e.printStackTrace(); + } + return bitmap; + } + + /** + * 下载图片 + * + * @param context + * @param url + * @param listener + */ + public static void downloadImage(Context context, String url, ImageDownloadListener listener) { + try { + listener.start(); + Glide.with(context) + .downloadOnly() + .load(url) + .addListener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + listener.fail(e); + return false; + } + + @Override + public boolean onResourceReady(File resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + listener.success(BitmapFactory.decodeFile(resource.getAbsolutePath()) , resource.getAbsolutePath()); + return false; + } + }).submit(); + } catch (Exception e) { + if (listener != null) listener.fail(new GlideException(e.getMessage())); + } finally { + if (listener != null) listener.finish(); + } + } + + public interface ImageDownloadListener { + /** + * 当前线程 + */ + void start(); + + /** + * 子线程 + * + * @param bitmap + */ + void success(Bitmap bitmap , String path); + + /** + * 子线程 + * + * @param e + */ + void fail(GlideException e); + + /** + * 当前线程 + */ + void finish(); + } + + + + /** + * 将图片转换成Base64编码的字符串 + */ + public static String imageToBase64(String path){ + if(TextUtils.isEmpty(path)){ + return null; + } + InputStream is = null; + byte[] data = null; + String result = null; + try{ + is = new FileInputStream(path); + //创建一个字符流大小的数组。 + data = new byte[is.available()]; + //写入数组 + is.read(data); + //用默认的编码格式进行编码 + result = Base64.encodeToString(data,Base64.DEFAULT); + }catch (Exception e){ + e.printStackTrace(); + }finally { + if(null !=is){ + try { + is.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + return result; + } + +} diff --git a/mylibrary/src/main/java/com/dahe/mylibrary/utils/FileUtil.java b/mylibrary/src/main/java/com/dahe/mylibrary/utils/FileUtil.java index 1eda86f..7e2e250 100644 --- a/mylibrary/src/main/java/com/dahe/mylibrary/utils/FileUtil.java +++ b/mylibrary/src/main/java/com/dahe/mylibrary/utils/FileUtil.java @@ -86,4 +86,24 @@ public class FileUtil { } }); } + + public static String lastName(File file){ + if(file==null) return null; + String filename = file.getName(); + if(filename.lastIndexOf(".")==-1){ + return "";//文件没有后缀名的情况 + } + //此时返回的是带有 . 的后缀名, + return filename.substring(filename.lastIndexOf(".")+1); + } + + public static String fileName(File file){ + if(file==null) return null; + String filename = file.getName(); + if(filename.lastIndexOf(".")==-1){ + return "";//文件没有后缀名的情况 + } + //此时返回的是带有 . 的后缀名, + return filename.substring(0,filename.lastIndexOf(".")); + } }