增加心跳处理人脸数据增减
This commit is contained in:
@@ -93,4 +93,6 @@ dependencies {
|
||||
implementation(libs.androidx.activity.ktx)
|
||||
implementation(libs.androidx.fragment.ktx)
|
||||
// implementation(libs.adapter.coroutines)
|
||||
|
||||
implementation("androidx.work:work-runtime-ktx:2.8.1")
|
||||
}
|
||||
@@ -31,6 +31,7 @@ import com.sw.platecabinet.R
|
||||
import com.sw.platecabinet.databinding.ActivityLoginFaceBinding
|
||||
import com.sw.platecabinet.databinding.ItemTitleTimeBinding
|
||||
import com.sw.platecabinet.model.response.EquipmentUserInfo
|
||||
import com.sw.platecabinet.network.task.TaskManager
|
||||
import com.sw.platecabinet.utils.PermissionHelper
|
||||
import timber.log.Timber
|
||||
|
||||
@@ -79,6 +80,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
||||
val intent = Intent(this, LoginByPwdActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
// TODO: 测试请求
|
||||
TaskManager.startTask()
|
||||
}
|
||||
|
||||
private fun checkCameraPermission() {
|
||||
|
||||
@@ -16,7 +16,7 @@ object ApiClient {
|
||||
// private const val BASE_URL = "http://192.168.1.8:9092"
|
||||
private const val TIME_OUT = 30L // 超时时间(秒)
|
||||
|
||||
private val okHttpClient = OkHttpClient.Builder()
|
||||
val okHttpClient = OkHttpClient.Builder()
|
||||
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
|
||||
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
|
||||
.writeTimeout(TIME_OUT, TimeUnit.SECONDS)
|
||||
|
||||
@@ -63,4 +63,12 @@ interface ApiService {
|
||||
*/
|
||||
@POST("/shuwei-zhct/swEquipmentRelUser/findByPlateNumber")
|
||||
suspend fun findByPlateNumber(@Body param: BindParam): ApiResponse<EquipmentUserInfo>
|
||||
|
||||
/**
|
||||
* 获取人脸增量数据
|
||||
*
|
||||
* @param timeDate 时间戳(毫秒级)
|
||||
*/
|
||||
@GET("/shuwei-zhct/scales/getHeartbeatInterface")
|
||||
suspend fun getHeartbeatInterface(@Query("timeDate") timeDate: Long): ApiResponse<List<UserFaceModel>>
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
package com.sw.platecabinet.network.task
|
||||
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import androidx.work.CoroutineWorker
|
||||
import androidx.work.WorkerParameters
|
||||
import com.arcsoft.face.FaceEngine
|
||||
import com.sw.inbound.utils.GsonUtils
|
||||
import com.sw.plate.utils.Base64
|
||||
import com.sw.plate.utils.arcface.FaceApi
|
||||
import com.sw.plate.utils.arcface.facedb.entity.FaceEntity
|
||||
import com.sw.plate.utils.arcface.faceserver.FaceServer
|
||||
import com.sw.platecabinet.network.ApiClient
|
||||
import com.sw.platecabinet.repository.RemoteRepository
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
class HeartBeatTask(appContext: Context, workerParams: WorkerParameters) :
|
||||
CoroutineWorker(appContext, workerParams) {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "HeartBeatTask"
|
||||
}
|
||||
|
||||
override suspend fun doWork(): Result {
|
||||
return try {
|
||||
// 执行后台任务逻辑
|
||||
performSync()
|
||||
|
||||
TaskManager.startTask()
|
||||
|
||||
Result.success()
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
Result.retry()
|
||||
}
|
||||
}
|
||||
|
||||
private val repository: RemoteRepository by lazy {
|
||||
RemoteRepository(ApiClient.apiService)
|
||||
}
|
||||
|
||||
private val faceApi: FaceApi = FaceApi()
|
||||
|
||||
private suspend fun performSync() {
|
||||
withContext(Dispatchers.IO) {
|
||||
val timestamp = System.currentTimeMillis()
|
||||
// val timestamp = 1757063902000
|
||||
val resp = repository.getHeartbeatInterface(timestamp)
|
||||
Log.d(TAG, "performSync: ${GsonUtils.toJson(resp)}")
|
||||
val list = resp.data
|
||||
if (list.isNullOrEmpty()) {
|
||||
return@withContext
|
||||
}
|
||||
val faceServer = FaceServer.getInstance()
|
||||
val faceEngine: FaceEngine? = faceServer.faceEngine
|
||||
|
||||
list.forEach {
|
||||
try {
|
||||
if (it.faceType == "0") {
|
||||
if (it.userId.isNullOrBlank().not()) {
|
||||
//userId非空,根据userId删除人脸数据
|
||||
faceApi.deleteByUserName(it.userId)
|
||||
faceEngine?.removeFaceFeature(it.userId.toInt())
|
||||
}
|
||||
} else if (it.faceType == "1") {
|
||||
//新增人脸数据
|
||||
val featureData = Base64.decode(it.faceFeatureString)
|
||||
val insertEntity = FaceEntity(it.userId, null, featureData)
|
||||
val faceId = faceApi.insert(insertEntity)
|
||||
insertEntity.faceId = faceId
|
||||
faceServer.registerFaceFeatureInfoFromDb( insertEntity, faceEngine)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package com.sw.platecabinet.network.task
|
||||
|
||||
import androidx.work.ExistingWorkPolicy
|
||||
import androidx.work.OneTimeWorkRequestBuilder
|
||||
import androidx.work.WorkManager
|
||||
import com.sw.plate.App
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
object TaskManager {
|
||||
private const val TASK_NAME = "SmartPlateCabinetTask"
|
||||
|
||||
fun startTask() {
|
||||
val nextRequest = OneTimeWorkRequestBuilder<HeartBeatTask>()
|
||||
.setInitialDelay(3, TimeUnit.MINUTES)
|
||||
// .setInputData(inputData)
|
||||
.build()
|
||||
WorkManager.getInstance(App.getContext())
|
||||
.enqueueUniqueWork(TASK_NAME, ExistingWorkPolicy.REPLACE, nextRequest)
|
||||
}
|
||||
|
||||
fun cancelTask() {
|
||||
WorkManager.getInstance(App.getContext())
|
||||
.cancelUniqueWork(TASK_NAME)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -76,4 +76,13 @@ class RemoteRepository constructor(
|
||||
suspend fun findByPlateNumber(param: BindParam): ApiResponse<EquipmentUserInfo> {
|
||||
return safeApiCall { apiService.findByPlateNumber(param) }
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取人脸增量数据
|
||||
*
|
||||
* @param timeDate 时间戳(毫秒级)
|
||||
*/
|
||||
suspend fun getHeartbeatInterface(timeDate: Long): ApiResponse<List<UserFaceModel>> {
|
||||
return safeApiCall { apiService.getHeartbeatInterface(timeDate) }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user