diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - - - - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e4f25df..1e9fe47 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -7,6 +7,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath import com.casic.br.app.extensions.compressImage @@ -15,7 +16,6 @@ import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.HiddenTroubleViewModel import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e4f25df..1e9fe47 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -7,6 +7,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath import com.casic.br.app.extensions.compressImage @@ -15,7 +16,6 @@ import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.HiddenTroubleViewModel import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 940b35c..bbff411 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -1,7 +1,5 @@ package com.casic.br.app.view -import android.app.Activity -import android.content.Intent import android.graphics.Bitmap import android.graphics.ImageFormat import android.os.Build @@ -10,9 +8,6 @@ import android.util.DisplayMetrics import android.util.Log import android.view.Surface -import android.view.View -import androidx.activity.result.ActivityResultCallback -import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.AspectRatio import androidx.camera.core.CameraSelector import androidx.camera.core.CameraState @@ -21,30 +16,13 @@ import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider -import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.extensions.toBitmap -import com.casic.br.app.model.DictionaryModel -import com.casic.br.app.utils.LocaleConstant -import com.casic.br.app.utils.LocationManager -import com.casic.br.app.vm.ConfigViewModel -import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.timestampToDate -import com.pengxh.kt.lite.extensions.timestampToTime -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.ByteArrayOutputStream import java.io.IOException import java.util.concurrent.ExecutionException @@ -64,7 +42,6 @@ } private val kTag = "StartCheckActivity" - private val context = this private val executor = ThreadPoolExecutor( 16, 16, @@ -73,113 +50,14 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) - private val locationManager by lazy { LocationManager(this) } - private val targetSet by lazy { HashSet() } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis - private lateinit var inspectionViewModel: InspectionViewModel - private lateinit var configViewModel: ConfigViewModel - private lateinit var imageFileViewModel: ImageFileViewModel - private var detectedScene = "" - private var inspectionId = "" - private var inspectionAddress = "" - private var isDetectingScene = false //是否正在识别场景 - private var isDetectingTarget = false //是否正在识别目标 - private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { - locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - location?.apply { - inspectionAddress = address - } - } - }) - - inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] - val inspectionUser = SaveKeyValues.getValue( - LocaleConstant.ACCOUNT, "" - ) as String - - val currentTimeMillis = System.currentTimeMillis() - val inspectionDate = currentTimeMillis.timestampToDate() - val startTime = currentTimeMillis.timestampToTime() - inspectionViewModel.startInspection( - context, inspectionUser, inspectionAddress, inspectionDate, startTime - ) - inspectionViewModel.addResultModel.observe(this) { - if (it.code == 200) { - inspectionId = it.data - } - } - - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(context, "pitfallBigType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - mainDicModels = it.data - } - } - - imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] - imageFileViewModel.sceneResult.observe(this) { - if (it == "没有检查到任何场景") { - isDetectingScene = false - } else { - AlertControlDialog.Builder().setContext(this).setTitle("提示") - .setMessage("识别到目标场景,是否开始排查该场景的隐患?") - .setNegativeButton("稍后") - .setPositiveButton("好的").setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - binding.titleView.setTitle(it) - detectedScene = it - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - imageFileViewModel.recognizeResult.observe(this) { - /** - * { - * "scene": "配电箱", - * "inferneceStart": "2024-04-26 16:16:03.653", - * "code": 200, - * "inferneceEnd": "2024-04-26 16:16:03.774", - * "inferneceInterval": "0:00:00.121", - * "result": [ - * - * ] - * } - * */ - if (it.code == 200) { - if (it.result.isEmpty()) { - binding.detectView.clearTag() - targetSet.clear() - binding.tipsTagView.visibility = View.GONE - } else { - binding.detectView.updateTargetPosition(it.result) - it.result.forEach { result -> - targetSet.add(result.label) - } - //显示角标 - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - } - } - isDetectingTarget = false - } - - // Initialize our background executor cameraExecutor = Executors.newSingleThreadExecutor() cameraProviderFuture = ProcessCameraProvider.getInstance(this) - // 检查 CameraProvider 可用性 cameraProviderFuture.addListener({ try { bindPreview(cameraProviderFuture.get()) @@ -201,37 +79,36 @@ aspectRatio(outMetrics.widthPixels, outMetrics.heightPixels) } - // CameraSelector, 选择后置摄像头 - val cameraSelector = - CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build() + val cameraSelector = CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build() - // Preview - val cameraPreViewBuilder = Preview.Builder().setTargetAspectRatio(screenAspectRatio) - .setTargetRotation(Surface.ROTATION_0).build() + val cameraPreViewBuilder = Preview.Builder() + .setTargetAspectRatio(screenAspectRatio) + .setTargetRotation(Surface.ROTATION_0) + .build() // ImageCapture - imageCapture = - ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) - .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) - .build() + imageCapture = ImageCapture.Builder() + .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) + .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) + .build() // ImageAnalysis - imageAnalysis = ImageAnalysis.Builder().setTargetAspectRatio(screenAspectRatio) + imageAnalysis = ImageAnalysis.Builder() + .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(Surface.ROTATION_0) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() - // Must unbind the use-cases before rebinding them cameraProvider.unbindAll() try { val camera = cameraProvider.bindToLifecycle( this, cameraSelector, imageCapture, imageAnalysis, cameraPreViewBuilder ) - // Attach the viewfinder's surface provider to preview use case cameraPreViewBuilder.setSurfaceProvider(binding.cameraPreView.surfaceProvider) camera.cameraInfo.cameraState.observe(this) { - //开始预览之后才检测 if (it.type == CameraState.Type.OPEN) { imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } @@ -252,19 +129,6 @@ if (bitmap != null) { val base64 = bitmap.encodeToBase64() - //先识别场景 - if (!isDetectingScene) { - isDetectingScene = true - imageFileViewModel.getScene(context, base64) - } - - //再识别隐患 - if (!isDetectingTarget && detectedScene.isNotBlank()) { - isDetectingTarget = true - imageFileViewModel.getRecognizeResult( - context, base64, detectedScene, inspectionId - ) - } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 imageProxy.close() @@ -289,39 +153,7 @@ } override fun initEvent() { - binding.stopButton.setOnClickListener { - if (inspectionId.isBlank()) { - "巡检任务创建中,请稍后再结束任务".show(this) - return@setOnClickListener - } - navigatePageTo(inspectionId) - } - binding.tipsButton.setOnClickListener { - if (targetSet.isEmpty()) { - "未识别到任何目标,无法查看检查清单".show(this) - return@setOnClickListener - } - //根据识别出来的结果显示清单 - navigatePageTo( - arrayListOf(detectedScene, targetSet.toJson()) - ) - } - - binding.addButton.setOnClickListener { - navigatePageTo(mainDicModels.toJson()) - } - - /** - * 根据场景查看检查清单 - * */ - binding.listButton.setOnClickListener { - if (inspectionId.isBlank()) { - "请先选择场景或者识别出场景再试".show(this) - return@setOnClickListener - } - navigatePageTo(arrayListOf(detectedScene, inspectionId)) - } } override fun initViewBinding(): ActivityStartCheckBinding { @@ -340,51 +172,15 @@ } override fun onRightClick() { - BottomActionSheet.Builder() - .setContext(context) - .setActionItemTitle(arrayListOf("手动选择场景", "重置已选场景")) - .setItemTextColor(R.color.themeColor.convertColor(context)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - val intent = Intent(context, SelectSceneActivity::class.java) - selectSceneLauncher.launch(intent) - } - 1 -> { - binding.titleView.setTitle("") - isDetectingScene = false - detectedScene = "" - "场景重置成功".show(context) - } - } - } - }).build().show() } }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), - ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - detectedScene = sceneName - } - }) - private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) return if (abs(ratio - RATIO_4_3_VALUE) <= abs(ratio - RATIO_16_9_VALUE)) { AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } - - override fun onDestroy() { - super.onDestroy() - locationManager.stopLocation() - } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e4f25df..1e9fe47 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -7,6 +7,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath import com.casic.br.app.extensions.compressImage @@ -15,7 +16,6 @@ import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.HiddenTroubleViewModel import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 940b35c..bbff411 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -1,7 +1,5 @@ package com.casic.br.app.view -import android.app.Activity -import android.content.Intent import android.graphics.Bitmap import android.graphics.ImageFormat import android.os.Build @@ -10,9 +8,6 @@ import android.util.DisplayMetrics import android.util.Log import android.view.Surface -import android.view.View -import androidx.activity.result.ActivityResultCallback -import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.AspectRatio import androidx.camera.core.CameraSelector import androidx.camera.core.CameraState @@ -21,30 +16,13 @@ import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider -import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.extensions.toBitmap -import com.casic.br.app.model.DictionaryModel -import com.casic.br.app.utils.LocaleConstant -import com.casic.br.app.utils.LocationManager -import com.casic.br.app.vm.ConfigViewModel -import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.timestampToDate -import com.pengxh.kt.lite.extensions.timestampToTime -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.ByteArrayOutputStream import java.io.IOException import java.util.concurrent.ExecutionException @@ -64,7 +42,6 @@ } private val kTag = "StartCheckActivity" - private val context = this private val executor = ThreadPoolExecutor( 16, 16, @@ -73,113 +50,14 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) - private val locationManager by lazy { LocationManager(this) } - private val targetSet by lazy { HashSet() } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis - private lateinit var inspectionViewModel: InspectionViewModel - private lateinit var configViewModel: ConfigViewModel - private lateinit var imageFileViewModel: ImageFileViewModel - private var detectedScene = "" - private var inspectionId = "" - private var inspectionAddress = "" - private var isDetectingScene = false //是否正在识别场景 - private var isDetectingTarget = false //是否正在识别目标 - private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { - locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - location?.apply { - inspectionAddress = address - } - } - }) - - inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] - val inspectionUser = SaveKeyValues.getValue( - LocaleConstant.ACCOUNT, "" - ) as String - - val currentTimeMillis = System.currentTimeMillis() - val inspectionDate = currentTimeMillis.timestampToDate() - val startTime = currentTimeMillis.timestampToTime() - inspectionViewModel.startInspection( - context, inspectionUser, inspectionAddress, inspectionDate, startTime - ) - inspectionViewModel.addResultModel.observe(this) { - if (it.code == 200) { - inspectionId = it.data - } - } - - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(context, "pitfallBigType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - mainDicModels = it.data - } - } - - imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] - imageFileViewModel.sceneResult.observe(this) { - if (it == "没有检查到任何场景") { - isDetectingScene = false - } else { - AlertControlDialog.Builder().setContext(this).setTitle("提示") - .setMessage("识别到目标场景,是否开始排查该场景的隐患?") - .setNegativeButton("稍后") - .setPositiveButton("好的").setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - binding.titleView.setTitle(it) - detectedScene = it - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - imageFileViewModel.recognizeResult.observe(this) { - /** - * { - * "scene": "配电箱", - * "inferneceStart": "2024-04-26 16:16:03.653", - * "code": 200, - * "inferneceEnd": "2024-04-26 16:16:03.774", - * "inferneceInterval": "0:00:00.121", - * "result": [ - * - * ] - * } - * */ - if (it.code == 200) { - if (it.result.isEmpty()) { - binding.detectView.clearTag() - targetSet.clear() - binding.tipsTagView.visibility = View.GONE - } else { - binding.detectView.updateTargetPosition(it.result) - it.result.forEach { result -> - targetSet.add(result.label) - } - //显示角标 - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - } - } - isDetectingTarget = false - } - - // Initialize our background executor cameraExecutor = Executors.newSingleThreadExecutor() cameraProviderFuture = ProcessCameraProvider.getInstance(this) - // 检查 CameraProvider 可用性 cameraProviderFuture.addListener({ try { bindPreview(cameraProviderFuture.get()) @@ -201,37 +79,36 @@ aspectRatio(outMetrics.widthPixels, outMetrics.heightPixels) } - // CameraSelector, 选择后置摄像头 - val cameraSelector = - CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build() + val cameraSelector = CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build() - // Preview - val cameraPreViewBuilder = Preview.Builder().setTargetAspectRatio(screenAspectRatio) - .setTargetRotation(Surface.ROTATION_0).build() + val cameraPreViewBuilder = Preview.Builder() + .setTargetAspectRatio(screenAspectRatio) + .setTargetRotation(Surface.ROTATION_0) + .build() // ImageCapture - imageCapture = - ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) - .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) - .build() + imageCapture = ImageCapture.Builder() + .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) + .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) + .build() // ImageAnalysis - imageAnalysis = ImageAnalysis.Builder().setTargetAspectRatio(screenAspectRatio) + imageAnalysis = ImageAnalysis.Builder() + .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(Surface.ROTATION_0) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() - // Must unbind the use-cases before rebinding them cameraProvider.unbindAll() try { val camera = cameraProvider.bindToLifecycle( this, cameraSelector, imageCapture, imageAnalysis, cameraPreViewBuilder ) - // Attach the viewfinder's surface provider to preview use case cameraPreViewBuilder.setSurfaceProvider(binding.cameraPreView.surfaceProvider) camera.cameraInfo.cameraState.observe(this) { - //开始预览之后才检测 if (it.type == CameraState.Type.OPEN) { imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } @@ -252,19 +129,6 @@ if (bitmap != null) { val base64 = bitmap.encodeToBase64() - //先识别场景 - if (!isDetectingScene) { - isDetectingScene = true - imageFileViewModel.getScene(context, base64) - } - - //再识别隐患 - if (!isDetectingTarget && detectedScene.isNotBlank()) { - isDetectingTarget = true - imageFileViewModel.getRecognizeResult( - context, base64, detectedScene, inspectionId - ) - } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 imageProxy.close() @@ -289,39 +153,7 @@ } override fun initEvent() { - binding.stopButton.setOnClickListener { - if (inspectionId.isBlank()) { - "巡检任务创建中,请稍后再结束任务".show(this) - return@setOnClickListener - } - navigatePageTo(inspectionId) - } - binding.tipsButton.setOnClickListener { - if (targetSet.isEmpty()) { - "未识别到任何目标,无法查看检查清单".show(this) - return@setOnClickListener - } - //根据识别出来的结果显示清单 - navigatePageTo( - arrayListOf(detectedScene, targetSet.toJson()) - ) - } - - binding.addButton.setOnClickListener { - navigatePageTo(mainDicModels.toJson()) - } - - /** - * 根据场景查看检查清单 - * */ - binding.listButton.setOnClickListener { - if (inspectionId.isBlank()) { - "请先选择场景或者识别出场景再试".show(this) - return@setOnClickListener - } - navigatePageTo(arrayListOf(detectedScene, inspectionId)) - } } override fun initViewBinding(): ActivityStartCheckBinding { @@ -340,51 +172,15 @@ } override fun onRightClick() { - BottomActionSheet.Builder() - .setContext(context) - .setActionItemTitle(arrayListOf("手动选择场景", "重置已选场景")) - .setItemTextColor(R.color.themeColor.convertColor(context)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - val intent = Intent(context, SelectSceneActivity::class.java) - selectSceneLauncher.launch(intent) - } - 1 -> { - binding.titleView.setTitle("") - isDetectingScene = false - detectedScene = "" - "场景重置成功".show(context) - } - } - } - }).build().show() } }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), - ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - detectedScene = sceneName - } - }) - private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) return if (abs(ratio - RATIO_4_3_VALUE) <= abs(ratio - RATIO_16_9_VALUE)) { AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } - - override fun onDestroy() { - super.onDestroy() - locationManager.stopLocation() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index 394bcdf..c76af42 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -1,76 +1,21 @@ package com.casic.br.app.vm -import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.model.ActionResultModel -import com.casic.br.app.model.RecognizeResultModel import com.casic.br.app.retrofit.RetrofitServiceManager import com.google.gson.Gson -import com.google.gson.JsonParser import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState import java.io.File class ImageFileViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val sceneResult = MutableLiveData() - val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getScene(context: Context, base64: String) = launch({ - val response = RetrofitServiceManager.getScene(base64) - when (response.getResponseCode()) { - 200 -> { - /** - * { - * "code": 200, - * "scene": "配电箱" - * } - * */ - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - sceneResult.value = jsonObject.get("scene").asString - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - } - } - }, { - it.printStackTrace() - }) - - fun getRecognizeResult( - context: Context, base64: String, scene: String, inspectionId: String - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene, inspectionId) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail - } - } - }, { - loadState.value = LoadState.Fail - }) - fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e4f25df..1e9fe47 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -7,6 +7,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath import com.casic.br.app.extensions.compressImage @@ -15,7 +16,6 @@ import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.HiddenTroubleViewModel import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 940b35c..bbff411 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -1,7 +1,5 @@ package com.casic.br.app.view -import android.app.Activity -import android.content.Intent import android.graphics.Bitmap import android.graphics.ImageFormat import android.os.Build @@ -10,9 +8,6 @@ import android.util.DisplayMetrics import android.util.Log import android.view.Surface -import android.view.View -import androidx.activity.result.ActivityResultCallback -import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.AspectRatio import androidx.camera.core.CameraSelector import androidx.camera.core.CameraState @@ -21,30 +16,13 @@ import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider -import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.extensions.toBitmap -import com.casic.br.app.model.DictionaryModel -import com.casic.br.app.utils.LocaleConstant -import com.casic.br.app.utils.LocationManager -import com.casic.br.app.vm.ConfigViewModel -import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.timestampToDate -import com.pengxh.kt.lite.extensions.timestampToTime -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.ByteArrayOutputStream import java.io.IOException import java.util.concurrent.ExecutionException @@ -64,7 +42,6 @@ } private val kTag = "StartCheckActivity" - private val context = this private val executor = ThreadPoolExecutor( 16, 16, @@ -73,113 +50,14 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) - private val locationManager by lazy { LocationManager(this) } - private val targetSet by lazy { HashSet() } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis - private lateinit var inspectionViewModel: InspectionViewModel - private lateinit var configViewModel: ConfigViewModel - private lateinit var imageFileViewModel: ImageFileViewModel - private var detectedScene = "" - private var inspectionId = "" - private var inspectionAddress = "" - private var isDetectingScene = false //是否正在识别场景 - private var isDetectingTarget = false //是否正在识别目标 - private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { - locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - location?.apply { - inspectionAddress = address - } - } - }) - - inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] - val inspectionUser = SaveKeyValues.getValue( - LocaleConstant.ACCOUNT, "" - ) as String - - val currentTimeMillis = System.currentTimeMillis() - val inspectionDate = currentTimeMillis.timestampToDate() - val startTime = currentTimeMillis.timestampToTime() - inspectionViewModel.startInspection( - context, inspectionUser, inspectionAddress, inspectionDate, startTime - ) - inspectionViewModel.addResultModel.observe(this) { - if (it.code == 200) { - inspectionId = it.data - } - } - - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(context, "pitfallBigType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - mainDicModels = it.data - } - } - - imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] - imageFileViewModel.sceneResult.observe(this) { - if (it == "没有检查到任何场景") { - isDetectingScene = false - } else { - AlertControlDialog.Builder().setContext(this).setTitle("提示") - .setMessage("识别到目标场景,是否开始排查该场景的隐患?") - .setNegativeButton("稍后") - .setPositiveButton("好的").setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - binding.titleView.setTitle(it) - detectedScene = it - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - imageFileViewModel.recognizeResult.observe(this) { - /** - * { - * "scene": "配电箱", - * "inferneceStart": "2024-04-26 16:16:03.653", - * "code": 200, - * "inferneceEnd": "2024-04-26 16:16:03.774", - * "inferneceInterval": "0:00:00.121", - * "result": [ - * - * ] - * } - * */ - if (it.code == 200) { - if (it.result.isEmpty()) { - binding.detectView.clearTag() - targetSet.clear() - binding.tipsTagView.visibility = View.GONE - } else { - binding.detectView.updateTargetPosition(it.result) - it.result.forEach { result -> - targetSet.add(result.label) - } - //显示角标 - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - } - } - isDetectingTarget = false - } - - // Initialize our background executor cameraExecutor = Executors.newSingleThreadExecutor() cameraProviderFuture = ProcessCameraProvider.getInstance(this) - // 检查 CameraProvider 可用性 cameraProviderFuture.addListener({ try { bindPreview(cameraProviderFuture.get()) @@ -201,37 +79,36 @@ aspectRatio(outMetrics.widthPixels, outMetrics.heightPixels) } - // CameraSelector, 选择后置摄像头 - val cameraSelector = - CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build() + val cameraSelector = CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build() - // Preview - val cameraPreViewBuilder = Preview.Builder().setTargetAspectRatio(screenAspectRatio) - .setTargetRotation(Surface.ROTATION_0).build() + val cameraPreViewBuilder = Preview.Builder() + .setTargetAspectRatio(screenAspectRatio) + .setTargetRotation(Surface.ROTATION_0) + .build() // ImageCapture - imageCapture = - ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) - .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) - .build() + imageCapture = ImageCapture.Builder() + .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) + .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) + .build() // ImageAnalysis - imageAnalysis = ImageAnalysis.Builder().setTargetAspectRatio(screenAspectRatio) + imageAnalysis = ImageAnalysis.Builder() + .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(Surface.ROTATION_0) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() - // Must unbind the use-cases before rebinding them cameraProvider.unbindAll() try { val camera = cameraProvider.bindToLifecycle( this, cameraSelector, imageCapture, imageAnalysis, cameraPreViewBuilder ) - // Attach the viewfinder's surface provider to preview use case cameraPreViewBuilder.setSurfaceProvider(binding.cameraPreView.surfaceProvider) camera.cameraInfo.cameraState.observe(this) { - //开始预览之后才检测 if (it.type == CameraState.Type.OPEN) { imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } @@ -252,19 +129,6 @@ if (bitmap != null) { val base64 = bitmap.encodeToBase64() - //先识别场景 - if (!isDetectingScene) { - isDetectingScene = true - imageFileViewModel.getScene(context, base64) - } - - //再识别隐患 - if (!isDetectingTarget && detectedScene.isNotBlank()) { - isDetectingTarget = true - imageFileViewModel.getRecognizeResult( - context, base64, detectedScene, inspectionId - ) - } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 imageProxy.close() @@ -289,39 +153,7 @@ } override fun initEvent() { - binding.stopButton.setOnClickListener { - if (inspectionId.isBlank()) { - "巡检任务创建中,请稍后再结束任务".show(this) - return@setOnClickListener - } - navigatePageTo(inspectionId) - } - binding.tipsButton.setOnClickListener { - if (targetSet.isEmpty()) { - "未识别到任何目标,无法查看检查清单".show(this) - return@setOnClickListener - } - //根据识别出来的结果显示清单 - navigatePageTo( - arrayListOf(detectedScene, targetSet.toJson()) - ) - } - - binding.addButton.setOnClickListener { - navigatePageTo(mainDicModels.toJson()) - } - - /** - * 根据场景查看检查清单 - * */ - binding.listButton.setOnClickListener { - if (inspectionId.isBlank()) { - "请先选择场景或者识别出场景再试".show(this) - return@setOnClickListener - } - navigatePageTo(arrayListOf(detectedScene, inspectionId)) - } } override fun initViewBinding(): ActivityStartCheckBinding { @@ -340,51 +172,15 @@ } override fun onRightClick() { - BottomActionSheet.Builder() - .setContext(context) - .setActionItemTitle(arrayListOf("手动选择场景", "重置已选场景")) - .setItemTextColor(R.color.themeColor.convertColor(context)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - val intent = Intent(context, SelectSceneActivity::class.java) - selectSceneLauncher.launch(intent) - } - 1 -> { - binding.titleView.setTitle("") - isDetectingScene = false - detectedScene = "" - "场景重置成功".show(context) - } - } - } - }).build().show() } }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), - ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - detectedScene = sceneName - } - }) - private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) return if (abs(ratio - RATIO_4_3_VALUE) <= abs(ratio - RATIO_16_9_VALUE)) { AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } - - override fun onDestroy() { - super.onDestroy() - locationManager.stopLocation() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index 394bcdf..c76af42 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -1,76 +1,21 @@ package com.casic.br.app.vm -import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.model.ActionResultModel -import com.casic.br.app.model.RecognizeResultModel import com.casic.br.app.retrofit.RetrofitServiceManager import com.google.gson.Gson -import com.google.gson.JsonParser import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState import java.io.File class ImageFileViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val sceneResult = MutableLiveData() - val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getScene(context: Context, base64: String) = launch({ - val response = RetrofitServiceManager.getScene(base64) - when (response.getResponseCode()) { - 200 -> { - /** - * { - * "code": 200, - * "scene": "配电箱" - * } - * */ - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - sceneResult.value = jsonObject.get("scene").asString - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - } - } - }, { - it.printStackTrace() - }) - - fun getRecognizeResult( - context: Context, base64: String, scene: String, inspectionId: String - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene, inspectionId) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail - } - } - }, { - loadState.value = LoadState.Fail - }) - fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) diff --git a/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt b/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt deleted file mode 100644 index 0ce98be..0000000 --- a/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.br.app.widgets - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.Paint -import android.graphics.Rect -import android.text.TextPaint -import android.util.AttributeSet -import android.view.View -import com.casic.br.app.model.RecognizeResultModel -import com.pengxh.kt.lite.extensions.dp2px -import com.pengxh.kt.lite.extensions.getScreenHeight -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getStatusBarHeight -import com.pengxh.kt.lite.extensions.sp2px - -class AITargetDetectView constructor(context: Context, attrs: AttributeSet) : View(context, attrs) { - - private val kTag = "DetectView" - private val textPaint by lazy { TextPaint() } - private val borderPaint by lazy { Paint() } - private val rect by lazy { Rect() } - private var viewWidth = 0 - private var viewHeight = 0 - private var resultModels: MutableList = ArrayList() - - init { - textPaint.color = Color.RED - textPaint.isAntiAlias = true - textPaint.textAlign = Paint.Align.CENTER - textPaint.textSize = 14f.sp2px(context) - - borderPaint.color = Color.RED - borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = 2f.dp2px(context) //设置线宽 - borderPaint.isAntiAlias = true - - viewWidth = context.getScreenWidth() - //屏幕整体高度-状态栏高度-标题栏高度 - viewHeight = context.getScreenHeight() - context.getStatusBarHeight() - 44.dp2px(context) - } - - fun updateTargetPosition(resultModels: MutableList) { - this.resultModels = resultModels - invalidate() - } - - fun clearTag() { - this.resultModels.clear() - invalidate() - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - resultModels.forEach { - if (it.box.isNotEmpty()) { - //画文字 - val textLength = textPaint.measureText(it.label) - canvas.drawText( - it.label, - (it.box[0] * viewWidth + textLength / 2).toFloat(), - (it.box[1] * viewHeight - 10).toFloat(), - textPaint - ) - - //画框 - val box = it.box - rect.set( - (box[0] * viewWidth).toInt(), - (box[1] * viewHeight).toInt(), - (box[2] * viewWidth).toInt(), - (box[3] * viewHeight).toInt() - ) - canvas.drawRect(rect, borderPaint) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e4f25df..1e9fe47 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -7,6 +7,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath import com.casic.br.app.extensions.compressImage @@ -15,7 +16,6 @@ import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.HiddenTroubleViewModel import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 940b35c..bbff411 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -1,7 +1,5 @@ package com.casic.br.app.view -import android.app.Activity -import android.content.Intent import android.graphics.Bitmap import android.graphics.ImageFormat import android.os.Build @@ -10,9 +8,6 @@ import android.util.DisplayMetrics import android.util.Log import android.view.Surface -import android.view.View -import androidx.activity.result.ActivityResultCallback -import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.AspectRatio import androidx.camera.core.CameraSelector import androidx.camera.core.CameraState @@ -21,30 +16,13 @@ import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider -import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.extensions.toBitmap -import com.casic.br.app.model.DictionaryModel -import com.casic.br.app.utils.LocaleConstant -import com.casic.br.app.utils.LocationManager -import com.casic.br.app.vm.ConfigViewModel -import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.timestampToDate -import com.pengxh.kt.lite.extensions.timestampToTime -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.ByteArrayOutputStream import java.io.IOException import java.util.concurrent.ExecutionException @@ -64,7 +42,6 @@ } private val kTag = "StartCheckActivity" - private val context = this private val executor = ThreadPoolExecutor( 16, 16, @@ -73,113 +50,14 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) - private val locationManager by lazy { LocationManager(this) } - private val targetSet by lazy { HashSet() } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis - private lateinit var inspectionViewModel: InspectionViewModel - private lateinit var configViewModel: ConfigViewModel - private lateinit var imageFileViewModel: ImageFileViewModel - private var detectedScene = "" - private var inspectionId = "" - private var inspectionAddress = "" - private var isDetectingScene = false //是否正在识别场景 - private var isDetectingTarget = false //是否正在识别目标 - private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { - locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - location?.apply { - inspectionAddress = address - } - } - }) - - inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] - val inspectionUser = SaveKeyValues.getValue( - LocaleConstant.ACCOUNT, "" - ) as String - - val currentTimeMillis = System.currentTimeMillis() - val inspectionDate = currentTimeMillis.timestampToDate() - val startTime = currentTimeMillis.timestampToTime() - inspectionViewModel.startInspection( - context, inspectionUser, inspectionAddress, inspectionDate, startTime - ) - inspectionViewModel.addResultModel.observe(this) { - if (it.code == 200) { - inspectionId = it.data - } - } - - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(context, "pitfallBigType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - mainDicModels = it.data - } - } - - imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] - imageFileViewModel.sceneResult.observe(this) { - if (it == "没有检查到任何场景") { - isDetectingScene = false - } else { - AlertControlDialog.Builder().setContext(this).setTitle("提示") - .setMessage("识别到目标场景,是否开始排查该场景的隐患?") - .setNegativeButton("稍后") - .setPositiveButton("好的").setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - binding.titleView.setTitle(it) - detectedScene = it - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - imageFileViewModel.recognizeResult.observe(this) { - /** - * { - * "scene": "配电箱", - * "inferneceStart": "2024-04-26 16:16:03.653", - * "code": 200, - * "inferneceEnd": "2024-04-26 16:16:03.774", - * "inferneceInterval": "0:00:00.121", - * "result": [ - * - * ] - * } - * */ - if (it.code == 200) { - if (it.result.isEmpty()) { - binding.detectView.clearTag() - targetSet.clear() - binding.tipsTagView.visibility = View.GONE - } else { - binding.detectView.updateTargetPosition(it.result) - it.result.forEach { result -> - targetSet.add(result.label) - } - //显示角标 - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - } - } - isDetectingTarget = false - } - - // Initialize our background executor cameraExecutor = Executors.newSingleThreadExecutor() cameraProviderFuture = ProcessCameraProvider.getInstance(this) - // 检查 CameraProvider 可用性 cameraProviderFuture.addListener({ try { bindPreview(cameraProviderFuture.get()) @@ -201,37 +79,36 @@ aspectRatio(outMetrics.widthPixels, outMetrics.heightPixels) } - // CameraSelector, 选择后置摄像头 - val cameraSelector = - CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build() + val cameraSelector = CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build() - // Preview - val cameraPreViewBuilder = Preview.Builder().setTargetAspectRatio(screenAspectRatio) - .setTargetRotation(Surface.ROTATION_0).build() + val cameraPreViewBuilder = Preview.Builder() + .setTargetAspectRatio(screenAspectRatio) + .setTargetRotation(Surface.ROTATION_0) + .build() // ImageCapture - imageCapture = - ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) - .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) - .build() + imageCapture = ImageCapture.Builder() + .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) + .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) + .build() // ImageAnalysis - imageAnalysis = ImageAnalysis.Builder().setTargetAspectRatio(screenAspectRatio) + imageAnalysis = ImageAnalysis.Builder() + .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(Surface.ROTATION_0) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() - // Must unbind the use-cases before rebinding them cameraProvider.unbindAll() try { val camera = cameraProvider.bindToLifecycle( this, cameraSelector, imageCapture, imageAnalysis, cameraPreViewBuilder ) - // Attach the viewfinder's surface provider to preview use case cameraPreViewBuilder.setSurfaceProvider(binding.cameraPreView.surfaceProvider) camera.cameraInfo.cameraState.observe(this) { - //开始预览之后才检测 if (it.type == CameraState.Type.OPEN) { imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } @@ -252,19 +129,6 @@ if (bitmap != null) { val base64 = bitmap.encodeToBase64() - //先识别场景 - if (!isDetectingScene) { - isDetectingScene = true - imageFileViewModel.getScene(context, base64) - } - - //再识别隐患 - if (!isDetectingTarget && detectedScene.isNotBlank()) { - isDetectingTarget = true - imageFileViewModel.getRecognizeResult( - context, base64, detectedScene, inspectionId - ) - } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 imageProxy.close() @@ -289,39 +153,7 @@ } override fun initEvent() { - binding.stopButton.setOnClickListener { - if (inspectionId.isBlank()) { - "巡检任务创建中,请稍后再结束任务".show(this) - return@setOnClickListener - } - navigatePageTo(inspectionId) - } - binding.tipsButton.setOnClickListener { - if (targetSet.isEmpty()) { - "未识别到任何目标,无法查看检查清单".show(this) - return@setOnClickListener - } - //根据识别出来的结果显示清单 - navigatePageTo( - arrayListOf(detectedScene, targetSet.toJson()) - ) - } - - binding.addButton.setOnClickListener { - navigatePageTo(mainDicModels.toJson()) - } - - /** - * 根据场景查看检查清单 - * */ - binding.listButton.setOnClickListener { - if (inspectionId.isBlank()) { - "请先选择场景或者识别出场景再试".show(this) - return@setOnClickListener - } - navigatePageTo(arrayListOf(detectedScene, inspectionId)) - } } override fun initViewBinding(): ActivityStartCheckBinding { @@ -340,51 +172,15 @@ } override fun onRightClick() { - BottomActionSheet.Builder() - .setContext(context) - .setActionItemTitle(arrayListOf("手动选择场景", "重置已选场景")) - .setItemTextColor(R.color.themeColor.convertColor(context)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - val intent = Intent(context, SelectSceneActivity::class.java) - selectSceneLauncher.launch(intent) - } - 1 -> { - binding.titleView.setTitle("") - isDetectingScene = false - detectedScene = "" - "场景重置成功".show(context) - } - } - } - }).build().show() } }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), - ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - detectedScene = sceneName - } - }) - private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) return if (abs(ratio - RATIO_4_3_VALUE) <= abs(ratio - RATIO_16_9_VALUE)) { AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } - - override fun onDestroy() { - super.onDestroy() - locationManager.stopLocation() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index 394bcdf..c76af42 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -1,76 +1,21 @@ package com.casic.br.app.vm -import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.model.ActionResultModel -import com.casic.br.app.model.RecognizeResultModel import com.casic.br.app.retrofit.RetrofitServiceManager import com.google.gson.Gson -import com.google.gson.JsonParser import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState import java.io.File class ImageFileViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val sceneResult = MutableLiveData() - val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getScene(context: Context, base64: String) = launch({ - val response = RetrofitServiceManager.getScene(base64) - when (response.getResponseCode()) { - 200 -> { - /** - * { - * "code": 200, - * "scene": "配电箱" - * } - * */ - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - sceneResult.value = jsonObject.get("scene").asString - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - } - } - }, { - it.printStackTrace() - }) - - fun getRecognizeResult( - context: Context, base64: String, scene: String, inspectionId: String - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene, inspectionId) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail - } - } - }, { - loadState.value = LoadState.Fail - }) - fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) diff --git a/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt b/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt deleted file mode 100644 index 0ce98be..0000000 --- a/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.br.app.widgets - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.Paint -import android.graphics.Rect -import android.text.TextPaint -import android.util.AttributeSet -import android.view.View -import com.casic.br.app.model.RecognizeResultModel -import com.pengxh.kt.lite.extensions.dp2px -import com.pengxh.kt.lite.extensions.getScreenHeight -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getStatusBarHeight -import com.pengxh.kt.lite.extensions.sp2px - -class AITargetDetectView constructor(context: Context, attrs: AttributeSet) : View(context, attrs) { - - private val kTag = "DetectView" - private val textPaint by lazy { TextPaint() } - private val borderPaint by lazy { Paint() } - private val rect by lazy { Rect() } - private var viewWidth = 0 - private var viewHeight = 0 - private var resultModels: MutableList = ArrayList() - - init { - textPaint.color = Color.RED - textPaint.isAntiAlias = true - textPaint.textAlign = Paint.Align.CENTER - textPaint.textSize = 14f.sp2px(context) - - borderPaint.color = Color.RED - borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = 2f.dp2px(context) //设置线宽 - borderPaint.isAntiAlias = true - - viewWidth = context.getScreenWidth() - //屏幕整体高度-状态栏高度-标题栏高度 - viewHeight = context.getScreenHeight() - context.getStatusBarHeight() - 44.dp2px(context) - } - - fun updateTargetPosition(resultModels: MutableList) { - this.resultModels = resultModels - invalidate() - } - - fun clearTag() { - this.resultModels.clear() - invalidate() - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - resultModels.forEach { - if (it.box.isNotEmpty()) { - //画文字 - val textLength = textPaint.measureText(it.label) - canvas.drawText( - it.label, - (it.box[0] * viewWidth + textLength / 2).toFloat(), - (it.box[1] * viewHeight - 10).toFloat(), - textPaint - ) - - //画框 - val box = it.box - rect.set( - (box[0] * viewWidth).toInt(), - (box[1] * viewHeight).toInt(), - (box[2] * viewWidth).toInt(), - (box[3] * viewHeight).toInt() - ) - canvas.drawRect(rect, borderPaint) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt index ac54f29..30b82a4 100644 --- a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -5,9 +5,9 @@ import android.graphics.Bitmap import android.os.Bundle import android.util.Log +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.DialogDetectResultBinding import com.casic.br.app.extensions.compressImage -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0c514bc..d02d2cb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -59,7 +59,6 @@ - result; - - public String getScene() { - return scene; - } - - public void setScene(String scene) { - this.scene = scene; - } - - public String getInferneceStart() { - return inferneceStart; - } - - public void setInferneceStart(String inferneceStart) { - this.inferneceStart = inferneceStart; - } - - public int getCode() { - return code; - } - - public void setCode(int code) { - this.code = code; - } - - public String getInferneceEnd() { - return inferneceEnd; - } - - public void setInferneceEnd(String inferneceEnd) { - this.inferneceEnd = inferneceEnd; - } - - public String getInferneceInterval() { - return inferneceInterval; - } - - public void setInferneceInterval(String inferneceInterval) { - this.inferneceInterval = inferneceInterval; - } - - public List getResult() { - return result; - } - - public void setResult(List result) { - this.result = result; - } - - public static class ResultModel { - private String label; - private double conf; - private List box; - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public double getConf() { - return conf; - } - - public void setConf(double conf) { - this.conf = conf; - } - - public List getBox() { - return box; - } - - public void setBox(List box) { - this.box = box; - } - } -} diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt index 6eec624..f6f365b 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitService.kt @@ -8,7 +8,6 @@ import retrofit2.http.Multipart import retrofit2.http.POST import retrofit2.http.Part -import retrofit2.http.PartMap import retrofit2.http.Path import retrofit2.http.Query @@ -165,20 +164,6 @@ ): String /** - * 获取场景 - */ - @Multipart - @POST("/getScene") - suspend fun getScene(@PartMap body: MutableMap): String - - /** - * 获取画面识别结果 - */ - @Multipart - @POST("/detect") - suspend fun getRecognizeResult(@PartMap body: MutableMap): String - - /** * 获取知识库分类列表 */ @GET("/knowledge-class/list") diff --git a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt index c4edbee..eaa358a 100644 --- a/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/br/app/retrofit/RetrofitServiceManager.kt @@ -11,7 +11,6 @@ import okhttp3.MediaType.Companion.toMediaType import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody -import okhttp3.RequestBody import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import java.io.File @@ -26,13 +25,6 @@ RetrofitFactory.createRetrofit(httpConfig, 20, true) } - private val aiApi by lazy { - val httpConfig = SaveKeyValues.getValue( - LocaleConstant.AI_SERVER_CONFIG, LocaleConstant.AI_BASE_URL - ) as String - RetrofitFactory.createRetrofit(httpConfig, 20, false) - } - private val gson by lazy { Gson() } private val typeToken = object : TypeToken>>() {}.type @@ -223,26 +215,6 @@ } /** - * 获取场景 - * */ - suspend fun getScene(base64: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - return aiApi.getScene(map) - } - - /** - * 获取画面识别结果 - * */ - suspend fun getRecognizeResult(base64: String, scene: String, inspectionId: String): String { - val map: MutableMap = mutableMapOf() - map["img"] = "data:image/png;base64,${base64}".toRequestBody() - map["scene"] = scene.toRequestBody() - map["xunjian_id"] = inspectionId.toRequestBody() - return aiApi.getRecognizeResult(map) - } - - /** * 获取知识库分类列表 */ suspend fun getLibraryList(): String { diff --git a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt index e4f25df..1e9fe47 100644 --- a/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/AddHiddenTroubleActivity.kt @@ -7,6 +7,7 @@ import android.widget.AdapterView import android.widget.ArrayAdapter import androidx.lifecycle.ViewModelProvider +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath import com.casic.br.app.extensions.compressImage @@ -15,7 +16,6 @@ import com.casic.br.app.vm.ConfigViewModel import com.casic.br.app.vm.HiddenTroubleViewModel import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt index 940b35c..bbff411 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckActivity.kt @@ -1,7 +1,5 @@ package com.casic.br.app.view -import android.app.Activity -import android.content.Intent import android.graphics.Bitmap import android.graphics.ImageFormat import android.os.Build @@ -10,9 +8,6 @@ import android.util.DisplayMetrics import android.util.Log import android.view.Surface -import android.view.View -import androidx.activity.result.ActivityResultCallback -import androidx.activity.result.contract.ActivityResultContracts import androidx.camera.core.AspectRatio import androidx.camera.core.CameraSelector import androidx.camera.core.CameraState @@ -21,30 +16,13 @@ import androidx.camera.core.Preview import androidx.camera.lifecycle.ProcessCameraProvider import androidx.core.content.ContextCompat -import androidx.lifecycle.ViewModelProvider -import com.amap.api.location.AMapLocation import com.casic.br.app.R import com.casic.br.app.databinding.ActivityStartCheckBinding import com.casic.br.app.extensions.initImmersionBar import com.casic.br.app.extensions.toBitmap -import com.casic.br.app.model.DictionaryModel -import com.casic.br.app.utils.LocaleConstant -import com.casic.br.app.utils.LocationManager -import com.casic.br.app.vm.ConfigViewModel -import com.casic.br.app.vm.ImageFileViewModel -import com.casic.br.app.vm.InspectionViewModel import com.google.common.util.concurrent.ListenableFuture import com.pengxh.kt.lite.base.KotlinBaseActivity -import com.pengxh.kt.lite.extensions.convertColor -import com.pengxh.kt.lite.extensions.navigatePageTo -import com.pengxh.kt.lite.extensions.show -import com.pengxh.kt.lite.extensions.timestampToDate -import com.pengxh.kt.lite.extensions.timestampToTime -import com.pengxh.kt.lite.extensions.toJson -import com.pengxh.kt.lite.utils.SaveKeyValues import com.pengxh.kt.lite.widget.TitleBarView -import com.pengxh.kt.lite.widget.dialog.AlertControlDialog -import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import java.io.ByteArrayOutputStream import java.io.IOException import java.util.concurrent.ExecutionException @@ -64,7 +42,6 @@ } private val kTag = "StartCheckActivity" - private val context = this private val executor = ThreadPoolExecutor( 16, 16, @@ -73,113 +50,14 @@ LinkedBlockingQueue(1024), ThreadPoolExecutor.AbortPolicy() ) - private val locationManager by lazy { LocationManager(this) } - private val targetSet by lazy { HashSet() } private lateinit var cameraExecutor: ExecutorService private lateinit var cameraProviderFuture: ListenableFuture private lateinit var imageCapture: ImageCapture private lateinit var imageAnalysis: ImageAnalysis - private lateinit var inspectionViewModel: InspectionViewModel - private lateinit var configViewModel: ConfigViewModel - private lateinit var imageFileViewModel: ImageFileViewModel - private var detectedScene = "" - private var inspectionId = "" - private var inspectionAddress = "" - private var isDetectingScene = false //是否正在识别场景 - private var isDetectingTarget = false //是否正在识别目标 - private var mainDicModels: MutableList = ArrayList() override fun initOnCreate(savedInstanceState: Bundle?) { - locationManager.getCurrentLocation(false, object : LocationManager.OnGetLocationListener { - override fun onAMapLocationGet(location: AMapLocation?) { - location?.apply { - inspectionAddress = address - } - } - }) - - inspectionViewModel = ViewModelProvider(this)[InspectionViewModel::class.java] - val inspectionUser = SaveKeyValues.getValue( - LocaleConstant.ACCOUNT, "" - ) as String - - val currentTimeMillis = System.currentTimeMillis() - val inspectionDate = currentTimeMillis.timestampToDate() - val startTime = currentTimeMillis.timestampToTime() - inspectionViewModel.startInspection( - context, inspectionUser, inspectionAddress, inspectionDate, startTime - ) - inspectionViewModel.addResultModel.observe(this) { - if (it.code == 200) { - inspectionId = it.data - } - } - - configViewModel = ViewModelProvider(this)[ConfigViewModel::class.java] - configViewModel.getDictionaryByCode(context, "pitfallBigType") - configViewModel.dictionary.observe(this) { - if (it.code == 200) { - mainDicModels = it.data - } - } - - imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] - imageFileViewModel.sceneResult.observe(this) { - if (it == "没有检查到任何场景") { - isDetectingScene = false - } else { - AlertControlDialog.Builder().setContext(this).setTitle("提示") - .setMessage("识别到目标场景,是否开始排查该场景的隐患?") - .setNegativeButton("稍后") - .setPositiveButton("好的").setOnDialogButtonClickListener(object : - AlertControlDialog.OnDialogButtonClickListener { - override fun onConfirmClick() { - binding.titleView.setTitle(it) - detectedScene = it - } - - override fun onCancelClick() { - - } - }).build().show() - } - } - - imageFileViewModel.recognizeResult.observe(this) { - /** - * { - * "scene": "配电箱", - * "inferneceStart": "2024-04-26 16:16:03.653", - * "code": 200, - * "inferneceEnd": "2024-04-26 16:16:03.774", - * "inferneceInterval": "0:00:00.121", - * "result": [ - * - * ] - * } - * */ - if (it.code == 200) { - if (it.result.isEmpty()) { - binding.detectView.clearTag() - targetSet.clear() - binding.tipsTagView.visibility = View.GONE - } else { - binding.detectView.updateTargetPosition(it.result) - it.result.forEach { result -> - targetSet.add(result.label) - } - //显示角标 - binding.tipsTagView.visibility = View.VISIBLE - binding.tipsTagView.text = "${targetSet.size}" - } - } - isDetectingTarget = false - } - - // Initialize our background executor cameraExecutor = Executors.newSingleThreadExecutor() cameraProviderFuture = ProcessCameraProvider.getInstance(this) - // 检查 CameraProvider 可用性 cameraProviderFuture.addListener({ try { bindPreview(cameraProviderFuture.get()) @@ -201,37 +79,36 @@ aspectRatio(outMetrics.widthPixels, outMetrics.heightPixels) } - // CameraSelector, 选择后置摄像头 - val cameraSelector = - CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build() + val cameraSelector = CameraSelector.Builder() + .requireLensFacing(CameraSelector.LENS_FACING_BACK) + .build() - // Preview - val cameraPreViewBuilder = Preview.Builder().setTargetAspectRatio(screenAspectRatio) - .setTargetRotation(Surface.ROTATION_0).build() + val cameraPreViewBuilder = Preview.Builder() + .setTargetAspectRatio(screenAspectRatio) + .setTargetRotation(Surface.ROTATION_0) + .build() // ImageCapture - imageCapture = - ImageCapture.Builder().setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) - .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) - .build() + imageCapture = ImageCapture.Builder() + .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) + .setTargetAspectRatio(screenAspectRatio).setTargetRotation(Surface.ROTATION_0) + .build() // ImageAnalysis - imageAnalysis = ImageAnalysis.Builder().setTargetAspectRatio(screenAspectRatio) + imageAnalysis = ImageAnalysis.Builder() + .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(Surface.ROTATION_0) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() - // Must unbind the use-cases before rebinding them cameraProvider.unbindAll() try { val camera = cameraProvider.bindToLifecycle( this, cameraSelector, imageCapture, imageAnalysis, cameraPreViewBuilder ) - // Attach the viewfinder's surface provider to preview use case cameraPreViewBuilder.setSurfaceProvider(binding.cameraPreView.surfaceProvider) camera.cameraInfo.cameraState.observe(this) { - //开始预览之后才检测 if (it.type == CameraState.Type.OPEN) { imageAnalysis.setAnalyzer(cameraExecutor, imageAnalyzer) } @@ -252,19 +129,6 @@ if (bitmap != null) { val base64 = bitmap.encodeToBase64() - //先识别场景 - if (!isDetectingScene) { - isDetectingScene = true - imageFileViewModel.getScene(context, base64) - } - - //再识别隐患 - if (!isDetectingTarget && detectedScene.isNotBlank()) { - isDetectingTarget = true - imageFileViewModel.getRecognizeResult( - context, base64, detectedScene, inspectionId - ) - } } //检测完之后close就会继续生成下一帧图片,否则就会被阻塞不会继续生成下一帧 imageProxy.close() @@ -289,39 +153,7 @@ } override fun initEvent() { - binding.stopButton.setOnClickListener { - if (inspectionId.isBlank()) { - "巡检任务创建中,请稍后再结束任务".show(this) - return@setOnClickListener - } - navigatePageTo(inspectionId) - } - binding.tipsButton.setOnClickListener { - if (targetSet.isEmpty()) { - "未识别到任何目标,无法查看检查清单".show(this) - return@setOnClickListener - } - //根据识别出来的结果显示清单 - navigatePageTo( - arrayListOf(detectedScene, targetSet.toJson()) - ) - } - - binding.addButton.setOnClickListener { - navigatePageTo(mainDicModels.toJson()) - } - - /** - * 根据场景查看检查清单 - * */ - binding.listButton.setOnClickListener { - if (inspectionId.isBlank()) { - "请先选择场景或者识别出场景再试".show(this) - return@setOnClickListener - } - navigatePageTo(arrayListOf(detectedScene, inspectionId)) - } } override fun initViewBinding(): ActivityStartCheckBinding { @@ -340,51 +172,15 @@ } override fun onRightClick() { - BottomActionSheet.Builder() - .setContext(context) - .setActionItemTitle(arrayListOf("手动选择场景", "重置已选场景")) - .setItemTextColor(R.color.themeColor.convertColor(context)) - .setOnActionSheetListener(object : BottomActionSheet.OnActionSheetListener { - override fun onActionItemClick(position: Int) { - when (position) { - 0 -> { - val intent = Intent(context, SelectSceneActivity::class.java) - selectSceneLauncher.launch(intent) - } - 1 -> { - binding.titleView.setTitle("") - isDetectingScene = false - detectedScene = "" - "场景重置成功".show(context) - } - } - } - }).build().show() } }) } - private val selectSceneLauncher = registerForActivityResult( - ActivityResultContracts.StartActivityForResult(), - ActivityResultCallback { - if (it.resultCode == Activity.RESULT_OK) { - val data = it.data ?: return@ActivityResultCallback - val sceneName = data.getStringExtra("sceneName").toString() - binding.titleView.setTitle(sceneName) - detectedScene = sceneName - } - }) - private fun aspectRatio(width: Int, height: Int): Int { val ratio = width.coerceAtLeast(height).toDouble() / width.coerceAtMost(height) return if (abs(ratio - RATIO_4_3_VALUE) <= abs(ratio - RATIO_16_9_VALUE)) { AspectRatio.RATIO_4_3 } else AspectRatio.RATIO_16_9 } - - override fun onDestroy() { - super.onDestroy() - locationManager.stopLocation() - } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt index 394bcdf..c76af42 100644 --- a/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt +++ b/app/src/main/java/com/casic/br/app/vm/ImageFileViewModel.kt @@ -1,76 +1,21 @@ package com.casic.br.app.vm -import android.content.Context import androidx.lifecycle.MutableLiveData import com.casic.br.app.extensions.getResponseCode import com.casic.br.app.model.ActionResultModel -import com.casic.br.app.model.RecognizeResultModel import com.casic.br.app.retrofit.RetrofitServiceManager import com.google.gson.Gson -import com.google.gson.JsonParser import com.google.gson.reflect.TypeToken import com.pengxh.kt.lite.base.BaseViewModel import com.pengxh.kt.lite.extensions.launch -import com.pengxh.kt.lite.extensions.show import com.pengxh.kt.lite.utils.LoadState import java.io.File class ImageFileViewModel : BaseViewModel() { private val gson by lazy { Gson() } - val sceneResult = MutableLiveData() - val recognizeResult = MutableLiveData() val resultModel = MutableLiveData() - fun getScene(context: Context, base64: String) = launch({ - val response = RetrofitServiceManager.getScene(base64) - when (response.getResponseCode()) { - 200 -> { - /** - * { - * "code": 200, - * "scene": "配电箱" - * } - * */ - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - sceneResult.value = jsonObject.get("scene").asString - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - } - } - }, { - it.printStackTrace() - }) - - fun getRecognizeResult( - context: Context, base64: String, scene: String, inspectionId: String - ) = launch({ - loadState.value = LoadState.Loading - val response = RetrofitServiceManager.getRecognizeResult(base64, scene, inspectionId) - when (response.getResponseCode()) { - 200 -> { - loadState.value = LoadState.Success - recognizeResult.value = gson.fromJson( - response, object : TypeToken() {}.type - ) - } - - else -> { - val element = JsonParser.parseString(response) - val jsonObject = element.asJsonObject - jsonObject.get("result").asString.show(context) - loadState.value = LoadState.Fail - } - } - }, { - loadState.value = LoadState.Fail - }) - fun uploadImage(image: File) = launch({ loadState.value = LoadState.Loading val response = RetrofitServiceManager.uploadImage(image) diff --git a/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt b/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt deleted file mode 100644 index 0ce98be..0000000 --- a/app/src/main/java/com/casic/br/app/widgets/AITargetDetectView.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.br.app.widgets - -import android.content.Context -import android.graphics.Canvas -import android.graphics.Color -import android.graphics.Paint -import android.graphics.Rect -import android.text.TextPaint -import android.util.AttributeSet -import android.view.View -import com.casic.br.app.model.RecognizeResultModel -import com.pengxh.kt.lite.extensions.dp2px -import com.pengxh.kt.lite.extensions.getScreenHeight -import com.pengxh.kt.lite.extensions.getScreenWidth -import com.pengxh.kt.lite.extensions.getStatusBarHeight -import com.pengxh.kt.lite.extensions.sp2px - -class AITargetDetectView constructor(context: Context, attrs: AttributeSet) : View(context, attrs) { - - private val kTag = "DetectView" - private val textPaint by lazy { TextPaint() } - private val borderPaint by lazy { Paint() } - private val rect by lazy { Rect() } - private var viewWidth = 0 - private var viewHeight = 0 - private var resultModels: MutableList = ArrayList() - - init { - textPaint.color = Color.RED - textPaint.isAntiAlias = true - textPaint.textAlign = Paint.Align.CENTER - textPaint.textSize = 14f.sp2px(context) - - borderPaint.color = Color.RED - borderPaint.style = Paint.Style.STROKE - borderPaint.strokeWidth = 2f.dp2px(context) //设置线宽 - borderPaint.isAntiAlias = true - - viewWidth = context.getScreenWidth() - //屏幕整体高度-状态栏高度-标题栏高度 - viewHeight = context.getScreenHeight() - context.getStatusBarHeight() - 44.dp2px(context) - } - - fun updateTargetPosition(resultModels: MutableList) { - this.resultModels = resultModels - invalidate() - } - - fun clearTag() { - this.resultModels.clear() - invalidate() - } - - override fun onDraw(canvas: Canvas) { - super.onDraw(canvas) - resultModels.forEach { - if (it.box.isNotEmpty()) { - //画文字 - val textLength = textPaint.measureText(it.label) - canvas.drawText( - it.label, - (it.box[0] * viewWidth + textLength / 2).toFloat(), - (it.box[1] * viewHeight - 10).toFloat(), - textPaint - ) - - //画框 - val box = it.box - rect.set( - (box[0] * viewWidth).toInt(), - (box[1] * viewHeight).toInt(), - (box[2] * viewWidth).toInt(), - (box[3] * viewHeight).toInt() - ) - canvas.drawRect(rect, borderPaint) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt index ac54f29..30b82a4 100644 --- a/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt +++ b/app/src/main/java/com/casic/br/app/widgets/DetectResultDialog.kt @@ -5,9 +5,9 @@ import android.graphics.Bitmap import android.os.Bundle import android.util.Log +import com.casic.br.app.callback.OnImageCompressListener import com.casic.br.app.databinding.DialogDetectResultBinding import com.casic.br.app.extensions.compressImage -import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.pengxh.kt.lite.extensions.binding import com.pengxh.kt.lite.extensions.createImageFileDir import com.pengxh.kt.lite.extensions.initDialogLayoutParams diff --git a/app/src/main/res/layout/activity_start_check.xml b/app/src/main/res/layout/activity_start_check.xml index 9336b61..8646f7d 100644 --- a/app/src/main/res/layout/activity_start_check.xml +++ b/app/src/main/res/layout/activity_start_check.xml @@ -20,96 +20,9 @@ app:tbv_text_color="@color/white" app:tbv_text_size="@dimen/sp_18" /> - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_weight="1" /> \ No newline at end of file