refactor(glass): 使用 GlassMediaServiceHelper 替换直接的 GlassSdk 调用

- 在 SprayingActivity 中使用 GlassMediaServiceHelper.takePhoto 替换 GlassSdk.getGlassMediaService().takePhoto
- 在 SprayingActivity 中使用 GlassMediaServiceHelper.addPhotoCallback 和 removePhotoCallback
- 在 SprayingOCRActivity 中实现相同的 GlassMediaServiceHelper 替换
- 在 SprayingResultActivity 中实现相同的 GlassMediaServiceHelper 替换
- 为 SprayingFinishActivity 和 SprayingOCRActivity 添加图片资源清理
- 在 SprayingResultActivity 的 submit 操作后启动 TaskListActivity
- 创建 GlassMediaServiceHelper 单例类封装媒体服务操作
这个提交包含在:
徐勤民 2026-04-14 23:09:51 +08:00
父节点 88ff873959
当前提交 719eb1cd7c
共有 5 个文件被更改,包括 68 次插入22 次删除

查看文件

@ -0,0 +1,37 @@
package com.nova.brain.glass.helper
import com.rokid.security.glass3.open.sdk.GlassSdk
import com.rokid.security.system.server.media.callback.PhotoFileCallback
object GlassMediaServiceHelper {
@Volatile
private var mediaService: Any? = null
private fun service(): Any? {
val cached = mediaService
if (cached != null) {
return cached
}
return GlassSdk.getGlassMediaService()?.also {
mediaService = it
}
}
fun takePhoto(resolution: Int, path: String) {
val service = service() ?: return
service.javaClass.getMethod("takePhoto", Int::class.javaPrimitiveType, String::class.java)
.invoke(service, resolution, path)
}
fun addPhotoCallback(callback: PhotoFileCallback) {
val service = service() ?: return
service.javaClass.getMethod("addPhotoCallback", PhotoFileCallback::class.java)
.invoke(service, callback)
}
fun removePhotoCallback(callback: PhotoFileCallback) {
val service = service() ?: return
service.javaClass.getMethod("removePhotoCallback", PhotoFileCallback::class.java)
.invoke(service, callback)
}
}

查看文件

@ -5,12 +5,12 @@ import android.os.Environment
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.nova.brain.glass.R import com.nova.brain.glass.R
import com.nova.brain.glass.databinding.ActivitySprayingBinding import com.nova.brain.glass.databinding.ActivitySprayingBinding
import com.nova.brain.glass.helper.GlassMediaServiceHelper
import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdListener
import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.OfflineCmdServiceHelper
import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.helper.SprayingPhotoManager
import com.nova.brain.glass.model.ItemItem import com.nova.brain.glass.model.ItemItem
import com.nova.brain.glass.viewmodel.SprayingVM 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.glass3.sdk.base.data.media.PhotoResolution
import com.rokid.security.system.server.media.callback.PhotoFileCallback import com.rokid.security.system.server.media.callback.PhotoFileCallback
import com.xuqm.base.adapter.BasePagedAdapter import com.xuqm.base.adapter.BasePagedAdapter
@ -56,8 +56,7 @@ class SprayingActivity :
val publicPicturesDir = val publicPicturesDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val file = File(publicPicturesDir, fileName) val file = File(publicPicturesDir, fileName)
GlassSdk.getGlassMediaService() GlassMediaServiceHelper.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
} }
private val photoCallbackId = UUID.randomUUID().toString() private val photoCallbackId = UUID.randomUUID().toString()
@ -105,14 +104,14 @@ class SprayingActivity :
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.addPhotoCallback(mPhotoFileCallback)
OfflineCmdServiceHelper.addOnLineListener(listener) OfflineCmdServiceHelper.addOnLineListener(listener)
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
} }
private var isPhoto = false private var isPhoto = false

查看文件

@ -46,6 +46,9 @@ class SprayingFinishActivity :
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
binding.photo1.setImageDrawable(null)
binding.photo2.setImageDrawable(null)
binding.photo3.setImageDrawable(null)
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
} }
@ -59,16 +62,16 @@ class SprayingFinishActivity :
imageView.doOnLayout { imageView.doOnLayout {
val targetWidth = imageView.width.coerceAtLeast(1) val targetWidth = imageView.width.coerceAtLeast(1)
val targetHeight = imageView.height.coerceAtLeast(1) val targetHeight = imageView.height.coerceAtLeast(1)
imageDecodeExecutor.execute { imageDecodeExecutor.execute {
val bitmap = BitmapDecodeHelper.decodeSampledBitmap(path, targetWidth, targetHeight) val bitmap = BitmapDecodeHelper.decodeSampledBitmap(path, targetWidth, targetHeight)
runOnUiThread { runOnUiThread {
if (isFinishing || isDestroyed) { if (isFinishing || isDestroyed) {
return@runOnUiThread return@runOnUiThread
}
imageView.setImageBitmap(bitmap)
} }
imageView.setImageBitmap(bitmap)
} }
} }
}
} }
} }
} }

查看文件

