From 989ce90cff745a33f9c14f26c1f703f2f96a0e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Tue, 14 Apr 2026 20:34:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(spraying):=20=E6=B7=BB=E5=8A=A0=E5=96=B7?= =?UTF-8?q?=E6=B6=82=E5=8A=9F=E8=83=BD=E7=9A=84=E6=8B=8D=E7=85=A7=E5=92=8C?= =?UTF-8?q?OCR=E8=AF=86=E5=88=AB=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在OfflineCmdServiceHelper中新增喷涂相关的语音命令 - 为InspectionActivity、ReviewActivity和SprayingActivity添加屏幕常亮功能 - 新增SprayingOCRActivity用于OCR识别和图像显示 - 实现拍照功能,包括语音控制拍照和手动点击拍照 - 集成GlassSdk媒体服务进行照片拍摄和回调处理 - 添加照片预览和重拍功能 - 更新布局文件以支持拍照提示和图像显示 - 移除MainActivity并将启动目标改为SprayingOCRActivity - 清理WelcomeActivity中的调试日志输出 --- app/src/main/AndroidManifest.xml | 2 +- .../glass/helper/OfflineCmdServiceHelper.kt | 9 ++ .../nova/brain/glass/ui/InspectionActivity.kt | 1 + .../com/nova/brain/glass/ui/MainActivity.kt | 22 --- .../com/nova/brain/glass/ui/ReviewActivity.kt | 1 + .../nova/brain/glass/ui/SprayingActivity.kt | 79 ++++++++++- .../brain/glass/ui/SprayingOCRActivity.kt | 129 ++++++++++++++++++ .../nova/brain/glass/ui/WelcomeActivity.kt | 2 - app/src/main/res/layout/activity_spraying.xml | 8 ++ .../main/res/layout/activity_spraying_ocr.xml | 58 ++++++++ app/src/main/res/layout/activity_welcome.xml | 5 - 11 files changed, 283 insertions(+), 33 deletions(-) delete mode 100644 app/src/main/java/com/nova/brain/glass/ui/MainActivity.kt create mode 100644 app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt create mode 100644 app/src/main/res/layout/activity_spraying_ocr.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 579012e..7c9c9c0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -82,7 +82,7 @@ android:name=".ui.SprayingActivity" android:exported="false" /> () { - override fun fullscreen(): Boolean = true - override fun getLayoutId(): Int = R.layout.activity_main - - private val vm: MainVM by viewModels() - - override fun initView(savedInstanceState: Bundle?) { - super.initView(savedInstanceState) - - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt index 28fce33..53b7585 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/ReviewActivity.kt @@ -37,6 +37,7 @@ class ReviewActivity : BaseListFormLayoutNormalActivity() { +class SprayingActivity : + BaseListFormLayoutNormalActivity() { override fun getLayoutId(): Int = R.layout.activity_spraying override fun fullscreen(): Boolean = true @@ -26,28 +36,91 @@ class SprayingActivity : BaseListFormLayoutNormalActivity { finish() } + + "开始", "拍照", "开始拍照", "开始任务" -> { + runOnUiThread { + binding.hint.text = "拍照中,请稍后..." + } + isPhoto = true + takePhoto() + } } } } + + } + + fun takePhoto() { + val fileName = "test_${System.currentTimeMillis()}.png" + val publicPicturesDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + val file = File(publicPicturesDir, fileName) + GlassSdk.getGlassMediaService() + ?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath) + } + + private val photoCallbackId = UUID.randomUUID().toString() + + private val mPhotoFileCallback = object : PhotoFileCallback.Stub() { + override fun onTakePhoto(path: String) { + LogHelper.d("onTakePhoto-->path = $path") + } + + override fun getCallbackId(): String { + return photoCallbackId + } + + override fun onTakePhotoV2(path: String?, width: Int, height: Int) { + LogHelper.d("width:$width--height:$height") + if (path == null) { + if (isPhoto) { + isPhoto = false + takePhoto() + } else { + runOnUiThread { + binding.hint.text = "单击或语音输入“开始”,进入下一步" + } + "相机异常".showMessage() + } + } else { + startActivity(Intent(this@SprayingActivity, SprayingOCRActivity::class.java).apply { + putExtra("path", path) + }) + finish() +// runOnUiThread { +// binding.hint.text = "单击或语音输入“开始”,进入下一步" +// binding.iv.setImageBitmap(BitmapFactory.decodeFile(path)) +// } + } + } } + override fun initData() { super.initData() + window.addFlags(android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) OfflineCmdServiceHelper.addOnLineListener(listener) + GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) } override fun onDestroy() { super.onDestroy() OfflineCmdServiceHelper.removeOnLineListener(listener) + GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) } + private var isPhoto = false private val adapter = object : CommonPagedAdapter(R.layout.item_photo) { override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { holder .setClickListener(R.id.photo) { when (item.text) { "拍照" -> { - + runOnUiThread { + binding.hint.text = "拍照中,请稍后..." + } + isPhoto = true + takePhoto() } } } diff --git a/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt new file mode 100644 index 0000000..fd65ae8 --- /dev/null +++ b/app/src/main/java/com/nova/brain/glass/ui/SprayingOCRActivity.kt @@ -0,0 +1,129 @@ +package com.nova.brain.glass.ui + +import android.R.attr.path +import android.graphics.BitmapFactory +import android.os.Environment +import android.view.WindowManager +import androidx.recyclerview.widget.RecyclerView +import com.nova.brain.glass.R +import com.nova.brain.glass.databinding.ActivitySprayingBinding +import com.nova.brain.glass.databinding.ActivitySprayingOcrBinding +import com.nova.brain.glass.helper.OfflineCmdListener +import com.nova.brain.glass.helper.OfflineCmdServiceHelper +import com.nova.brain.glass.model.ItemItem +import com.nova.brain.glass.viewmodel.SprayingVM +import com.rokid.security.glass3.open.sdk.GlassSdk +import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution +import com.rokid.security.system.server.media.callback.PhotoFileCallback +import com.xuqm.base.adapter.BasePagedAdapter +import com.xuqm.base.adapter.CommonPagedAdapter +import com.xuqm.base.adapter.ViewHolder +import com.xuqm.base.common.FileHelper +import com.xuqm.base.common.LogHelper +import com.xuqm.base.extensions.showMessage +import com.xuqm.base.ui.BaseListFormLayoutNormalActivity +import java.io.File +import java.util.UUID + +class SprayingOCRActivity : + BaseListFormLayoutNormalActivity() { + override fun getLayoutId(): Int = R.layout.activity_spraying_ocr + override fun fullscreen(): Boolean = true + + override fun getRecyclerOrientation(): Int = RecyclerView.VERTICAL + + private val listener = object : OfflineCmdListener { + override fun onOfflineCmd(cmd: String) { + runOnUiThread { + when (cmd) { + "退出", "返回", "退回" -> { + finish() + } + "开始", "拍照", "开始拍照", "开始任务", "重拍", "重新拍", "在拍一次" -> { + runOnUiThread { + binding.hint.text = "拍照中,请稍后..." + } + isPhoto = true + takePhoto() + } + } + } + } + + } + + fun takePhoto() { + val fileName = "test_${System.currentTimeMillis()}.png" + val publicPicturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + val file = File(publicPicturesDir, fileName) + GlassSdk.getGlassMediaService()?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath) + } + private val photoCallbackId = UUID.randomUUID().toString() + + private val mPhotoFileCallback = object : PhotoFileCallback.Stub() { + override fun onTakePhoto(path: String) { + LogHelper.d("onTakePhoto-->path = $path") + } + + override fun getCallbackId(): String { + return photoCallbackId + } + + override fun onTakePhotoV2(path: String?, width: Int, height: Int) { + LogHelper.d("width:$width--height:$height") + if (path == null) { + if (isPhoto) { + isPhoto = false + takePhoto() + } else { + runOnUiThread { + binding.hint.text = "单击或语音输入“重拍”,可重新拍摄" + } + "相机异常".showMessage() + } + } else { + runOnUiThread { + binding.hint.text = "单击或语音输入“重拍”,可重新拍摄" + binding.content.setImageBitmap(BitmapFactory.decodeFile(path)) + } + } + } + } + + + override fun initData() { + super.initData() + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + OfflineCmdServiceHelper.addOnLineListener(listener) + GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) + intent.getStringExtra("path")?.apply { + binding.content.setImageBitmap(BitmapFactory.decodeFile(this)) + } + } + + override fun onDestroy() { + super.onDestroy() + OfflineCmdServiceHelper.removeOnLineListener(listener) + GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) + } + + private var isPhoto = false + private val adapter = object : CommonPagedAdapter(R.layout.item_photo) { + override fun convert(holder: ViewHolder, item: ItemItem, position: Int) { + holder + .setClickListener(R.id.photo) { + when (item.text) { + "拍照" -> { + runOnUiThread { + binding.hint.text = "拍照中,请稍后..." + } + isPhoto = true + takePhoto() + } + } + } + } + } + + override fun adapter(): BasePagedAdapter = adapter +} diff --git a/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt b/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt index 79681c3..6b58cfa 100644 --- a/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt +++ b/app/src/main/java/com/nova/brain/glass/ui/WelcomeActivity.kt @@ -39,13 +39,11 @@ class WelcomeActivity : BaseActivity() { override fun onResume() { super.onResume() - LogHelper.d(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>") OfflineCmdServiceHelper.addOnLineListener(offlineCmdListener) } override fun onPause() { super.onPause() - LogHelper.d("---------------------------") OfflineCmdServiceHelper.removeOnLineListener(offlineCmdListener) } diff --git a/app/src/main/res/layout/activity_spraying.xml b/app/src/main/res/layout/activity_spraying.xml index 22d1805..d6fd41c 100644 --- a/app/src/main/res/layout/activity_spraying.xml +++ b/app/src/main/res/layout/activity_spraying.xml @@ -94,6 +94,7 @@ + diff --git a/app/src/main/res/layout/activity_spraying_ocr.xml b/app/src/main/res/layout/activity_spraying_ocr.xml new file mode 100644 index 0000000..0070e4b --- /dev/null +++ b/app/src/main/res/layout/activity_spraying_ocr.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_welcome.xml b/app/src/main/res/layout/activity_welcome.xml index 59ec4b3..49e9707 100644 --- a/app/src/main/res/layout/activity_welcome.xml +++ b/app/src/main/res/layout/activity_welcome.xml @@ -8,18 +8,13 @@ android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@color/app_color_black" - android:layout_alignParentTop="true" android:textColor="#ff3FFF5F" android:textSize="19sp" android:text="您可以说:Nova,我的任务有哪些?" - android:fontFamily="Source Han Sans" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" - android:gravity="left|top" - android:alpha="1" />