增加心跳处理人脸数据增减
This commit is contained in:
@@ -93,4 +93,6 @@ dependencies {
|
|||||||
implementation(libs.androidx.activity.ktx)
|
implementation(libs.androidx.activity.ktx)
|
||||||
implementation(libs.androidx.fragment.ktx)
|
implementation(libs.androidx.fragment.ktx)
|
||||||
// implementation(libs.adapter.coroutines)
|
// 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.ActivityLoginFaceBinding
|
||||||
import com.sw.platecabinet.databinding.ItemTitleTimeBinding
|
import com.sw.platecabinet.databinding.ItemTitleTimeBinding
|
||||||
import com.sw.platecabinet.model.response.EquipmentUserInfo
|
import com.sw.platecabinet.model.response.EquipmentUserInfo
|
||||||
|
import com.sw.platecabinet.network.task.TaskManager
|
||||||
import com.sw.platecabinet.utils.PermissionHelper
|
import com.sw.platecabinet.utils.PermissionHelper
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
|
||||||
@@ -79,6 +80,9 @@ class LoginByFaceActivity : BaseActivity<ActivityLoginFaceBinding>(),
|
|||||||
val intent = Intent(this, LoginByPwdActivity::class.java)
|
val intent = Intent(this, LoginByPwdActivity::class.java)
|
||||||
startActivity(intent)
|
startActivity(intent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: 测试请求
|
||||||
|
TaskManager.startTask()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkCameraPermission() {
|
private fun checkCameraPermission() {
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ object ApiClient {
|
|||||||
// private const val BASE_URL = "http://192.168.1.8:9092"
|
// private const val BASE_URL = "http://192.168.1.8:9092"
|
||||||
private const val TIME_OUT = 30L // 超时时间(秒)
|
private const val TIME_OUT = 30L // 超时时间(秒)
|
||||||
|
|
||||||
private val okHttpClient = OkHttpClient.Builder()
|
val okHttpClient = OkHttpClient.Builder()
|
||||||
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
|
.connectTimeout(TIME_OUT, TimeUnit.SECONDS)
|
||||||
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
|
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
|
||||||
.writeTimeout(TIME_OUT, TimeUnit.SECONDS)
|
.writeTimeout(TIME_OUT, TimeUnit.SECONDS)
|
||||||
|
|||||||
@@ -63,4 +63,12 @@ interface ApiService {
|
|||||||
*/
|
*/
|
||||||
@POST("/shuwei-zhct/swEquipmentRelUser/findByPlateNumber")
|
@POST("/shuwei-zhct/swEquipmentRelUser/findByPlateNumber")
|
||||||
suspend fun findByPlateNumber(@Body param: BindParam): ApiResponse<EquipmentUserInfo>
|
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> {
|
suspend fun findByPlateNumber(param: BindParam): ApiResponse<EquipmentUserInfo> {
|
||||||
return safeApiCall { apiService.findByPlateNumber(param) }
|
return safeApiCall { apiService.findByPlateNumber(param) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取人脸增量数据
|
||||||
|
*
|
||||||
|
* @param timeDate 时间戳(毫秒级)
|
||||||
|
*/
|
||||||
|
suspend fun getHeartbeatInterface(timeDate: Long): ApiResponse<List<UserFaceModel>> {
|
||||||
|
return safeApiCall { apiService.getHeartbeatInterface(timeDate) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.sw.plate.utils.arcface;
|
package com.sw.plate.utils.arcface;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import com.arcsoft.face.FaceEngine;
|
import com.arcsoft.face.FaceEngine;
|
||||||
@@ -79,4 +80,26 @@ public class FaceApi {
|
|||||||
// List<FacePreviewInfo> facePreviewInfoList = recognizeViewModel.onPreviewFrame(nv21, true);
|
// List<FacePreviewInfo> facePreviewInfoList = recognizeViewModel.onPreviewFrame(nv21, true);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void deleteByUserName(String userName) {
|
||||||
|
FaceDao faceDao = FaceDatabase.getInstance(App.getContext()).faceDao();
|
||||||
|
faceDao.deleteFaceById(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long insert(FaceEntity entity) {
|
||||||
|
if (entity == null) {
|
||||||
|
return 0L;
|
||||||
|
}
|
||||||
|
FaceDao faceDao = FaceDatabase.getInstance(App.getContext()).faceDao();
|
||||||
|
return faceDao.insert(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FaceEntity queryByUserName(String userName) {
|
||||||
|
if (TextUtils.isEmpty(userName)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
FaceDao faceDao = FaceDatabase.getInstance(App.getContext()).faceDao();
|
||||||
|
return faceDao.queryByUserName(userName);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,4 +88,7 @@ public interface FaceDao {
|
|||||||
|
|
||||||
@Query("UPDATE sqlite_sequence SET seq = 0 WHERE name ='face'")
|
@Query("UPDATE sqlite_sequence SET seq = 0 WHERE name ='face'")
|
||||||
void resetId();
|
void resetId();
|
||||||
|
|
||||||
|
@Query("SELECT * FROM face WHERE user_name = :userName limit 1")
|
||||||
|
FaceEntity queryByUserName(String userName);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ public class FaceEntity implements Parcelable {
|
|||||||
@ColumnInfo(name = "register_time")
|
@ColumnInfo(name = "register_time")
|
||||||
private long registerTime;
|
private long registerTime;
|
||||||
|
|
||||||
|
|
||||||
public FaceEntity(String userName, String imagePath, byte[] featureData) {
|
public FaceEntity(String userName, String imagePath, byte[] featureData) {
|
||||||
this.userName = userName;
|
this.userName = userName;
|
||||||
this.imagePath = imagePath;
|
this.imagePath = imagePath;
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ public class FaceServer {
|
|||||||
faceRegisterInfoList = new ArrayList<>();
|
faceRegisterInfoList = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FaceEngine getFaceEngine() {
|
||||||
|
return faceEngine;
|
||||||
|
}
|
||||||
|
|
||||||
public static FaceServer getInstance() {
|
public static FaceServer getInstance() {
|
||||||
if (faceServer == null) {
|
if (faceServer == null) {
|
||||||
synchronized (FaceServer.class) {
|
synchronized (FaceServer.class) {
|
||||||
|
|||||||
Reference in New Issue
Block a user