@ -9,13 +9,12 @@ import androidx.recyclerview.widget.RecyclerView
import com.nova.brain.glass.R import com.nova.brain.glass.R
import com.nova.brain.glass.databinding.ActivitySprayingOcrBinding import com.nova.brain.glass.databinding.ActivitySprayingOcrBinding
import com.nova.brain.glass.helper.BitmapDecodeHelper import com.nova.brain.glass.helper.BitmapDecodeHelper
import com.nova.brain.glass.helper.GlassMediaServiceHelper
import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdListener
import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.OfflineCmdServiceHelper
import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.helper.SprayingPhotoManager
import com.nova.brain.glass.model.ItemItem import com.nova.brain.glass.model.ItemItem
import com.nova.brain.glass.viewmodel.SprayingOCRVM import com.nova.brain.glass.viewmodel.SprayingOCRVM
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.glass3.sdk.base.data.media.PhotoResolution
import com.rokid.security.system.server.media.callback.PhotoFileCallback import com.rokid.security.system.server.media.callback.PhotoFileCallback
import com.xuqm.base.adapter.BasePagedAdapter import com.xuqm.base.adapter.BasePagedAdapter
@ -61,7 +60,7 @@ class SprayingOCRActivity :
val fileName = "test_${System.currentTimeMillis()}.png" val fileName = "test_${System.currentTimeMillis()}.png"
val publicPicturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) val publicPicturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val file = File(publicPicturesDir, fileName) val file = File(publicPicturesDir, fileName)
GlassSdk.getGlassMediaService()?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath) GlassMediaServiceHelper.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
} }
private val photoCallbackId = UUID.randomUUID().toString() private val photoCallbackId = UUID.randomUUID().toString()
private var resultCountdown: CountDownTimer? = null private var resultCountdown: CountDownTimer? = null
@ -111,13 +110,18 @@ class SprayingOCRActivity :
super.onResume() super.onResume()
OfflineCmdServiceHelper.addOnLineListener(listener) OfflineCmdServiceHelper.addOnLineListener(listener)
GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.addPhotoCallback(mPhotoFileCallback)
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
resultCountdown?.cancel() resultCountdown?.cancel()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
}
override fun onDestroy() {
super.onDestroy()
binding.content.setImageDrawable(null)
} }
private var isPhoto = false private var isPhoto = false

查看文件

@ -11,12 +11,12 @@ import androidx.recyclerview.widget.RecyclerView
import com.nova.brain.glass.R import com.nova.brain.glass.R
import com.nova.brain.glass.databinding.ActivitySprayingResultBinding import com.nova.brain.glass.databinding.ActivitySprayingResultBinding
import com.nova.brain.glass.helper.BitmapDecodeHelper import com.nova.brain.glass.helper.BitmapDecodeHelper
import com.nova.brain.glass.helper.GlassMediaServiceHelper
import com.nova.brain.glass.helper.OfflineCmdListener import com.nova.brain.glass.helper.OfflineCmdListener
import com.nova.brain.glass.helper.OfflineCmdServiceHelper import com.nova.brain.glass.helper.OfflineCmdServiceHelper
import com.nova.brain.glass.helper.SprayingPhotoManager import com.nova.brain.glass.helper.SprayingPhotoManager
import com.nova.brain.glass.model.ItemItem import com.nova.brain.glass.model.ItemItem
import com.nova.brain.glass.viewmodel.SprayingResultVM import com.nova.brain.glass.viewmodel.SprayingResultVM
import com.rokid.security.glass3.open.sdk.GlassSdk
import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution import com.rokid.security.glass3.sdk.base.data.media.PhotoResolution
import com.rokid.security.system.server.media.callback.PhotoFileCallback import com.rokid.security.system.server.media.callback.PhotoFileCallback
import com.xuqm.base.adapter.BasePagedAdapter import com.xuqm.base.adapter.BasePagedAdapter
@ -70,6 +70,9 @@ class SprayingResultActivity :
SprayingFinishActivity.ACTION_SUBMIT -> { SprayingFinishActivity.ACTION_SUBMIT -> {
SprayingPhotoManager.clear() SprayingPhotoManager.clear()
startActivity(Intent(this, TaskListActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
})
finish() finish()
} }
} }
@ -108,8 +111,7 @@ class SprayingResultActivity :
val publicPicturesDir = val publicPicturesDir =
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val file = File(publicPicturesDir, fileName) val file = File(publicPicturesDir, fileName)
GlassSdk.getGlassMediaService() GlassMediaServiceHelper.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
?.takePhoto(PhotoResolution.RESOLUTION_480P, file.absolutePath)
} }
fun rest() { fun rest() {
@ -185,15 +187,16 @@ class SprayingResultActivity :
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
OfflineCmdServiceHelper.addOnLineListener(listener) OfflineCmdServiceHelper.addOnLineListener(listener)
GlassSdk.getGlassMediaService()?.addPhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.addPhotoCallback(mPhotoFileCallback)
} }
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
OfflineCmdServiceHelper.removeOnLineListener(listener) OfflineCmdServiceHelper.removeOnLineListener(listener)
GlassSdk.getGlassMediaService()?.removePhotoCallback(mPhotoFileCallback) GlassMediaServiceHelper.removePhotoCallback(mPhotoFileCallback)
} }
override fun onDestroy() { override fun onDestroy() {
super.onDestroy() super.onDestroy()
binding.iv.setImageDrawable(null)
} }
private var isPhoto = false private var isPhoto = false