feat(app): 重构应用为发盘机app,界面布局优化、移除无用代码
- 将应用名称从 SmartPlateCabinet 更改为 SmartTakePlate - 更新初始化页面背景图片为 bg_collect_page3 - 替换 View 组件为 Space 组件以优化布局权重分配 - 调整取盘按钮尺寸和文字大小提升用户体验 - 简化人脸识别登录页面布局结构 - 更新应用图标资源为 logo_launcher - 移除未使用的权限声明和活动注册 - 优化人脸识别相关 API 接口调用 - 调整时间显示逻辑仅保留时间部分 - 移除扫描枪事件监听相关功能代码 - 重构人脸识别数据更新逻辑 - 移除余额不足对话框相关代码
This commit is contained in:
@@ -7,12 +7,15 @@ import android.content.Intent
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.Point
|
||||
import android.hardware.Camera
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.util.DisplayMetrics
|
||||
import android.provider.Settings
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewTreeObserver
|
||||
import android.widget.FrameLayout
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.arcsoft.face.ErrorInfo
|
||||
@@ -39,24 +42,21 @@ import com.sw.plate.utils.arcface.facedb.entity.FaceEntity
|
||||
import com.sw.plate.utils.arcface.model.UserFaceInfo
|
||||
import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel
|
||||
import com.sw.plate.utils.arcface.viewmodel.RecognizeViewModel.REGISTER_STATUS_READY
|
||||
import com.sw.platecabinet.MyApp
|
||||
import com.sw.platecabinet.R
|
||||
import com.sw.platecabinet.databinding.ActivityLoginFaceBinding
|
||||
import com.sw.platecabinet.databinding.ItemTitleTimeBinding
|
||||
import com.sw.platecabinet.dialog.CustomDialog
|
||||
import com.sw.platecabinet.ext.clickWithDebounce
|
||||
import com.sw.platecabinet.ext.gone
|
||||
import com.sw.platecabinet.ext.visible
|
||||
import com.sw.platecabinet.model.response.EquipmentUserInfo
|
||||
import com.sw.platecabinet.model.response.UserFaceModel
|
||||
import com.sw.platecabinet.utils.BitmapSaver
|
||||
import com.sw.platecabinet.utils.CountDownUtil
|
||||
import com.sw.platecabinet.utils.Debouncer
|
||||
import com.sw.platecabinet.utils.LogFileUtil
|
||||
import com.sw.platecabinet.utils.PermissionHelper
|
||||
import com.sw.platecabinet.utils.PlateUtils
|
||||
import com.sw.platecabinet.utils.RegisterCallbackHandler
|
||||
import com.sw.platecabinet.utils.SoundPoolUtil
|
||||
import com.sw.platecabinet.utils.SpTool
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@@ -73,13 +73,6 @@ import java.util.concurrent.atomic.AtomicBoolean
|
||||
class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
ViewTreeObserver.OnGlobalLayoutListener {
|
||||
|
||||
private val CAMERA_PERMISSION_REQUEST_CODE = 100
|
||||
private val REQUIRED_PERMISSIONS: Array<String> = arrayOf(
|
||||
Manifest.permission.CAMERA,
|
||||
Manifest.permission.WRITE_EXTERNAL_STORAGE,
|
||||
Manifest.permission.READ_EXTERNAL_STORAGE
|
||||
)
|
||||
|
||||
override fun inflateViewBinding(): ActivityLoginFaceBinding {
|
||||
return ActivityLoginFaceBinding.inflate(layoutInflater)
|
||||
}
|
||||
@@ -132,22 +125,53 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
resetRecognizeState()
|
||||
}
|
||||
}
|
||||
|
||||
// 检查相机权限
|
||||
|
||||
private fun checkCameraPermission() {
|
||||
Timber.i("checkCameraPermission")
|
||||
val permissionHelper =
|
||||
PermissionHelper.with(this, REQUIRED_PERMISSIONS, CAMERA_PERMISSION_REQUEST_CODE)
|
||||
.onGranted {
|
||||
loadLogInfo("checkCameraPermission 权限已允许")
|
||||
// 权限已授予
|
||||
recognizeViewModel.init()
|
||||
initRgbCamera()
|
||||
resumeCamera()
|
||||
}
|
||||
.build()
|
||||
registerPermissionHelper(permissionHelper)
|
||||
permissionHelper.checkAndRequest()
|
||||
val hasCameraPermission = ContextCompat.checkSelfPermission(
|
||||
this,
|
||||
Manifest.permission.CAMERA
|
||||
) == android.content.pm.PackageManager.PERMISSION_GRANTED
|
||||
|
||||
if (hasCameraPermission) {
|
||||
// 权限已授予
|
||||
loadLogInfo("checkCameraPermission 权限已允许")
|
||||
recognizeViewModel.init()
|
||||
initRgbCamera()
|
||||
resumeCamera()
|
||||
} else {
|
||||
// 无权限,请求相机权限
|
||||
requestCameraPermission()
|
||||
}
|
||||
}
|
||||
|
||||
private fun requestCameraPermission() {
|
||||
requestPermission(Manifest.permission.CAMERA) { isGranted ->
|
||||
if (isGranted) {
|
||||
// 权限已授予
|
||||
loadLogInfo("checkCameraPermission 权限已允许")
|
||||
recognizeViewModel.init()
|
||||
initRgbCamera()
|
||||
resumeCamera()
|
||||
} else {
|
||||
// 权限被拒绝
|
||||
loadLogInfo("checkCameraPermission 权限被拒绝")
|
||||
CustomDialog(
|
||||
activity = this,
|
||||
content = "请在设置中开启相机权限",
|
||||
onConfirm = {
|
||||
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
|
||||
data = Uri.fromParts("package", context.packageName, null)
|
||||
}
|
||||
startActivity(intent) {
|
||||
checkCameraPermission()
|
||||
}
|
||||
}, onCancel = {
|
||||
|
||||
}).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||||
@@ -319,11 +343,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
loadLogInfo("collectFace,recognizeUserId 识别成功但 userId 为空,忽略")
|
||||
return
|
||||
}
|
||||
|
||||
loadLogInfo(
|
||||
"collectFace,recognizeUserId 识别成功 userId=$userId, time=${DateTimeUtils.getDateTimeString()}"
|
||||
)
|
||||
|
||||
loadLogInfo("collectFace,recognizeUserId 识别成功 userId=$userId, time=${DateTimeUtils.getDateTimeString()}")
|
||||
// 成功后必须重置状态
|
||||
retryFailCount = 0
|
||||
isCollecting.set(false)
|
||||
@@ -363,57 +383,41 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
resumeCamera()
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询餐盘数据
|
||||
*/
|
||||
private fun getPlateData(block: (List<EquipmentUserInfo>) -> Unit) {
|
||||
MyApp.plateList?.let {
|
||||
block(it)
|
||||
}
|
||||
}
|
||||
|
||||
private var currentPlateInfo: EquipmentUserInfo? = null
|
||||
private var plateEnable = false
|
||||
|
||||
/**
|
||||
* 检测有无餐盘
|
||||
*/
|
||||
private fun checkHasPlate(block: (Boolean) -> Unit) {
|
||||
showWaitingDialog("检测餐盘中,请稍候……")
|
||||
binding.root.postDelayed({
|
||||
hideWaitingDialog()
|
||||
block(true)
|
||||
}, 1500)
|
||||
}
|
||||
|
||||
/**
|
||||
* 打开餐盘柜
|
||||
*/
|
||||
private fun openPlate(userId: String?) {
|
||||
if (plateEnable.not()) return
|
||||
loadLogInfo("collectFace,openPlate: userId=$userId")
|
||||
getPlateData { items ->
|
||||
loadLogInfo("collectFace,openPlate: items:${Gson().toJson(items)}")
|
||||
// 未查询到当前用户,查询第一个未绑定的餐盘
|
||||
val item = items.firstOrNull { it.plateNumber.isNullOrEmpty().not() }
|
||||
loadLogInfo("collectFace,openPlate: item2:${item}")
|
||||
if (item == null) {
|
||||
//暂无餐盘
|
||||
checkHasPlate { hasPlate ->
|
||||
if (hasPlate.not()) {
|
||||
//暂无餐盘,请联系管理人员
|
||||
loadLogInfo("collectFace,openPlate: 暂无餐盘,请联系管理人员,isCollectFace=$isCollectFace")
|
||||
//ToastUtils.showToast("暂无餐盘,请联系管理人员")
|
||||
SoundPoolUtil.getInstance().play(NO_PLATE_REMIND, 0)
|
||||
goInitActivity()
|
||||
return@getPlateData
|
||||
return@checkHasPlate
|
||||
}
|
||||
// if (tempUserId != currentUserId) {
|
||||
//取餐盘
|
||||
SoundPoolUtil.getInstance().play(RECOGNIZE_SUCCESS, 0)
|
||||
// } else {
|
||||
// SoundPoolUtil.getInstance().play(COLLECT_SUCCESS, 0)
|
||||
// }
|
||||
loadLogInfo("collectFace,openPlate: item3:${item}")
|
||||
item.faceId = userId
|
||||
item.updateTime = DateTimeUtils.getDateTimeString()
|
||||
item.plateNumber = null
|
||||
plateEnable = false
|
||||
openDebouncer.debounce {
|
||||
//打开柜子
|
||||
PlateUtils.open(this, item.equipmentBoxCode, false) {
|
||||
goInitActivity()
|
||||
}
|
||||
recognizeCountDownUtil.cancelCountDown()
|
||||
//调用发盘方法
|
||||
PlateUtils.open(this, "", false) {
|
||||
goInitActivity()
|
||||
}
|
||||
currentPlateInfo = item
|
||||
MyApp.plateList = items
|
||||
SpTool.savePlateData(items)
|
||||
plateEnable = false
|
||||
recognizeCountDownUtil.cancelCountDown()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -457,43 +461,45 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
displayOrientation: Int,
|
||||
scale: Float
|
||||
): ViewGroup.LayoutParams {
|
||||
val layoutParams = previewView.layoutParams
|
||||
val measuredWidth = previewView.measuredWidth
|
||||
val measuredHeight = previewView.measuredHeight
|
||||
var ratio = (previewSize.height.toFloat()) / previewSize.width.toFloat()
|
||||
if (ratio > 1) {
|
||||
ratio = 1 / ratio
|
||||
}
|
||||
if (displayOrientation % 180 == 0) {
|
||||
layoutParams.width = measuredWidth
|
||||
layoutParams.height = (measuredWidth * ratio).toInt()
|
||||
} else {
|
||||
layoutParams.height = measuredHeight
|
||||
layoutParams.width = (measuredHeight * ratio).toInt()
|
||||
}
|
||||
if (scale < 1f) {
|
||||
val rgbParam = rgbPreview.layoutParams
|
||||
layoutParams.width = (rgbParam.width * scale).toInt()
|
||||
layoutParams.height = (rgbParam.height * scale).toInt()
|
||||
} else {
|
||||
layoutParams.width = (layoutParams.width * scale).toInt()
|
||||
layoutParams.height = (layoutParams.height * scale).toInt()
|
||||
}
|
||||
|
||||
val metrics = DisplayMetrics()
|
||||
windowManager.defaultDisplay.getMetrics(metrics)
|
||||
|
||||
if (layoutParams.width >= metrics.widthPixels) {
|
||||
val viewRatio = layoutParams.width / (metrics.widthPixels.toFloat())
|
||||
layoutParams.width = (layoutParams.width / viewRatio).toInt()
|
||||
layoutParams.height = (layoutParams.height / viewRatio).toInt()
|
||||
}
|
||||
if (layoutParams.height >= metrics.heightPixels) {
|
||||
val viewRatio = layoutParams.height / (metrics.heightPixels.toFloat())
|
||||
layoutParams.width = (layoutParams.width / viewRatio).toInt()
|
||||
layoutParams.height = (layoutParams.height / viewRatio).toInt()
|
||||
}
|
||||
// val layoutParams = previewView.layoutParams
|
||||
// val measuredWidth = previewView.measuredWidth
|
||||
// val measuredHeight = previewView.measuredHeight
|
||||
// var ratio = (previewSize.height.toFloat()) / previewSize.width.toFloat()
|
||||
// if (ratio > 1) {
|
||||
// ratio = 1 / ratio
|
||||
// }
|
||||
// if (displayOrientation % 180 == 0) {
|
||||
// layoutParams.width = measuredWidth
|
||||
// layoutParams.height = (measuredWidth * ratio).toInt()
|
||||
// } else {
|
||||
// layoutParams.height = measuredHeight
|
||||
// layoutParams.width = (measuredHeight * ratio).toInt()
|
||||
// }
|
||||
// if (scale < 1f) {
|
||||
// val rgbParam = rgbPreview.layoutParams
|
||||
// layoutParams.width = (rgbParam.width * scale).toInt()
|
||||
// layoutParams.height = (rgbParam.height * scale).toInt()
|
||||
// } else {
|
||||
// layoutParams.width = (layoutParams.width * scale).toInt()
|
||||
// layoutParams.height = (layoutParams.height * scale).toInt()
|
||||
// }
|
||||
//
|
||||
// val metrics = DisplayMetrics()
|
||||
// windowManager.defaultDisplay.getMetrics(metrics)
|
||||
//
|
||||
// if (layoutParams.width >= metrics.widthPixels) {
|
||||
// val viewRatio = layoutParams.width / (metrics.widthPixels.toFloat())
|
||||
// layoutParams.width = (layoutParams.width / viewRatio).toInt()
|
||||
// layoutParams.height = (layoutParams.height / viewRatio).toInt()
|
||||
// }
|
||||
// if (layoutParams.height >= metrics.heightPixels) {
|
||||
// val viewRatio = layoutParams.height / (metrics.heightPixels.toFloat())
|
||||
// layoutParams.width = (layoutParams.width / viewRatio).toInt()
|
||||
// layoutParams.height = (layoutParams.height / viewRatio).toInt()
|
||||
// }
|
||||
|
||||
val layoutParams = FrameLayout.LayoutParams(776, 582);
|
||||
Timber.d("adjustPreviewViewSize,${layoutParams.width},${layoutParams.height}}")
|
||||
previewView.setLayoutParams(layoutParams)
|
||||
faceRectView.setLayoutParams(layoutParams)
|
||||
return layoutParams
|
||||
@@ -534,11 +540,11 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
previewSizeRgb.height,
|
||||
layoutParams.width,
|
||||
layoutParams.height,
|
||||
90,
|
||||
0,
|
||||
cameraId,
|
||||
isMirror,
|
||||
true,
|
||||
true
|
||||
false,
|
||||
false
|
||||
)
|
||||
|
||||
recognizeViewModel.onRgbCameraOpened(camera)
|
||||
@@ -557,7 +563,6 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
drawPreviewInfo(facePreviewInfoList)
|
||||
}
|
||||
if (facePreviewInfoList.isNullOrEmpty()) {
|
||||
currentPlateInfo = null
|
||||
currentUserId = null
|
||||
userFaceInfo = null
|
||||
binding.btnCollect.tag = ""
|
||||
@@ -601,6 +606,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
.additionalRotation(0) // 角度
|
||||
.previewSize(recognizeViewModel.loadPreviewSize())
|
||||
.specificCameraId(previewConfig.rgbCameraId)
|
||||
// .isMirror(true)
|
||||
.isMirror(true)
|
||||
.previewOn(binding.dualCameraTexturePreviewRgb)
|
||||
.cameraListener(cameraListener)
|
||||
@@ -821,7 +827,7 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
}
|
||||
|
||||
private fun addUserFace(faceData: String, imageFile: File) {
|
||||
settingViewModel.addUserFace(faceData, imageFile) { status, faceModel ->
|
||||
userViewModel.addUserFace(faceData, imageFile) { status, faceModel ->
|
||||
loadLogInfo("collectFace,saveFaceInfo: ----------12,人脸数据发送完成时间:${DateTimeUtils.getDateTimeString()},结果:$status-----------")
|
||||
if (status.not()) {
|
||||
ToastUtils.showToast("新增数据失败")
|
||||
|
||||
Reference in New Issue
Block a user