Compare commits
2
Commits
fc326a8f42
...
e93550a24b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e93550a24b | ||
|
|
fde2cd0544 |
@@ -5,15 +5,12 @@ import android.graphics.Outline
|
|||||||
import android.graphics.Typeface
|
import android.graphics.Typeface
|
||||||
import android.hardware.display.DisplayManager
|
import android.hardware.display.DisplayManager
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewOutlineProvider
|
import android.view.ViewOutlineProvider
|
||||||
import android.widget.AdapterView
|
import android.widget.AdapterView
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import androidx.activity.enableEdgeToEdge
|
|
||||||
import androidx.activity.viewModels
|
import androidx.activity.viewModels
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import androidx.camera.core.CameraSelector
|
import androidx.camera.core.CameraSelector
|
||||||
import androidx.camera.core.ImageAnalysis
|
import androidx.camera.core.ImageAnalysis
|
||||||
import androidx.camera.core.ImageCapture
|
import androidx.camera.core.ImageCapture
|
||||||
@@ -36,7 +33,6 @@ import com.sw.dualscreen.presentation.SecondaryScreenPresentation
|
|||||||
import com.sw.dualscreen.sdk.SensorScaleUtils
|
import com.sw.dualscreen.sdk.SensorScaleUtils
|
||||||
import com.sw.dualscreen.utils.GlideUtils
|
import com.sw.dualscreen.utils.GlideUtils
|
||||||
import com.sw.dualscreen.view.CustomBottomSheetDialog
|
import com.sw.dualscreen.view.CustomBottomSheetDialog
|
||||||
import com.sw.dualscreen.view.CustomDialog
|
|
||||||
import com.sw.dualscreen.viewmodel.BaseViewModel
|
import com.sw.dualscreen.viewmodel.BaseViewModel
|
||||||
import com.sw.dualscreen.viewmodel.UserViewModel
|
import com.sw.dualscreen.viewmodel.UserViewModel
|
||||||
import com.sw.plate.utils.ToastUtils
|
import com.sw.plate.utils.ToastUtils
|
||||||
@@ -50,7 +46,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
private val viewModel by viewModels<UserViewModel>()
|
private val viewModel by viewModels<UserViewModel>()
|
||||||
private var imageCapture: ImageCapture? = null
|
private var imageCapture: ImageCapture? = null
|
||||||
private var isAnalyzing = true // 控制是否进行图像分析
|
private var isAnalyzing = true // 控制是否进行图像分析
|
||||||
private lateinit var presentation: SecondaryScreenPresentation
|
private var presentation: SecondaryScreenPresentation? = null
|
||||||
private val executor = Executors.newSingleThreadExecutor()
|
private val executor = Executors.newSingleThreadExecutor()
|
||||||
private lateinit var adapter: GenericItemAdapter<FoodInfo, ItemFoodInfoBinding>
|
private lateinit var adapter: GenericItemAdapter<FoodInfo, ItemFoodInfoBinding>
|
||||||
private var checkedItem: FoodInfo? = null
|
private var checkedItem: FoodInfo? = null
|
||||||
@@ -78,7 +74,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
|
|
||||||
private fun initData() {
|
private fun initData() {
|
||||||
viewModel.getEquipmentToken()
|
viewModel.getEquipmentToken()
|
||||||
presentation.step1()
|
presentation?.step1()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initView() {
|
private fun initView() {
|
||||||
@@ -110,7 +106,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
position: Int,
|
position: Int,
|
||||||
id: Long
|
id: Long
|
||||||
) {
|
) {
|
||||||
presentation.updateMealPickupMode(position)
|
presentation?.updateMealPickupMode(position)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onNothingSelected(parent: AdapterView<*>?) {}
|
override fun onNothingSelected(parent: AdapterView<*>?) {}
|
||||||
@@ -133,7 +129,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
|
|
||||||
fun updateCurrentFood(foodInfo: FoodInfo?) {
|
fun updateCurrentFood(foodInfo: FoodInfo?) {
|
||||||
if (foodInfo != null) {
|
if (foodInfo != null) {
|
||||||
presentation.updateFood(foodInfo)
|
presentation?.updateFood(foodInfo)
|
||||||
binding.tvFoodName.text = foodInfo.foodName
|
binding.tvFoodName.text = foodInfo.foodName
|
||||||
binding.previewView.visibility = View.GONE
|
binding.previewView.visibility = View.GONE
|
||||||
binding.ivImg.visibility = View.VISIBLE
|
binding.ivImg.visibility = View.VISIBLE
|
||||||
@@ -141,7 +137,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
if (TextUtils.isEmpty(imgUrl)) {
|
if (TextUtils.isEmpty(imgUrl)) {
|
||||||
takePhoto { imgUri ->
|
takePhoto { imgUri ->
|
||||||
GlideUtils.loadRoundCornerImage(this, imgUri, binding.ivImg, 12)
|
GlideUtils.loadRoundCornerImage(this, imgUri, binding.ivImg, 12)
|
||||||
presentation.updateFood(foodInfo.copy(imgUrl = imgUri.toString()))
|
presentation?.updateFood(foodInfo.copy(imgUrl = imgUri.toString()))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GlideUtils.loadRoundCornerImage(this, foodInfo.imgUrl, binding.ivImg, 12)
|
GlideUtils.loadRoundCornerImage(this, foodInfo.imgUrl, binding.ivImg, 12)
|
||||||
@@ -167,7 +163,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
}
|
}
|
||||||
SensorScaleUtils.startScale { weight ->
|
SensorScaleUtils.startScale { weight ->
|
||||||
Timber.d("registerDataChange weight = $weight")
|
Timber.d("registerDataChange weight = $weight")
|
||||||
presentation.updateWeight(weight)
|
presentation?.updateWeight(weight)
|
||||||
if (weight > 0.0) {
|
if (weight > 0.0) {
|
||||||
if (canIdentify) {
|
if (canIdentify) {
|
||||||
canIdentify = false
|
canIdentify = false
|
||||||
@@ -226,7 +222,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
// 仅在步骤1时传递
|
// 仅在步骤1时传递
|
||||||
if (isAnalyzing) {
|
if (isAnalyzing) {
|
||||||
val bitmap = imageProxy.toBitmap()
|
val bitmap = imageProxy.toBitmap()
|
||||||
presentation.updateImage(bitmap) // 更新副屏
|
presentation?.updateImage(bitmap) // 更新副屏
|
||||||
}
|
}
|
||||||
imageProxy.close() // 必须关闭以释放资源
|
imageProxy.close() // 必须关闭以释放资源
|
||||||
}
|
}
|
||||||
@@ -266,9 +262,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
if (isAnalyzing) return
|
if (isAnalyzing) return
|
||||||
isAnalyzing = true
|
isAnalyzing = true
|
||||||
imageAnalysis?.setAnalyzer(executor) { imageProxy ->
|
imageAnalysis?.setAnalyzer(executor) { imageProxy ->
|
||||||
if (presentation.currentStep == 1) {
|
if (presentation?.currentStep == 1) {
|
||||||
val bitmap = imageProxy.toBitmap()
|
val bitmap = imageProxy.toBitmap()
|
||||||
presentation.updateImage(bitmap)
|
presentation?.updateImage(bitmap)
|
||||||
}
|
}
|
||||||
imageProxy.close()
|
imageProxy.close()
|
||||||
}
|
}
|
||||||
@@ -360,19 +356,21 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
|
|||||||
viewModel = viewModel,
|
viewModel = viewModel,
|
||||||
recognizeViewModel = viewModels<RecognizeViewModel>().value
|
recognizeViewModel = viewModels<RecognizeViewModel>().value
|
||||||
)
|
)
|
||||||
presentation.setStepChangeCallback { step ->
|
presentation!!.setStepChangeCallback { step ->
|
||||||
if (step == 1) {
|
if (step == 1) {
|
||||||
updateCurrentFood(null)
|
updateCurrentFood(null)
|
||||||
bottomSheetDialog?.dismiss()
|
bottomSheetDialog?.dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
presentation.show()
|
presentation!!.show()
|
||||||
|
} else {
|
||||||
|
ToastUtils.showToast("获取副屏失败")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
SensorScaleUtils.closeScale()
|
SensorScaleUtils.closeScale()
|
||||||
presentation.dismiss()
|
presentation?.dismiss()
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ class SecondaryScreenPresentation(
|
|||||||
private val debouncer = Debouncer(500)
|
private val debouncer = Debouncer(500)
|
||||||
private var recognitionTime: Long = 0L // 人脸识别时的时间
|
private var recognitionTime: Long = 0L // 人脸识别时的时间
|
||||||
private var recognitionWeight: Double = 0.0 // 人脸识别时的重量
|
private var recognitionWeight: Double = 0.0 // 人脸识别时的重量
|
||||||
private var lastFaceTrackId: Int = 0 // 上一次的人脸信息
|
private var lastFaceTrackId: Int = -1 // 上一次的人脸信息
|
||||||
private var mealPickupMode: Int = 0 // 取餐模式 0 即放即取 1 余量取餐
|
private var mealPickupMode: Int = 0 // 取餐模式 0 即放即取 1 余量取餐
|
||||||
|
|
||||||
// 当前步骤
|
// 当前步骤
|
||||||
@@ -176,6 +176,7 @@ class SecondaryScreenPresentation(
|
|||||||
binding.flPreview.visibility = View.VISIBLE
|
binding.flPreview.visibility = View.VISIBLE
|
||||||
binding.ivImg.visibility = View.VISIBLE
|
binding.ivImg.visibility = View.VISIBLE
|
||||||
binding.flFace.visibility = View.INVISIBLE
|
binding.flFace.visibility = View.INVISIBLE
|
||||||
|
binding.tvFaceTip.visibility = View.GONE
|
||||||
pauseCamera()
|
pauseCamera()
|
||||||
binding.tvBottomTip.visibility = View.VISIBLE
|
binding.tvBottomTip.visibility = View.VISIBLE
|
||||||
itemUserNutritionBinding.clNutritionData.visibility = View.GONE
|
itemUserNutritionBinding.clNutritionData.visibility = View.GONE
|
||||||
@@ -750,7 +751,7 @@ class SecondaryScreenPresentation(
|
|||||||
* @param facePreviewInfoList RGB画面的实时人脸信息
|
* @param facePreviewInfoList RGB画面的实时人脸信息
|
||||||
*/
|
*/
|
||||||
private fun drawPreviewInfo(facePreviewInfoList: MutableList<FacePreviewInfo?>) {
|
private fun drawPreviewInfo(facePreviewInfoList: MutableList<FacePreviewInfo?>) {
|
||||||
// Timber.d("drawPreviewInfo facePreviewInfoList = ${facePreviewInfoList.size}, rgbFaceRectTransformer = ${rgbFaceRectTransformer != null}")
|
Timber.d("drawPreviewInfo facePreviewInfoList = ${facePreviewInfoList.size}, rgbFaceRectTransformer = ${rgbFaceRectTransformer != null}")
|
||||||
if (rgbFaceRectTransformer != null) {
|
if (rgbFaceRectTransformer != null) {
|
||||||
val rgbDrawInfoList: MutableList<DrawInfo?>? = recognizeViewModel.getDrawInfo(
|
val rgbDrawInfoList: MutableList<DrawInfo?>? = recognizeViewModel.getDrawInfo(
|
||||||
facePreviewInfoList,
|
facePreviewInfoList,
|
||||||
@@ -762,9 +763,9 @@ class SecondaryScreenPresentation(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (facePreviewInfoList.isEmpty() || (lastFaceTrackId != facePreviewInfoList[0]!!.trackId)) {
|
if (facePreviewInfoList.isEmpty() || (lastFaceTrackId != facePreviewInfoList[0]!!.trackId)) {
|
||||||
if (lastFaceTrackId != 0) {
|
if (lastFaceTrackId != -1) {
|
||||||
Timber.i("$lastFaceTrackId 用户离开")
|
Timber.i("$lastFaceTrackId 用户离开")
|
||||||
lastFaceTrackId = 0
|
lastFaceTrackId = -1
|
||||||
postUserData()
|
postUserData()
|
||||||
if (mealPickupMode == 0) {
|
if (mealPickupMode == 0) {
|
||||||
step1()
|
step1()
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package com.sw.dualscreen.utils
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.DisplayMetrics
|
||||||
|
import android.view.WindowManager
|
||||||
|
import timber.log.Timber
|
||||||
|
import kotlin.math.sqrt
|
||||||
|
|
||||||
|
object ScreenUtils {
|
||||||
|
fun printScreenInfo(context: Context, tag: String) {
|
||||||
|
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
|
||||||
|
val displayMetrics = DisplayMetrics()
|
||||||
|
|
||||||
|
// 方法 1:获取应用可用区域(排除系统装饰,如状态栏)
|
||||||
|
windowManager.defaultDisplay.getMetrics(displayMetrics)
|
||||||
|
|
||||||
|
// 方法 2:获取整个屏幕的物理尺寸(包括状态栏和导航栏)
|
||||||
|
// windowManager.defaultDisplay.getRealMetrics(displayMetrics)
|
||||||
|
|
||||||
|
val screenWidthPx = displayMetrics.widthPixels // 屏幕宽度(像素)
|
||||||
|
val screenHeightPx = displayMetrics.heightPixels // 屏幕高度(像素)
|
||||||
|
val density = displayMetrics.density // 逻辑密度(1.0 = mdpi, 2.0 = xhdpi)
|
||||||
|
val densityDpi = displayMetrics.densityDpi // 屏幕 DPI 分类(160 = mdpi, 320 = xhdpi)
|
||||||
|
val xdpi = displayMetrics.xdpi // 物理水平 DPI
|
||||||
|
val ydpi = displayMetrics.ydpi // 物理垂直 DPI
|
||||||
|
|
||||||
|
// 打印信息
|
||||||
|
Timber.d("$tag 屏幕信息")
|
||||||
|
Timber.d("屏幕分辨率(像素): ${screenWidthPx}x${screenHeightPx}")
|
||||||
|
Timber.d("逻辑密度: $density")
|
||||||
|
Timber.d("DPI 分类: $densityDpi")
|
||||||
|
Timber.d("物理 DPI (x/y): $xdpi / $ydpi")
|
||||||
|
|
||||||
|
// 计算屏幕物理尺寸(英寸)
|
||||||
|
val screenWidthInches = screenWidthPx / xdpi
|
||||||
|
val screenHeightInches = screenHeightPx / ydpi
|
||||||
|
val diagonalInches = sqrt(
|
||||||
|
(screenWidthInches * screenWidthInches + screenHeightInches * screenHeightInches).toDouble()
|
||||||
|
)
|
||||||
|
Timber.d(
|
||||||
|
"屏幕物理尺寸(英寸): %.1f x %.1f (对角线: %.1f\")".format(
|
||||||
|
screenWidthInches, screenHeightInches, diagonalInches
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 172 KiB |
@@ -82,7 +82,7 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_marginTop="566dp"
|
android:layout_marginTop="586dp"
|
||||||
android:text="请正视屏幕"
|
android:text="请正视屏幕"
|
||||||
android:textColor="#ffece7d0"
|
android:textColor="#ffece7d0"
|
||||||
android:textSize="24sp"
|
android:textSize="24sp"
|
||||||
@@ -121,6 +121,7 @@
|
|||||||
android:layout_height="486dp"
|
android:layout_height="486dp"
|
||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
android:background="@drawable/rounded_border_transparent"
|
android:background="@drawable/rounded_border_transparent"
|
||||||
|
android:orientation="vertical"
|
||||||
android:gravity="center">
|
android:gravity="center">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
|||||||
Reference in New Issue
Block a user