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 { private List 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 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>() { @Override public void onChanged(List 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 bannerList){ getDB().banner.setPages(new CBViewHolderCreator() { @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 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 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 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 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 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 selectBeans = new ArrayList<>(); //待更新数据 private List waitBeans = new ArrayList<>(); private Handler faceHandler = new Handler(){ @Override public void handleMessage(@NonNull Message msg) { if(!isFinishing()){ switch (msg.what){ case 0: if(finishCount更新结束:"); // 清除内存缓存 Glide.get(MainActivity.this).clearMemory(); } break; default: break; } } } }; private void waitUpdate(List 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() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { if(repeatCount==1) { finishCount++; } faceHandler.sendEmptyMessage(0); return false; } @Override public boolean onResourceReady(Bitmap bitmap, Object model, Target 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() { @Override public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition 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 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; } }