diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 4cc587a..fc5e052 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 @@ -248,4 +248,24 @@ return api.getDictionaryByCode(AuthenticationHelper.token, dictCode) } + /** + * 推送报警信息 + * */ + suspend fun uploadDetectTargetAlarm( + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ): String { + val param = JsonObject() + param.addProperty("alamCode", alamCode) + param.addProperty("alarmlmgPath", alarmlmgPath) + param.addProperty("inspectionld", inspectionld) + param.addProperty("scene", scene) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.uploadDetectTargetAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 4cc587a..fc5e052 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 @@ -248,4 +248,24 @@ return api.getDictionaryByCode(AuthenticationHelper.token, dictCode) } + /** + * 推送报警信息 + * */ + suspend fun uploadDetectTargetAlarm( + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ): String { + val param = JsonObject() + param.addProperty("alamCode", alamCode) + param.addProperty("alarmlmgPath", alarmlmgPath) + param.addProperty("inspectionld", inspectionld) + param.addProperty("scene", scene) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.uploadDetectTargetAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file 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 ebeee4c..0876851 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 @@ -9,11 +9,13 @@ import androidx.lifecycle.lifecycleScope import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath +import com.casic.br.app.extensions.compressImage import com.casic.br.app.model.DictionaryModel import com.casic.br.app.utils.GlideLoadEngine 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.google.gson.Gson import com.google.gson.reflect.TypeToken import com.luck.picture.lib.basic.PictureSelector @@ -23,7 +25,6 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.show @@ -33,8 +34,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch -import top.zibin.luban.Luban -import top.zibin.luban.OnCompressListener import java.io.File @@ -222,22 +221,17 @@ }.collect { selectedImages.add(it) //压缩图片并上传 - Luban.with(context).load(it.realPath).ignoreBy(100) - .setTargetDir(createCompressImageDir().toString()) - .setCompressListener(object : OnCompressListener { - override fun onStart() { + it.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + //上传图片 + imageFileViewModel.uploadImage(file) + } - } - - override fun onSuccess(file: File) { - //上传图片 - imageFileViewModel.uploadImage(file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }).launch() + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } } diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 4cc587a..fc5e052 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 @@ -248,4 +248,24 @@ return api.getDictionaryByCode(AuthenticationHelper.token, dictCode) } + /** + * 推送报警信息 + * */ + suspend fun uploadDetectTargetAlarm( + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ): String { + val param = JsonObject() + param.addProperty("alamCode", alamCode) + param.addProperty("alarmlmgPath", alarmlmgPath) + param.addProperty("inspectionld", inspectionld) + param.addProperty("scene", scene) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.uploadDetectTargetAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file 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 ebeee4c..0876851 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 @@ -9,11 +9,13 @@ import androidx.lifecycle.lifecycleScope import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath +import com.casic.br.app.extensions.compressImage import com.casic.br.app.model.DictionaryModel import com.casic.br.app.utils.GlideLoadEngine 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.google.gson.Gson import com.google.gson.reflect.TypeToken import com.luck.picture.lib.basic.PictureSelector @@ -23,7 +25,6 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.show @@ -33,8 +34,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch -import top.zibin.luban.Luban -import top.zibin.luban.OnCompressListener import java.io.File @@ -222,22 +221,17 @@ }.collect { selectedImages.add(it) //压缩图片并上传 - Luban.with(context).load(it.realPath).ignoreBy(100) - .setTargetDir(createCompressImageDir().toString()) - .setCompressListener(object : OnCompressListener { - override fun onStart() { + it.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + //上传图片 + imageFileViewModel.uploadImage(file) + } - } - - override fun onSuccess(file: File) { - //上传图片 - imageFileViewModel.uploadImage(file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }).launch() + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index dddf2cc..4b8af60 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.SurfaceHolder import android.view.View import android.view.WindowManager @@ -18,13 +19,16 @@ import com.casic.br.app.extensions.convert2YoloResult import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar +import com.casic.br.app.extensions.isInScene import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult import com.casic.br.app.external.Yolov8ncnn 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.AlarmViewModel import com.casic.br.app.vm.ConfigViewModel +import com.casic.br.app.vm.ImageFileViewModel import com.casic.br.app.vm.InspectionViewModel import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -41,6 +45,7 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import org.opencv.core.Mat +import java.io.File class StartCheckByYoloActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { @@ -61,6 +66,8 @@ private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel + private lateinit var imageFileViewModel: ImageFileViewModel + private lateinit var alarmViewModel: AlarmViewModel private var inspectionAddress = "" private var inspectionId = "" private var mainDicModels: MutableList = ArrayList() @@ -111,6 +118,25 @@ mainDicModels = it.data } } + + imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] + imageFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val relativelyPath = it.data.toString() + +// 非专用软管-NonResidentUserHasNonDedicatedHose; +// 未佩戴安全帽-ConfinedSpaceHasNoWorkerSafelyHat; +// 未穿工服-ConfinedSpaceHasNoWorkerClothes + + alarmViewModel.uploadDetectTargetAlarm( + context, + "", + relativelyPath, + inspectionId, + detectedScene + ) + } + } } override fun initEvent() { @@ -250,19 +276,24 @@ results.add(yolo) } - if (results.isEmpty()) { - return - } - if (isDetectTarget) { binding.detectView.updateTargetPosition(results) results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] - targetSet.add(label) + if (label.isInScene(detectedScene)) { + targetSet.add(label) + //显示角标并弹框 + val message = weakReferenceHandler.obtainMessage() + message.what = 2024082902 + message.obj = label + weakReferenceHandler.sendMessage(message) + } } - //显示角标 - weakReferenceHandler.sendEmptyMessage(2024082902) } else { + if (results.isEmpty()) { + return + } + //暂停算法 yolov8ncnn.onPause() @@ -309,6 +340,23 @@ } else if (msg.what == 2024082902) { binding.tipsTagView.visibility = View.VISIBLE binding.tipsTagView.text = "${targetSet.size}" + + //弹框 + if (detectResultDialog.isShowing) { + return true + } + + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + "${msg.obj}", mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onConfirmClick(file: File) { +// imageFileViewModel.uploadImage(file) + } + }).show() + } else { + Log.d(kTag, "width: ${mat.width()}, height: ${mat.height()}") + } } return true } diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 4cc587a..fc5e052 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 @@ -248,4 +248,24 @@ return api.getDictionaryByCode(AuthenticationHelper.token, dictCode) } + /** + * 推送报警信息 + * */ + suspend fun uploadDetectTargetAlarm( + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ): String { + val param = JsonObject() + param.addProperty("alamCode", alamCode) + param.addProperty("alarmlmgPath", alarmlmgPath) + param.addProperty("inspectionld", inspectionld) + param.addProperty("scene", scene) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.uploadDetectTargetAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file 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 ebeee4c..0876851 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 @@ -9,11 +9,13 @@ import androidx.lifecycle.lifecycleScope import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath +import com.casic.br.app.extensions.compressImage import com.casic.br.app.model.DictionaryModel import com.casic.br.app.utils.GlideLoadEngine 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.google.gson.Gson import com.google.gson.reflect.TypeToken import com.luck.picture.lib.basic.PictureSelector @@ -23,7 +25,6 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.show @@ -33,8 +34,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch -import top.zibin.luban.Luban -import top.zibin.luban.OnCompressListener import java.io.File @@ -222,22 +221,17 @@ }.collect { selectedImages.add(it) //压缩图片并上传 - Luban.with(context).load(it.realPath).ignoreBy(100) - .setTargetDir(createCompressImageDir().toString()) - .setCompressListener(object : OnCompressListener { - override fun onStart() { + it.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + //上传图片 + imageFileViewModel.uploadImage(file) + } - } - - override fun onSuccess(file: File) { - //上传图片 - imageFileViewModel.uploadImage(file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }).launch() + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index dddf2cc..4b8af60 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.SurfaceHolder import android.view.View import android.view.WindowManager @@ -18,13 +19,16 @@ import com.casic.br.app.extensions.convert2YoloResult import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar +import com.casic.br.app.extensions.isInScene import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult import com.casic.br.app.external.Yolov8ncnn 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.AlarmViewModel import com.casic.br.app.vm.ConfigViewModel +import com.casic.br.app.vm.ImageFileViewModel import com.casic.br.app.vm.InspectionViewModel import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -41,6 +45,7 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import org.opencv.core.Mat +import java.io.File class StartCheckByYoloActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { @@ -61,6 +66,8 @@ private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel + private lateinit var imageFileViewModel: ImageFileViewModel + private lateinit var alarmViewModel: AlarmViewModel private var inspectionAddress = "" private var inspectionId = "" private var mainDicModels: MutableList = ArrayList() @@ -111,6 +118,25 @@ mainDicModels = it.data } } + + imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] + imageFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val relativelyPath = it.data.toString() + +// 非专用软管-NonResidentUserHasNonDedicatedHose; +// 未佩戴安全帽-ConfinedSpaceHasNoWorkerSafelyHat; +// 未穿工服-ConfinedSpaceHasNoWorkerClothes + + alarmViewModel.uploadDetectTargetAlarm( + context, + "", + relativelyPath, + inspectionId, + detectedScene + ) + } + } } override fun initEvent() { @@ -250,19 +276,24 @@ results.add(yolo) } - if (results.isEmpty()) { - return - } - if (isDetectTarget) { binding.detectView.updateTargetPosition(results) results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] - targetSet.add(label) + if (label.isInScene(detectedScene)) { + targetSet.add(label) + //显示角标并弹框 + val message = weakReferenceHandler.obtainMessage() + message.what = 2024082902 + message.obj = label + weakReferenceHandler.sendMessage(message) + } } - //显示角标 - weakReferenceHandler.sendEmptyMessage(2024082902) } else { + if (results.isEmpty()) { + return + } + //暂停算法 yolov8ncnn.onPause() @@ -309,6 +340,23 @@ } else if (msg.what == 2024082902) { binding.tipsTagView.visibility = View.VISIBLE binding.tipsTagView.text = "${targetSet.size}" + + //弹框 + if (detectResultDialog.isShowing) { + return true + } + + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + "${msg.obj}", mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onConfirmClick(file: File) { +// imageFileViewModel.uploadImage(file) + } + }).show() + } else { + Log.d(kTag, "width: ${mat.width()}, height: ${mat.height()}") + } } return true } diff --git a/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt new file mode 100644 index 0000000..0e4d29a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt @@ -0,0 +1,34 @@ +package com.casic.br.app.vm + +import android.content.Context +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class AlarmViewModel : BaseViewModel() { + private val gson by lazy { Gson() } + + fun uploadDetectTargetAlarm( + context: Context, + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ) = launch({ + val response = RetrofitServiceManager.uploadDetectTargetAlarm( + alamCode, alarmlmgPath, inspectionld, scene + ) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + "提交成功".show(context) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 4cc587a..fc5e052 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 @@ -248,4 +248,24 @@ return api.getDictionaryByCode(AuthenticationHelper.token, dictCode) } + /** + * 推送报警信息 + * */ + suspend fun uploadDetectTargetAlarm( + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ): String { + val param = JsonObject() + param.addProperty("alamCode", alamCode) + param.addProperty("alarmlmgPath", alarmlmgPath) + param.addProperty("inspectionld", inspectionld) + param.addProperty("scene", scene) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.uploadDetectTargetAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file 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 ebeee4c..0876851 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 @@ -9,11 +9,13 @@ import androidx.lifecycle.lifecycleScope import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath +import com.casic.br.app.extensions.compressImage import com.casic.br.app.model.DictionaryModel import com.casic.br.app.utils.GlideLoadEngine 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.google.gson.Gson import com.google.gson.reflect.TypeToken import com.luck.picture.lib.basic.PictureSelector @@ -23,7 +25,6 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.show @@ -33,8 +34,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch -import top.zibin.luban.Luban -import top.zibin.luban.OnCompressListener import java.io.File @@ -222,22 +221,17 @@ }.collect { selectedImages.add(it) //压缩图片并上传 - Luban.with(context).load(it.realPath).ignoreBy(100) - .setTargetDir(createCompressImageDir().toString()) - .setCompressListener(object : OnCompressListener { - override fun onStart() { + it.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + //上传图片 + imageFileViewModel.uploadImage(file) + } - } - - override fun onSuccess(file: File) { - //上传图片 - imageFileViewModel.uploadImage(file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }).launch() + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index dddf2cc..4b8af60 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.SurfaceHolder import android.view.View import android.view.WindowManager @@ -18,13 +19,16 @@ import com.casic.br.app.extensions.convert2YoloResult import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar +import com.casic.br.app.extensions.isInScene import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult import com.casic.br.app.external.Yolov8ncnn 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.AlarmViewModel import com.casic.br.app.vm.ConfigViewModel +import com.casic.br.app.vm.ImageFileViewModel import com.casic.br.app.vm.InspectionViewModel import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -41,6 +45,7 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import org.opencv.core.Mat +import java.io.File class StartCheckByYoloActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { @@ -61,6 +66,8 @@ private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel + private lateinit var imageFileViewModel: ImageFileViewModel + private lateinit var alarmViewModel: AlarmViewModel private var inspectionAddress = "" private var inspectionId = "" private var mainDicModels: MutableList = ArrayList() @@ -111,6 +118,25 @@ mainDicModels = it.data } } + + imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] + imageFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val relativelyPath = it.data.toString() + +// 非专用软管-NonResidentUserHasNonDedicatedHose; +// 未佩戴安全帽-ConfinedSpaceHasNoWorkerSafelyHat; +// 未穿工服-ConfinedSpaceHasNoWorkerClothes + + alarmViewModel.uploadDetectTargetAlarm( + context, + "", + relativelyPath, + inspectionId, + detectedScene + ) + } + } } override fun initEvent() { @@ -250,19 +276,24 @@ results.add(yolo) } - if (results.isEmpty()) { - return - } - if (isDetectTarget) { binding.detectView.updateTargetPosition(results) results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] - targetSet.add(label) + if (label.isInScene(detectedScene)) { + targetSet.add(label) + //显示角标并弹框 + val message = weakReferenceHandler.obtainMessage() + message.what = 2024082902 + message.obj = label + weakReferenceHandler.sendMessage(message) + } } - //显示角标 - weakReferenceHandler.sendEmptyMessage(2024082902) } else { + if (results.isEmpty()) { + return + } + //暂停算法 yolov8ncnn.onPause() @@ -309,6 +340,23 @@ } else if (msg.what == 2024082902) { binding.tipsTagView.visibility = View.VISIBLE binding.tipsTagView.text = "${targetSet.size}" + + //弹框 + if (detectResultDialog.isShowing) { + return true + } + + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + "${msg.obj}", mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onConfirmClick(file: File) { +// imageFileViewModel.uploadImage(file) + } + }).show() + } else { + Log.d(kTag, "width: ${mat.width()}, height: ${mat.height()}") + } } return true } diff --git a/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt new file mode 100644 index 0000000..0e4d29a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt @@ -0,0 +1,34 @@ +package com.casic.br.app.vm + +import android.content.Context +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class AlarmViewModel : BaseViewModel() { + private val gson by lazy { Gson() } + + fun uploadDetectTargetAlarm( + context: Context, + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ) = launch({ + val response = RetrofitServiceManager.uploadDetectTargetAlarm( + alamCode, alarmlmgPath, inspectionld, scene + ) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + "提交成功".show(context) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) +} \ 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 4715033..ac54f29 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 @@ -2,28 +2,67 @@ import android.app.Dialog import android.content.Context +import android.graphics.Bitmap import android.os.Bundle +import android.util.Log 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 +import com.pengxh.kt.lite.extensions.saveImage +import org.opencv.android.Utils +import org.opencv.core.Mat +import java.io.File class DetectResultDialog(context: Context) : Dialog(context) { + private val kTag = "DetectResultDialog" private val binding: DialogDetectResultBinding by binding() + private lateinit var target: String + private lateinit var mat: Mat + private lateinit var listener: OnDialogButtonClickListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initDialogLayoutParams(0.8f) binding.confirmButton.setOnClickListener { - //TODO 上传隐患 - dismiss() + //mat转图片 + val bitmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888) + Utils.matToBitmap(mat, bitmap, true) + val imagePath = "${context.createImageFileDir()}/${System.currentTimeMillis()}.png" + bitmap.saveImage(imagePath) + + //压缩 + imagePath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + listener.onConfirmClick(file) + dismiss() + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } binding.cancelButton.setOnClickListener { dismiss() } } - fun updateDialogMessage(message: String) { - binding.messageView.text = message + fun updateDialogContentView( + target: String, mat: Mat, listener: OnDialogButtonClickListener + ): DetectResultDialog { + this.target = target + this.mat = mat + this.listener = listener + binding.messageView.text = target + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick(file: File) } } \ No newline at end of file diff --git a/app/src/main/cpp/yolov8ncnn.cpp b/app/src/main/cpp/yolov8ncnn.cpp index 61df411..e6a48e7 100644 --- a/app/src/main/cpp/yolov8ncnn.cpp +++ b/app/src/main/cpp/yolov8ncnn.cpp @@ -324,11 +324,6 @@ return JNI_TRUE; } -JNIEXPORT jint JNICALL -Java_com_casic_br_app_external_Yolov8ncnn_getYoloCurrentState(JNIEnv *env, jobject thiz) { - return g_yolo->j_state; -} - JNIEXPORT jboolean JNICALL Java_com_casic_br_app_external_Yolov8ncnn_onPause(JNIEnv *env, jobject thiz) { g_yolo->j_state = 0; diff --git a/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt new file mode 100644 index 0000000..4dfe42d --- /dev/null +++ b/app/src/main/java/com/casic/br/app/callback/OnImageCompressListener.kt @@ -0,0 +1,15 @@ +package com.casic.br.operationsite.test.callback + +import java.io.File + +interface OnImageCompressListener { + /** + * Fired when a compression returns successfully, override to handle in your own code + */ + fun onSuccess(file: File) + + /** + * Fired when a compression fails to complete, override to handle in your own code + */ + fun onError(e: Throwable) +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/extensions/String.kt b/app/src/main/java/com/casic/br/app/extensions/String.kt index 8586aed..6a48428 100644 --- a/app/src/main/java/com/casic/br/app/extensions/String.kt +++ b/app/src/main/java/com/casic/br/app/extensions/String.kt @@ -1,8 +1,14 @@ package com.casic.br.app.extensions +import android.content.Context import com.casic.br.app.utils.LocaleConstant +import com.casic.br.operationsite.test.callback.OnImageCompressListener import com.google.gson.JsonParser +import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.utils.SaveKeyValues +import top.zibin.luban.Luban +import top.zibin.luban.OnCompressListener +import java.io.File /** * String扩展方法 @@ -49,4 +55,64 @@ "未知场景" } return scene +} + +fun String.isInScene(scene: String): Boolean { + when (scene) { + "配电箱" -> return listOf("配电箱", "电路图", "开关/控制设备", "电线", "跨电线").contains( + this + ) + + "有限空间作业" -> return listOf( + "安全帽", + "呼吸器", + "防护服", + "围挡设施", + "安全警示标识", + "送风设备", + "照明设备", + "对讲设备", + "三脚架", + "气体检测报警仪" + ).contains(this) + + "非居民用户" -> return listOf( + "软管", + "接头", + "喉箍", + "切断阀", + "灶具", + "熄火保护", + "燃气泄漏报警装置" + ).contains(this) + + "居民用户" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "调压站" -> return listOf("软管", "接头", "喉箍", "切断阀", "灶具", "熄火保护").contains( + this + ) + + "建筑消防" -> return listOf("消火栓箱", "水枪", "水带", "灭火器").contains(this) + } + return false +} + +fun String.compressImage(context: Context, listener: OnImageCompressListener) { + Luban.with(context).load(this) + .setTargetDir(context.createCompressImageDir().toString()) + .setCompressListener(object : OnCompressListener { + override fun onStart() { + + } + + override fun onSuccess(file: File) { + listener.onSuccess(file) + } + + override fun onError(e: Throwable) { + listener.onError(e) + } + }).launch() } \ No newline at end of file diff --git a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt index 9e1b265..d9f14e6 100644 --- a/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt +++ b/app/src/main/java/com/casic/br/app/external/Yolov8ncnn.kt @@ -42,8 +42,6 @@ surface: Surface, nativeObjAddr: Long, callBack: INativeCallback ): Boolean - external fun getYoloCurrentState(): Int - external fun onPause(): Boolean external fun onRestart(): Boolean 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 ac35be5..6eec624 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 @@ -202,4 +202,13 @@ @Header("token") token: String, @Path("dictCode") dictCode: String ): String + + /** + * 推送报警信息 + */ + @POST("/alarm/upload") + suspend fun uploadDetectTargetAlarm( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file 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 4cc587a..fc5e052 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 @@ -248,4 +248,24 @@ return api.getDictionaryByCode(AuthenticationHelper.token, dictCode) } + /** + * 推送报警信息 + * */ + suspend fun uploadDetectTargetAlarm( + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ): String { + val param = JsonObject() + param.addProperty("alamCode", alamCode) + param.addProperty("alarmlmgPath", alarmlmgPath) + param.addProperty("inspectionld", inspectionld) + param.addProperty("scene", scene) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.uploadDetectTargetAlarm(AuthenticationHelper.token, requestBody) + } } \ No newline at end of file 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 ebeee4c..0876851 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 @@ -9,11 +9,13 @@ import androidx.lifecycle.lifecycleScope import com.casic.br.app.databinding.ActivityAddHiddenTroubleBinding import com.casic.br.app.extensions.combineFilePath +import com.casic.br.app.extensions.compressImage import com.casic.br.app.model.DictionaryModel import com.casic.br.app.utils.GlideLoadEngine 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.google.gson.Gson import com.google.gson.reflect.TypeToken import com.luck.picture.lib.basic.PictureSelector @@ -23,7 +25,6 @@ import com.pengxh.kt.lite.adapter.EditableImageAdapter import com.pengxh.kt.lite.base.KotlinBaseActivity import com.pengxh.kt.lite.divider.RecyclerViewItemOffsets -import com.pengxh.kt.lite.extensions.createCompressImageDir import com.pengxh.kt.lite.extensions.dp2px import com.pengxh.kt.lite.extensions.getScreenWidth import com.pengxh.kt.lite.extensions.show @@ -33,8 +34,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch -import top.zibin.luban.Luban -import top.zibin.luban.OnCompressListener import java.io.File @@ -222,22 +221,17 @@ }.collect { selectedImages.add(it) //压缩图片并上传 - Luban.with(context).load(it.realPath).ignoreBy(100) - .setTargetDir(createCompressImageDir().toString()) - .setCompressListener(object : OnCompressListener { - override fun onStart() { + it.realPath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + //上传图片 + imageFileViewModel.uploadImage(file) + } - } - - override fun onSuccess(file: File) { - //上传图片 - imageFileViewModel.uploadImage(file) - } - - override fun onError(e: Throwable) { - e.printStackTrace() - } - }).launch() + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } } } diff --git a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt index dddf2cc..4b8af60 100644 --- a/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt +++ b/app/src/main/java/com/casic/br/app/view/StartCheckByYoloActivity.kt @@ -6,6 +6,7 @@ import android.os.Bundle import android.os.Handler import android.os.Message +import android.util.Log import android.view.SurfaceHolder import android.view.View import android.view.WindowManager @@ -18,13 +19,16 @@ import com.casic.br.app.extensions.convert2YoloResult import com.casic.br.app.extensions.getSceneByTarget import com.casic.br.app.extensions.initImmersionBar +import com.casic.br.app.extensions.isInScene import com.casic.br.app.external.INativeCallback import com.casic.br.app.external.YoloResult import com.casic.br.app.external.Yolov8ncnn 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.AlarmViewModel import com.casic.br.app.vm.ConfigViewModel +import com.casic.br.app.vm.ImageFileViewModel import com.casic.br.app.vm.InspectionViewModel import com.casic.br.app.widgets.DetectResultDialog import com.pengxh.kt.lite.base.KotlinBaseActivity @@ -41,6 +45,7 @@ import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import com.pengxh.kt.lite.widget.dialog.BottomActionSheet import org.opencv.core.Mat +import java.io.File class StartCheckByYoloActivity : KotlinBaseActivity(), SurfaceHolder.Callback, INativeCallback, Handler.Callback { @@ -61,6 +66,8 @@ private val detectResultDialog by lazy { DetectResultDialog(this) } private lateinit var inspectionViewModel: InspectionViewModel private lateinit var configViewModel: ConfigViewModel + private lateinit var imageFileViewModel: ImageFileViewModel + private lateinit var alarmViewModel: AlarmViewModel private var inspectionAddress = "" private var inspectionId = "" private var mainDicModels: MutableList = ArrayList() @@ -111,6 +118,25 @@ mainDicModels = it.data } } + + imageFileViewModel = ViewModelProvider(this)[ImageFileViewModel::class.java] + imageFileViewModel.resultModel.observe(this) { + if (it.code == 200) { + val relativelyPath = it.data.toString() + +// 非专用软管-NonResidentUserHasNonDedicatedHose; +// 未佩戴安全帽-ConfinedSpaceHasNoWorkerSafelyHat; +// 未穿工服-ConfinedSpaceHasNoWorkerClothes + + alarmViewModel.uploadDetectTargetAlarm( + context, + "", + relativelyPath, + inspectionId, + detectedScene + ) + } + } } override fun initEvent() { @@ -250,19 +276,24 @@ results.add(yolo) } - if (results.isEmpty()) { - return - } - if (isDetectTarget) { binding.detectView.updateTargetPosition(results) results.forEach { val label = LocaleConstant.CLASS_NAMES_ARRAY[it.type] - targetSet.add(label) + if (label.isInScene(detectedScene)) { + targetSet.add(label) + //显示角标并弹框 + val message = weakReferenceHandler.obtainMessage() + message.what = 2024082902 + message.obj = label + weakReferenceHandler.sendMessage(message) + } } - //显示角标 - weakReferenceHandler.sendEmptyMessage(2024082902) } else { + if (results.isEmpty()) { + return + } + //暂停算法 yolov8ncnn.onPause() @@ -309,6 +340,23 @@ } else if (msg.what == 2024082902) { binding.tipsTagView.visibility = View.VISIBLE binding.tipsTagView.text = "${targetSet.size}" + + //弹框 + if (detectResultDialog.isShowing) { + return true + } + + if (mat.width() > 0 || mat.height() > 0) { + detectResultDialog.updateDialogContentView( + "${msg.obj}", mat, + object : DetectResultDialog.OnDialogButtonClickListener { + override fun onConfirmClick(file: File) { +// imageFileViewModel.uploadImage(file) + } + }).show() + } else { + Log.d(kTag, "width: ${mat.width()}, height: ${mat.height()}") + } } return true } diff --git a/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt b/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt new file mode 100644 index 0000000..0e4d29a --- /dev/null +++ b/app/src/main/java/com/casic/br/app/vm/AlarmViewModel.kt @@ -0,0 +1,34 @@ +package com.casic.br.app.vm + +import android.content.Context +import com.casic.br.app.extensions.getResponseCode +import com.casic.br.app.extensions.getResponseMessage +import com.casic.br.app.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.pengxh.kt.lite.base.BaseViewModel +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show + +class AlarmViewModel : BaseViewModel() { + private val gson by lazy { Gson() } + + fun uploadDetectTargetAlarm( + context: Context, + alamCode: String, + alarmlmgPath: String, + inspectionld: String, + scene: String + ) = launch({ + val response = RetrofitServiceManager.uploadDetectTargetAlarm( + alamCode, alarmlmgPath, inspectionld, scene + ) + val responseCode = response.getResponseCode() + if (responseCode == 200) { + "提交成功".show(context) + } else { + response.getResponseMessage().show(context) + } + }, { + it.printStackTrace() + }) +} \ 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 4715033..ac54f29 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 @@ -2,28 +2,67 @@ import android.app.Dialog import android.content.Context +import android.graphics.Bitmap import android.os.Bundle +import android.util.Log 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 +import com.pengxh.kt.lite.extensions.saveImage +import org.opencv.android.Utils +import org.opencv.core.Mat +import java.io.File class DetectResultDialog(context: Context) : Dialog(context) { + private val kTag = "DetectResultDialog" private val binding: DialogDetectResultBinding by binding() + private lateinit var target: String + private lateinit var mat: Mat + private lateinit var listener: OnDialogButtonClickListener override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) initDialogLayoutParams(0.8f) binding.confirmButton.setOnClickListener { - //TODO 上传隐患 - dismiss() + //mat转图片 + val bitmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888) + Utils.matToBitmap(mat, bitmap, true) + val imagePath = "${context.createImageFileDir()}/${System.currentTimeMillis()}.png" + bitmap.saveImage(imagePath) + + //压缩 + imagePath.compressImage(context, object : OnImageCompressListener { + override fun onSuccess(file: File) { + Log.d(kTag, "absolutePath: ${file.absolutePath}") + listener.onConfirmClick(file) + dismiss() + } + + override fun onError(e: Throwable) { + e.printStackTrace() + } + }) } binding.cancelButton.setOnClickListener { dismiss() } } - fun updateDialogMessage(message: String) { - binding.messageView.text = message + fun updateDialogContentView( + target: String, mat: Mat, listener: OnDialogButtonClickListener + ): DetectResultDialog { + this.target = target + this.mat = mat + this.listener = listener + binding.messageView.text = target + return this + } + + interface OnDialogButtonClickListener { + fun onConfirmClick(file: File) } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_detect_result.xml b/app/src/main/res/layout/dialog_detect_result.xml index cd8a077..eb1876b 100644 --- a/app/src/main/res/layout/dialog_detect_result.xml +++ b/app/src/main/res/layout/dialog_detect_result.xml @@ -12,7 +12,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:drawablePadding="@dimen/dp_5" - android:text="发现疑似隐患" + android:text="发现目标对象" android:textColor="@color/white" android:textSize="@dimen/sp_16" app:drawableStartCompat="@drawable/ic_warning" /> @@ -21,8 +21,8 @@ android:id="@+id/messageView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginHorizontal="@dimen/dp_30" - android:paddingVertical="@dimen/dp_15" + android:paddingVertical="@dimen/dp_5" + android:layout_marginVertical="15dp" android:textColor="@color/white" android:textColorHint="@color/white" android:textSize="@dimen/sp_16" /> @@ -30,7 +30,6 @@