package com.doumee.keyCabinet.ui.main;
|
|
import android.app.ActivityManager;
|
import android.app.AlarmManager;
|
import android.app.PendingIntent;
|
import android.content.Context;
|
import android.content.Intent;
|
import android.graphics.Bitmap;
|
import android.graphics.drawable.BitmapDrawable;
|
import android.hardware.Camera;
|
import android.hardware.usb.UsbDevice;
|
import android.hardware.usb.UsbManager;
|
import android.os.Bundle;
|
import android.os.Handler;
|
import android.os.Message;
|
import android.text.SpannableString;
|
import android.text.Spanned;
|
import android.text.TextUtils;
|
import android.text.style.TextAppearanceSpan;
|
import android.util.DisplayMetrics;
|
import android.view.Gravity;
|
import android.view.LayoutInflater;
|
import android.view.View;
|
import android.view.ViewGroup;
|
import android.widget.PopupWindow;
|
import android.widget.RelativeLayout;
|
import android.widget.TextView;
|
import android.widget.Toast;
|
|
import androidx.annotation.NonNull;
|
import androidx.annotation.Nullable;
|
import androidx.lifecycle.Observer;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
|
import com.bigkoo.convenientbanner.holder.CBViewHolderCreator;
|
import com.bumptech.glide.Glide;
|
import com.bumptech.glide.load.DataSource;
|
import com.bumptech.glide.load.engine.GlideException;
|
import com.bumptech.glide.request.RequestListener;
|
import com.bumptech.glide.request.target.SimpleTarget;
|
import com.bumptech.glide.request.target.Target;
|
import com.bumptech.glide.request.transition.Transition;
|
import com.doumee.keyCabinet.BuildConfig;
|
import com.doumee.keyCabinet.base.BannerPicResponsePara;
|
import com.doumee.keyCabinet.bean.FaceUserBean;
|
import com.doumee.keyCabinet.bean.LoginBean;
|
import com.doumee.keyCabinet.databinding.MainActivityBinding;
|
import com.doumee.keyCabinet.event.GetFacesEvent;
|
import com.doumee.keyCabinet.event.HeartEvent;
|
import com.doumee.keyCabinet.event.KeyDoorEvent;
|
import com.doumee.keyCabinet.event.KeyResultEvent;
|
import com.doumee.keyCabinet.event.KeyStatusListener;
|
import com.doumee.keyCabinet.event.OpenGridEvent;
|
import com.doumee.keyCabinet.event.ReLoginEvent;
|
import com.doumee.keyCabinet.event.TimeClockEvent;
|
import com.doumee.keyCabinet.ui.face.ActivationActivity;
|
import com.doumee.keyCabinet.ui.face.FaceActivity;
|
import com.doumee.keyCabinet.ui.guide.GuideActivity;
|
import com.doumee.keyCabinet.ui.keyCabinet.ChangeUrlActivity;
|
import com.doumee.keyCabinet.ui.keyCabinet.KeyCabinetActivity;
|
import com.doumee.keyCabinet.ui.keyCabinet.ManageLoginActivity;
|
import com.doumee.keyCabinet.ui.service.FaceUpdateService;
|
import com.doumee.keyCabinet.ui.service.HeartbeatService;
|
import com.doumee.keyCabinet.ui.face.AddFaceActivity;
|
import com.doumee.keyCabinet.ui.face.ErrActivity;
|
import com.doumee.keyCabinet.ui.face.UserInfoManager;
|
import com.doumee.keyCabinet.ui.face.UserManagerActivity;
|
import com.doumee.keyCabinet.ui.view.BannerViewImageHolder;
|
import com.doumee.keyCabinet.utils.BraceletLogUtils;
|
import com.doumee.keyCabinet.utils.CrashHandler;
|
import com.doumee.keyCabinet.utils.LMobileInfo;
|
import com.doumee.keyCabinet.utils.TimeUtils;
|
import com.doumee.keyCabinet.utils.face.FaceSDKManager;
|
import com.doumee.keyCabinet.utils.face.FaceUtils;
|
import com.doumee.keyCabinet.utils.face.GateConfigUtils;
|
import com.doumee.keyCabinet.utils.face.ImportFileManager;
|
import com.doumee.keyCabinet.utils.face.RegisterConfigUtils;
|
import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig;
|
import com.doumee.keyCabinet.utils.i485.SerialPortModel;
|
import com.doumee.keyCabinet.utils.i485.SerialPortReadObserver;
|
import com.doumee.keyCabinet.utils.i485.SportUtils;
|
import com.doumee.keyCabinet.utils.update.PermissionUtils;
|
import com.doumee.keyCabinet.utils.update.PermissiondDialog;
|
import com.doumee.keyCabinet.utils.update.UpdateUtil;
|
import com.doumee.lib_coremodel.bean.event.ActionEventData;
|
import com.doumee.keyCabinet.MApplication;
|
import com.doumee.keyCabinet.R;
|
import com.doumee.keyCabinet.base.MyBaseActivity;
|
import com.doumee.keyCabinet.bean.MemberBean;
|
import com.doumee.keyCabinet.utils.AdListResponseParam;
|
import com.doumee.lib_coremodel.http.utils.GsonTools;
|
import com.doumee.lib_coremodel.util.SpUtil;
|
import com.doumee.lib_coremodel.util.StringUtil;
|
import com.example.datalibrary.api.FaceApi;
|
import com.example.datalibrary.listener.DBLoadListener;
|
import com.example.datalibrary.listener.SdkInitListener;
|
import com.example.datalibrary.model.ImportFeatureResult;
|
import com.example.datalibrary.model.User;
|
import com.example.datalibrary.view.PreviewTexture;
|
import com.yanzhenjie.permission.runtime.Permission;
|
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.Logger;
|
import org.greenrobot.eventbus.Subscribe;
|
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Random;
|
import java.util.Timer;
|
import java.util.TimerTask;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.Future;
|
|
import dagger.hilt.android.AndroidEntryPoint;
|
import timber.log.Timber;
|
|
import static android.Manifest.permission.RECEIVE_BOOT_COMPLETED;
|
|
@AndroidEntryPoint
|
public class MainActivity extends MyBaseActivity<MainVM, MainActivityBinding> {
|
private List<AdListResponseParam> lbs = new ArrayList<>();
|
//是否已激活
|
public static boolean isFaceOk = false;
|
private boolean isActivation = false;
|
private boolean isDBLoad;
|
private PopupWindow popupWindow;
|
private Future future;
|
|
//相机相关
|
private Camera[] mCamera;
|
private PreviewTexture[] previewTextures;
|
private static final int PREFER_WIDTH = 640;
|
private static final int PREFER_HEIGHT = 480;
|
//是否有要更新人脸
|
private boolean isNeedUpdateFace;
|
//是否正在更新中
|
private boolean isUpdatingFace;
|
private boolean isUpdateVersion;
|
private int downCount = 0;
|
private Long lastDownTime;
|
private Long showTime;
|
|
private Handler handler = new Handler(){
|
@Override
|
public void handleMessage(@NonNull Message msg) {
|
if(!isFinishing()){
|
switch (msg.what) {
|
case 0:
|
//initM();
|
TimeUtils.updateTimeUi(getVM().dayObs, getVM().timeObs);
|
handler.sendEmptyMessageDelayed(0, 1000);
|
EventBus.getDefault().post(new TimeClockEvent());
|
/*if (isDBLoad && isNeedUpdateFace && !isUpdatingFace) {
|
isNeedUpdateFace = false;
|
getVM().getFaceLD();
|
}
|
getVM().upBraceletLog();*/
|
case 2:
|
getVM().resetReq();
|
break;
|
}
|
}
|
}
|
};
|
|
|
@Override
|
public int getLayoutId() {
|
return R.layout.main_activity;
|
}
|
|
@Override
|
public void initView(@Nullable Bundle savedInstanceState) {
|
isAddCountTimer = false;
|
SpUtil.initWH(this);
|
normalConfig();
|
getDB().setModel(getVM());
|
//initRGBCheck();
|
handler.sendEmptyMessageDelayed(0, 1000);
|
//启动心跳
|
Intent intent = new Intent(MainActivity.this, HeartbeatService.class);
|
startService(intent);
|
//启动更新人脸
|
Intent intent2 = new Intent(MainActivity.this, FaceUpdateService.class);
|
startService(intent2);
|
getPermission();
|
Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
|
initPort();
|
}
|
|
private void initM(){
|
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
|
activityManager.getMemoryInfo(memoryInfo);
|
|
long totalMemory = memoryInfo.totalMem/(1024*1024);
|
long availableMemory = memoryInfo.availMem/(1024*1024);
|
long usedMemory = totalMemory - availableMemory;
|
//getDB().tvM.setText("总内存:"+totalMemory+",使用内存:"+usedMemory+",可用内存:"+availableMemory);
|
if((availableMemory<400&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
|
("02:00:00".equals(StringUtil.getHM()))){
|
//可用内存小于400M,或者每天凌晨2点,重启app
|
restartApp();
|
}
|
}
|
|
private void upErrInfo(){
|
List<SpUtil.SPBean> datas = SpUtil.getMatchingStrings(CrashHandler.FILE_NAME);
|
for(SpUtil.SPBean data : datas){
|
getVM().upErrInfo(data);
|
}
|
}
|
|
@Override
|
public void initData(@Nullable Bundle savedInstanceState) {
|
//handler.sendEmptyMessageDelayed(0,1000);
|
getDB().tvId.setText("NO:"+LMobileInfo.getDeviceUniqueId());
|
getDB().tvVersion.setText("V"+BuildConfig.VERSION_NAME);
|
getVM().getFaceLD().observe(this, new Observer<List<FaceUserBean>>() {
|
@Override
|
public void onChanged(List<FaceUserBean> beans) {
|
//更新人脸数据
|
if(beans!=null&&beans.size()>0){
|
initModel(beans);
|
}
|
}
|
});
|
getDB().img.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
if(lastDownTime!=null){
|
if(System.currentTimeMillis()-lastDownTime>1000){
|
downCount=0;
|
}
|
}
|
lastDownTime = System.currentTimeMillis();
|
Timber.d("downCount="+downCount);
|
downCount++;
|
if(downCount>4) {
|
downCount=0;
|
lastDownTime=null;
|
initPopupWindow();
|
}
|
}
|
});
|
getDB().tv1.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
//管理员登录
|
if(lastDownTime1!=null){
|
if(System.currentTimeMillis()-lastDownTime1>1000){
|
downCount1=0;
|
}
|
}
|
lastDownTime1 = System.currentTimeMillis();
|
downCount1++;
|
System.out.println();
|
Timber.tag("==>").d(""+downCount1);
|
if(downCount1>4) {
|
downCount1=0;
|
lastDownTime1=null;
|
startActivity(ManageLoginActivity.class);
|
}
|
}
|
});
|
getDB().tvId.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
//更改url
|
if(lastDownTime2!=null){
|
if(System.currentTimeMillis()-lastDownTime2>1000){
|
downCount2=0;
|
}
|
}
|
lastDownTime2 = System.currentTimeMillis();
|
downCount2++;
|
if(downCount2>4) {
|
downCount2=0;
|
lastDownTime2=null;
|
startActivity(ChangeUrlActivity.class);
|
}
|
}
|
});
|
upErrInfo();
|
getVM().devHeart();
|
BraceletLogUtils.saveLog("app打开");
|
}
|
|
|
|
boolean isOne;
|
private void setBanner(List<BannerPicResponsePara> bannerList){
|
getDB().banner.setPages(new CBViewHolderCreator<BannerViewImageHolder>() {
|
@Override
|
public BannerViewImageHolder createHolder() {
|
return new BannerViewImageHolder();
|
}
|
},bannerList ).setPageIndicator(new int[]{R.drawable.bg_dot_gray, R.drawable.bg_dot_blue});
|
isOne = bannerList.size()==1;
|
if(!isOne) {
|
getDB().banner.startTurning(3000);
|
}else {
|
getDB().banner.stopTurning();
|
}
|
}
|
|
private boolean isHavePermission = false;
|
//获取权限
|
private void getPermission(){
|
PermissionUtils.getPermission(this, new PermissionUtils.CallBack() {
|
@Override
|
public void sucess() {
|
//显示
|
isHavePermission = true;
|
checkUpdate();
|
}
|
|
@Override
|
public void fail(List<String> permissions) {
|
showNoPermissionTip();
|
}
|
}, new String[]{Permission.WRITE_EXTERNAL_STORAGE,RECEIVE_BOOT_COMPLETED});
|
}
|
|
private Long lastDownTime1;
|
private int downCount1;
|
private Long lastDownTime2;
|
private int downCount2;
|
@Override
|
protected void doRegister(int type, ActionEventData data) {
|
switch (type){
|
case 2:
|
case 3:
|
/*tipDownCount = 10;
|
isShowTip = true;
|
getDB().tvDjs.setText(tipDownCount+"s");
|
getDB().tvTip21.setText(getTipText("AC101"), TextView.BufferType.SPANNABLE);
|
getDB().clTip.setVisibility(View.VISIBLE);*/
|
//校验是否登录
|
if(MApplication.getConfigBean().getId()==null){
|
Toast.makeText(mContext, "设备未添加,无法操作", Toast.LENGTH_SHORT).show();
|
getVM().devLogin();
|
return;
|
}
|
MApplication.getLoginBean().setFlag(type==2?0:1);
|
startActivity(FaceActivity.class);
|
//startActivity(KeyCabinetActivity.class,b);
|
break;
|
case 4:
|
isShowTip = false;
|
getDB().clTip.setVisibility(View.GONE);
|
break;
|
default:
|
break;
|
}
|
}
|
|
@Override
|
protected void onResume() {
|
super.onResume();
|
showTime = System.currentTimeMillis();
|
MApplication.setLoginBean(new LoginBean());
|
if(!isFaceOk) {
|
//initLicense();
|
}
|
if(isHavePermission) {
|
checkUpdate();
|
}
|
triggerGarbageCollection();
|
getVM().resetReq();
|
if(!isOne) {
|
getDB().banner.startTurning(3000);
|
}else {
|
getDB().banner.stopTurning();
|
}
|
}
|
|
// 这是一个示例方法,用于手动触发垃圾回收
|
public void triggerGarbageCollection() {
|
// 请求进行垃圾回收
|
System.gc();
|
}
|
|
@Override
|
protected void onDestroy() {
|
super.onDestroy();
|
if (future != null && !future.isDone()) {
|
future.cancel(true);
|
}
|
FaceApi.getInstance().cleanRecords();
|
handler.removeCallbacksAndMessages(null);
|
handler = null;
|
faceHandler.removeCallbacksAndMessages(null);
|
faceHandler = null;
|
portHandler.removeCallbacksAndMessages(null);
|
portHandler = null;
|
}
|
|
private void restartApp(){
|
// 创建一个新的启动意图
|
Intent intent = new Intent(mContext, GuideActivity.class);
|
// 设置FLAG_ACTIVITY_CLEAR_TASK标志位
|
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
// 使用PendingIntent包装启动意图
|
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
|
// 获取AlarmManager实例
|
AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
|
// 在500毫秒后触发重启操作
|
alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
|
|
android.os.Process.killProcess(android.os.Process.myPid());
|
System.exit(1);
|
}
|
|
@Subscribe
|
public void GetFacesEvent(GetFacesEvent event){
|
if(!isFinishing()&&!isUpdatingFace){
|
if(isDBLoad){
|
isNeedUpdateFace = false;
|
//查询人脸
|
getVM().getFaceDatas();
|
}else {
|
isNeedUpdateFace = true;
|
}
|
}
|
}
|
|
@Subscribe
|
public void ReLoginEvent(ReLoginEvent event){
|
if(!isFinishing()){
|
handler.sendEmptyMessageDelayed(2,20000);
|
getVM().devLogin();
|
}
|
}
|
|
//判断设备是否已激活
|
private void initLicense() {
|
FaceSDKManager.getInstance().init(mContext, new SdkInitListener() {
|
@Override
|
public void initStart() {
|
|
}
|
|
public void initLicenseSuccess() {
|
//已激活
|
isFaceOk = true;
|
initDBApi();
|
}
|
|
@Override
|
public void initLicenseFail(int errorCode, String msg) {
|
//未激活,跳转激活页面
|
TimerTask task = new TimerTask() {
|
@Override
|
public void run() {
|
/*
|
*要执行的操作*/
|
|
startActivity(new Intent(mContext, ActivationActivity.class));
|
}
|
};
|
Timer timer = new Timer();
|
timer.schedule(task, 2000);
|
}
|
|
@Override
|
public void initModelSuccess() {
|
|
}
|
|
@Override
|
public void initModelFail(int errorCode, String msg) {
|
|
}
|
});
|
}
|
|
private void initDBApi(){
|
if (future != null && !future.isDone()) {
|
future.cancel(true);
|
}
|
isDBLoad = false;
|
future = Executors.newSingleThreadExecutor().submit(new Runnable() {
|
@Override
|
public void run() {
|
FaceApi.getInstance().init(new DBLoadListener() {
|
|
@Override
|
public void onStart(int successCount) {
|
if (successCount < 5000 && successCount != 0){
|
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
loadProgress(10);
|
}
|
});
|
}
|
}
|
|
@Override
|
public void onLoad(final int finishCount, final int successCount, final float progress) {
|
if (successCount > 5000 || successCount == 0) {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
getDB().progressBar.setProgress((int) (progress * 100));
|
getDB().progressText.setText(((int) (progress * 100)) + "%");
|
}
|
});
|
}
|
}
|
|
@Override
|
public void onComplete(final List<User> users , final int successCount) {
|
// FileUtils.saveDBList(HomeActivity.this, users);
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
FaceApi.getInstance().setUsers(users);
|
initFaceSDKManager(null);
|
if (successCount > 5000 || successCount == 0) {
|
getDB().progressGroup.setVisibility(View.GONE);
|
isDBLoad = true;
|
isFaceOk = true;
|
}
|
}
|
});
|
}
|
|
@Override
|
public void onFail(final int finishCount, final int successCount, final List<User> users) {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
FaceApi.getInstance().setUsers(users);
|
initFaceSDKManager(null);
|
getDB().progressGroup.setVisibility(View.GONE);
|
Toast.makeText(MainActivity.this, String.format(getString(R.string.main_tip3),successCount,finishCount), Toast.LENGTH_SHORT).show();
|
isDBLoad = true;
|
isFaceOk = true;
|
}
|
});
|
}
|
}, mContext);
|
}
|
});
|
}
|
|
private void loadProgress(float i){
|
getDB().progressGroup.setVisibility(View.VISIBLE);
|
new Handler().postDelayed(new Runnable() {
|
@Override
|
public void run() {
|
getDB().progressBar.setProgress((int) ((i / 5000f) * 100));
|
getDB().progressText.setText(((int) ((i / 5000f) * 100)) + "%");
|
if (i < 5000){
|
loadProgress(i + 100);
|
}else {
|
getDB().progressGroup.setVisibility(View.GONE);
|
isDBLoad = true;
|
isFaceOk = true;
|
}
|
}
|
},10);
|
}
|
|
private void initModel(List<FaceUserBean> userBeans) {
|
if (com.example.datalibrary.manager.FaceSDKManager.initStatus == com.example.datalibrary.manager.FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
|
waitUpdate(userBeans);
|
}else {
|
initFaceSDKManager(userBeans);
|
}
|
}
|
|
private void initFaceSDKManager(List<FaceUserBean> userBeans){
|
//开始后去初始化
|
com.example.datalibrary.manager.FaceSDKManager.getInstance().initModel(mContext,
|
FaceUtils.getInstance().getBDFaceSDKConfig() , new SdkInitListener() {
|
@Override
|
public void initStart() {
|
}
|
|
@Override
|
public void initLicenseSuccess() {
|
}
|
|
@Override
|
public void initLicenseFail(int errorCode, String msg) {
|
}
|
|
@Override
|
public void initModelSuccess() {
|
com.example.datalibrary.manager.FaceSDKManager.initModelSuccess = true;
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
Toast.makeText(mContext, getString(R.string.main_tip4), Toast.LENGTH_SHORT).show();
|
getDB().progressGroup.setVisibility(View.GONE);
|
if(userBeans!=null){
|
waitUpdate(userBeans);
|
}
|
}
|
});
|
}
|
|
@Override
|
public void initModelFail(int errorCode, String msg) {
|
com.example.datalibrary.manager.FaceSDKManager.initModelSuccess = false;
|
if (errorCode != -12) {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
Toast.makeText(mContext, getString(R.string.main_tip5), Toast.LENGTH_SHORT).show();
|
}
|
});
|
}
|
}
|
});
|
}
|
|
@Override
|
protected void onPause() {
|
super.onPause();
|
showTime = null;
|
}
|
|
private int finishCount;
|
private List<FaceUserBean> selectBeans = new ArrayList<>();
|
//待更新数据
|
private List<FaceUserBean> waitBeans = new ArrayList<>();
|
|
private Handler faceHandler = new Handler(){
|
|
@Override
|
public void handleMessage(@NonNull Message msg) {
|
if(!isFinishing()){
|
switch (msg.what){
|
case 0:
|
if(finishCount<selectBeans.size()){
|
isUpdatingFace = true;
|
repeatCount = 0;
|
updateFace(selectBeans.get(finishCount));
|
}else {
|
//结束
|
isUpdatingFace = false;
|
//System.out.println("==UpdatingFace==>更新结束:");
|
// 清除内存缓存
|
Glide.get(MainActivity.this).clearMemory();
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
}
|
};
|
|
private void waitUpdate(List<FaceUserBean> userBeans){
|
if(isUpdatingFace){
|
//正在更新
|
waitBeans.addAll(userBeans);
|
}else {
|
selectBeans.clear();
|
selectBeans.addAll(waitBeans);
|
waitBeans.clear();
|
selectBeans.addAll(userBeans);
|
finishCount=0;
|
faceHandler.sendEmptyMessage(0);
|
}
|
}
|
|
private int repeatCount = 0;
|
private void updateFace(FaceUserBean bean){
|
Timber.d("==UpdatingFace==>完成数量 "+finishCount);
|
if (TextUtils.isEmpty(bean.getFaceImg())||bean.getFaceImg().endsWith("null")) {
|
finishCount++;
|
faceHandler.sendEmptyMessage(0);
|
return;
|
}
|
repeatCount++;
|
//System.out.println("==UpdatingFace==>开始:" + bean.getName());
|
Glide.with(this)
|
.asBitmap()
|
.load(bean.getFaceImg())
|
.addListener(new RequestListener<Bitmap>() {
|
@Override
|
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
|
if(repeatCount==1) {
|
finishCount++;
|
}
|
faceHandler.sendEmptyMessage(0);
|
return false;
|
}
|
|
@Override
|
public boolean onResourceReady(Bitmap bitmap, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
|
if(repeatCount==1) {
|
finishCount++;
|
}
|
if (bitmap != null) {
|
//System.out.println("==UpdatingFace==>开始解析人脸");
|
byte[] secondFeature = new byte[512];
|
ImportFeatureResult result = null;
|
// 10、走人脸SDK接口,通过人脸检测、特征提取拿到人脸特征值
|
try {
|
result = ImportFileManager.getInstance().getFeature(bitmap, secondFeature,
|
BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
|
}catch (OutOfMemoryError e){
|
e.printStackTrace();
|
faceHandler.sendEmptyMessage(0);
|
return false;
|
}catch (Exception e){
|
e.printStackTrace();
|
faceHandler.sendEmptyMessage(0);
|
return false;
|
}
|
|
// 11、判断是否提取成功:128为成功,-1为参数为空,-2表示未检测到人脸
|
float ret = result.getResult();
|
//System.out.println("==UpdatingFace==>提取特征值" + ret);
|
// 提取特征值
|
if (ret != -1) {
|
//有人脸
|
// 判断质量检测,针对模糊度、遮挡、角度
|
if (ret == 128) {
|
Timber.d("==UpdatingFace==>图片特征抽取成功: %s", JSON.toJSONString(bean));
|
User user = new User();
|
user.setUserId(bean.getMemberId());
|
user.setGroupId(bean.getGroupId());
|
user.setUserName(bean.getMemberName());
|
user.setImageName(bean.getFaceImg());
|
user.setUserInfo(GsonTools.changeGsonToJson(bean));
|
user.setFeature(secondFeature);
|
insertOrUpdate(user);
|
faceHandler.sendEmptyMessage(0);
|
} else {
|
Timber.e("==UpdatingFace==>图片特征抽取失败: %s", JSON.toJSONString(bean));
|
if(repeatCount>3) {
|
faceHandler.sendEmptyMessage(0);
|
}else {
|
updateFace(bean);
|
}
|
}
|
} else {
|
// 上传图片无人脸隐藏
|
Timber.e("==UpdatingFace==>图片特征抽取失败: %s", JSON.toJSONString(bean));
|
if(repeatCount>3) {
|
faceHandler.sendEmptyMessage(0);
|
}else {
|
updateFace(bean);
|
}
|
}
|
} else {
|
if(repeatCount>3) {
|
faceHandler.sendEmptyMessage(0);
|
}else {
|
updateFace(bean);
|
}
|
}
|
return false;
|
}
|
})
|
.into(new SimpleTarget<Bitmap>() {
|
|
@Override
|
public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition<? super Bitmap> transition) {
|
|
}
|
});
|
}
|
|
private void insertOrUpdate(User newDo){
|
//插入数据库
|
//System.out.println("==isOk==>bean" + GsonTools.changeGsonToJson(newDo));
|
User user = FaceApi.getInstance().getByUserId(newDo.getGroupId(), newDo.getUserId());
|
//System.out.println("==isOk==>查询" + user.getId()+","+user.getUserId()+","+user.getUserName());
|
boolean isSave = false;
|
if (user == null) {
|
//新增
|
isSave = FaceApi.getInstance().registerUserIntoDBmanager(newDo.getGroupId(),
|
newDo.getUserId(), newDo.getUserName(), newDo.getImageName(), newDo.getUserInfo(), newDo.getFeature());
|
//System.out.println("==isOk==>保存成功");
|
} else {
|
//更新
|
user.setUserName(newDo.getUserName());
|
user.setImageName(newDo.getImageName());
|
user.setFeature(newDo.getFeature());
|
isSave = FaceApi.getInstance().userUpdateOnly(user);
|
//System.out.println("==isOk==>更新成功");
|
}
|
|
if (isSave) {
|
//保存成功
|
//System.out.println("==UpdatingFace==>修改成功");
|
UserInfoManager.getInstance();
|
} else {
|
Timber.d("==isOk==>人脸保存失败: %s", JSON.toJSONString(newDo));
|
}
|
}
|
|
//弹窗
|
private void initPopupWindow() {
|
if(popupWindow!=null&&popupWindow.isShowing()){
|
return;
|
}
|
View contentView = LayoutInflater.from(mContext).inflate(R.layout.popup_menu_home, null);
|
popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
// 点击框外可以使得popupwindow消失
|
popupWindow.setFocusable(false);
|
popupWindow.setOutsideTouchable(false);
|
popupWindow.setTouchable(true);
|
popupWindow.setBackgroundDrawable(new BitmapDrawable());
|
popupWindow.showAtLocation(getDB().clRoot, Gravity.CENTER, 0, 0);
|
RelativeLayout relativeRegister = contentView.findViewById(R.id.relative_register);
|
RelativeLayout mPopRelativeManager = contentView.findViewById(R.id.relative_manager);
|
RelativeLayout mPopRelativeCamra = contentView.findViewById(R.id.relative_camra);
|
RelativeLayout mRlErr = contentView.findViewById(R.id.rl_err);
|
relativeRegister.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
startActivity(AddFaceActivity.class);
|
}
|
});
|
mPopRelativeManager.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
startActivity(UserManagerActivity.class);
|
}
|
});
|
mPopRelativeCamra.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
//startActivity();
|
}
|
});
|
mRlErr.setOnClickListener(new View.OnClickListener() {
|
@Override
|
public void onClick(View v) {
|
startActivity(ErrActivity.class);
|
}
|
});
|
//自动关闭
|
initHandler();
|
}
|
|
private void initHandler() {
|
new Handler(new Handler.Callback() {
|
@Override
|
public boolean handleMessage(Message msg) {
|
// 实现页面跳转
|
popupWindow.dismiss();
|
return false;
|
}
|
}).sendEmptyMessageDelayed(0, 5000);
|
}
|
|
private void initRGBCheck(){
|
if(true){
|
return;
|
}
|
String index = SpUtil.getString("rbgCameraId");
|
if(index==null){
|
index = "0";
|
}
|
setRgbCameraId(Integer.parseInt(index));
|
/*if (isSetCameraId()){
|
return;
|
}
|
int mCameraNum = Camera.getNumberOfCameras();
|
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
|
for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
|
Camera.getCameraInfo(i, cameraInfo);
|
}
|
if (mCameraNum > 1){
|
try {
|
mCamera = new Camera[mCameraNum];
|
previewTextures = new PreviewTexture[mCameraNum];
|
mCamera[0] = Camera.open(0);
|
previewTextures[0] = new PreviewTexture(this, getDB().checkRgbTexture);
|
previewTextures[0].setCamera(mCamera[0], PREFER_WIDTH, PREFER_HEIGHT);
|
mCamera[0].setPreviewCallback(new Camera.PreviewCallback() {
|
@Override
|
public void onPreviewFrame(byte[] data, Camera camera) {
|
int check = StreamUtil.checkNirRgb(data, PREFER_WIDTH, PREFER_HEIGHT);
|
if (check == 1){
|
setRgbCameraId(0);
|
}
|
release(0);
|
}
|
});
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
try {
|
mCamera[1] = Camera.open(1);
|
previewTextures[1] = new PreviewTexture(this, getDB().checkNirTexture);
|
previewTextures[1].setCamera(mCamera[1], PREFER_WIDTH, PREFER_HEIGHT);
|
mCamera[1].setPreviewCallback(new Camera.PreviewCallback() {
|
@Override
|
public void onPreviewFrame(byte[] data, Camera camera) {
|
int check = StreamUtil.checkNirRgb(data, PREFER_WIDTH, PREFER_HEIGHT);
|
if (check == 1){
|
setRgbCameraId(1);
|
}
|
release(1);
|
}
|
});
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
} else {
|
setRgbCameraId(0);
|
}*/
|
}
|
|
private void setRgbCameraId(int index){
|
//Toast.makeText(mContext, "设置相机"+index, Toast.LENGTH_SHORT).show();
|
SpUtil.saveString("rbgCameraId",index+"");
|
BraceletLogUtils.saveLog("设置相机("+index+")");
|
SingleBaseConfig.getBaseConfig().setRBGCameraId(index);
|
SingleBaseConfig.getBaseConfig().setRgbRevert(true);
|
SingleBaseConfig.getBaseConfig().setRgbDetectDirection(90);
|
SingleBaseConfig.getBaseConfig().setRgbVideoDirection(270);
|
GateConfigUtils.modityJson();
|
RegisterConfigUtils.modityJson();
|
}
|
private boolean isSetCameraId(){
|
if (SingleBaseConfig.getBaseConfig().getRBGCameraId() == -1){
|
return false;
|
}else {
|
return true;
|
}
|
}
|
|
private void release(int id){
|
if (mCamera != null && mCamera[id] != null) {
|
if (mCamera[id] != null) {
|
mCamera[id].setPreviewCallback(null);
|
mCamera[id].stopPreview();
|
previewTextures[id].release();
|
mCamera[id].release();
|
mCamera[id] = null;
|
}
|
}
|
}
|
|
private void checkUpdate(){
|
//版本更新
|
new UpdateUtil(this).setShowToast(false).getServerVerCode(new UpdateUtil.VersionCallBack() {
|
@Override
|
public void isNeedUpdate(boolean isUpdate) {
|
isUpdateVersion = isUpdate;
|
}
|
});
|
}
|
|
private PermissiondDialog permissiondDialog;
|
private void showNoPermissionTip() {
|
try {
|
Toast.makeText(this,getString(R.string.guide_permiss_1) , Toast.LENGTH_LONG).show();
|
if (permissiondDialog == null) {
|
permissiondDialog = new PermissiondDialog(this, getString(R.string.help), getString(R.string.guide_permiss_2), getString(R.string.cancel),
|
getString(R.string.empower), new PermissiondDialog.OnClickListener() {
|
@Override
|
public void clickOk() {
|
permissiondDialog.dismiss();
|
PermissionUtils.gotoPermission(getContext());
|
}
|
|
@Override
|
public void clickNo() {
|
permissiondDialog.dismiss();
|
finish();
|
}
|
});
|
}
|
if (!permissiondDialog.isShowing()) {
|
permissiondDialog.show();
|
}
|
} catch (Exception e) {
|
|
}
|
}
|
|
private int tipDownCount = 10;
|
private boolean isShowTip;
|
@Subscribe
|
public void TimeClockEvent(TimeClockEvent e){
|
if(isShowTip){
|
if(tipDownCount==0){
|
isShowTip = false;
|
getDB().clTip.setVisibility(View.GONE);
|
}else {
|
tipDownCount--;
|
getDB().tvDjs.setText(tipDownCount+"s");
|
}
|
}
|
}
|
|
/**
|
* 监听开门
|
* @param e
|
*/
|
@Subscribe
|
public void OpenGridEvent(OpenGridEvent e){
|
if(!isFinishing()){
|
EventBus.getDefault().post(new KeyDoorEvent(MApplication.nextBoolean()?"0":"1"));
|
}
|
}
|
|
/**
|
* 监听钥匙
|
* @param e
|
*/
|
@Subscribe
|
public void KeyStatusListener(KeyStatusListener e){
|
if(!isFinishing()){
|
if(e.getStatus()==0){
|
//开始
|
Random random = new Random();
|
EventBus.getDefault().post(new KeyResultEvent(random.nextBoolean()?"0":"1"));
|
}else {
|
//结束
|
}
|
}
|
}
|
|
private SpannableString getTipText(String name){
|
String text = name+"柜门未关闭";
|
SpannableString styledText = new SpannableString(text);
|
styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip1),
|
0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip2), name.length()+1, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
return styledText;
|
}
|
|
@Override
|
protected void onRestart() {
|
super.onRestart();
|
getVM().devHeart();
|
}
|
|
@Subscribe
|
public void HeartEvent(HeartEvent e){
|
if(!isFinishing()){
|
getVM().devHeart();
|
}
|
}
|
|
private SerialPortModel gridPort;
|
private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
|
@Override
|
public void onResult(String result) {
|
|
}
|
|
@Override
|
public void onResultBytes(byte[] bytes) {
|
if(gridPort!=null && !gridPort.isOk()){
|
gridPort.setOk(true);
|
}
|
}
|
};
|
private SerialPortModel keyPort;
|
private SerialPortReadObserver keyReadObserver = new SerialPortReadObserver() {
|
@Override
|
public void onResult(String result) {
|
|
}
|
|
@Override
|
public void onResultBytes(byte[] bytes) {
|
if(keyPort!=null && !keyPort.isOk()){
|
keyPort.setOk(true);
|
}
|
}
|
};
|
private SerialPortModel jiuPort;
|
private SerialPortReadObserver jiuReadObserver = new SerialPortReadObserver() {
|
@Override
|
public void onResult(String result) {
|
|
}
|
|
@Override
|
public void onResultBytes(byte[] bytes) {
|
if(jiuPort!=null && !jiuPort.isOk()){
|
jiuPort.setOk(true);
|
}
|
}
|
};
|
|
List<String> ports;
|
private int index = 0;
|
private Handler portHandler = new Handler(){
|
@Override
|
public void handleMessage(@NonNull Message msg) {
|
switch (msg.what){
|
case 0:
|
if(index>=1&&!checkEnd()){
|
index--;
|
chosePort(ports.get(index));
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
};
|
//初始化串口
|
private void initPort(){
|
ports = SportUtils.getSerialPortPaths(this);
|
if(ports.size()>0){
|
index = ports.size()-1;
|
chosePort(ports.get(ports.size()-1));
|
}
|
}
|
|
private void chosePort(String path){
|
if(gridPort==null||!gridPort.isOk()){
|
closePort(gridPort);
|
gridPort = new SerialPortModel(path,9600 ,8
|
,1 , 0);
|
boolean isSucc = gridPort.open();
|
if(isSucc) {
|
String msg = isSucc ? "成功" : "失败";
|
//getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
|
gridPort.startRead(gridReadObserver);
|
//todo 发送柜格校验信息
|
}
|
}
|
if(keyPort==null||!keyPort.isOk()){
|
closePort(keyPort);
|
keyPort = new SerialPortModel(path,115200 ,8
|
,1 , 0);
|
boolean isSucc = keyPort.open();
|
if(isSucc) {
|
String msg = isSucc ? "成功" : "失败";
|
//getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
|
keyPort.startRead(keyReadObserver);
|
//todo 发送钥匙校验信息
|
}
|
}
|
if(jiuPort==null||!jiuPort.isOk()){
|
closePort(jiuPort);
|
jiuPort = new SerialPortModel(path,9600 ,8
|
,1 , 0);
|
boolean isSucc = jiuPort.open();
|
if(isSucc) {
|
String msg = isSucc ? "成功" : "失败";
|
//getVM().append("串口 "+ settingBean.getDevicePath() + " -连接"+msg);
|
jiuPort.startRead(jiuReadObserver);
|
//todo 发送酒精校验信息
|
}
|
}
|
|
portHandler.sendEmptyMessageDelayed(0,2000);
|
}
|
|
private void closePort(SerialPortModel port){
|
if(port==null){
|
return;
|
}
|
port.startRead(null);
|
port.stopRead();
|
port.close();
|
port = null;
|
}
|
|
private boolean checkEnd(){
|
if(gridPort==null||!gridPort.isOk()){
|
return false;
|
}
|
if(keyPort==null||!keyPort.isOk()){
|
return false;
|
}
|
if(jiuPort==null||!jiuPort.isOk()){
|
return false;
|
}
|
return true;
|
}
|
}
|