package eVVM.apk.ui.vaccination; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.Dialog; import android.content.Intent; import android.content.res.Resources; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.os.Handler; import android.os.Message; import android.os.Parcelable; import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.CycleInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.LinearInterpolator; import android.view.animation.RotateAnimation; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import com.alibaba.fastjson.JSONArray; import com.hjq.base.BaseDialog; import com.hjq.base.BaseDialogFragment; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import butterknife.BindView; import butterknife.OnClick; import eVVM.apk.R; import eVVM.apk.helper.ConversionUtil; import eVVM.apk.helper.SPUtils; import eVVM.apk.helper.SoundPoolHelper; import eVVM.apk.ui.bean.VnDetailBean; import eVVM.apk.ui.event.ReadingErrorEvent; import eVVM.apk.ui.home.BaseNfcActivity; import eVVM.apk.ui.home.uploadChip.UploadChipContract; import eVVM.apk.ui.vaccination.save.ChipModel; import eVVM.apk.widget.EvvmMsgDiago; public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View { private boolean isWarning = false; private ChipModel chipModel; private SoundPoolHelper soundPoolHelper; private String textRecord = ""; private String chipNumber = ""; @BindView(R.id.reading__line) ImageView imgreadline; @BindView(R.id.reading_progress) ProgressBar readingProgress; @BindView(R.id.fly_phonerl) RelativeLayout flyphonerl; private Animation animation; private AlphaAnimation alp; private AnimatorSet animatorSetsuofang; private AnimatorSet animatorSetsuofang2; private BaseDialog loadDiago; private ProgressBar readpb; @Override protected int getLayoutId() { return R.layout.activity_reading; } @Override protected int getTitleId() { return R.id.reading_title; } @Override protected void initView() { getAnimationSao(); //进行雷达扫描动画 soundPoolHelper = new SoundPoolHelper(7, SoundPoolHelper.TYPE_MUSIC) .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC) .loadDefault(ReadingActivity.this) .load(ReadingActivity.this, "factory_operator_success", R.raw.factory_operator_success) .load(ReadingActivity.this, "factory_operator_error", R.raw.factory_operator_error) .load(ReadingActivity.this, "xufuhe", R.raw.xufuhe) .load(ReadingActivity.this, "zhengchang", R.raw.zhengchang) .load(ReadingActivity.this, "nuliduquzhong", R.raw.shujuduquwanbi) .load(ReadingActivity.this, "saomiaotishi", R.raw.saomiaotishi) .load(ReadingActivity.this, "yiduquwanbi", R.raw.yiduquwanbi); //第一次加载才会做飞出动画 int flyPhoneType = (int) SPUtils.get("FlyPhoneType", 0); if (flyPhoneType == 0) { getFlyPhone(); SPUtils.put("FlyPhoneType", 1); } else { flyphonerl.setVisibility(View.GONE); } } private void getFlyPhone() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); int height3 = dm.heightPixels; //组合动画 animatorSetsuofang = new AnimatorSet(); // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f); ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY()); animatorSetsuofang.setDuration(650); animatorSetsuofang.setInterpolator(new DecelerateInterpolator()); animatorSetsuofang.play(scaleY); animatorSetsuofang.start(); animatorSetsuofang.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { postDelayed(new Runnable() { @Override public void run() { //flyphonerl.setVisibility(View.GONE); animatorSetsuofang.cancel(); getFlyGoBack(); } }, 5000); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } private void getFlyGoBack() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDisplayMetrics(); int height3 = dm.heightPixels; //组合动画 animatorSetsuofang2 = new AnimatorSet(); // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f); ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3); animatorSetsuofang2.setDuration(1500); animatorSetsuofang2.setInterpolator(new DecelerateInterpolator()); animatorSetsuofang2.play(scaleY); animatorSetsuofang2.start(); animatorSetsuofang2.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { flyphonerl.setVisibility(View.GONE); animatorSetsuofang2.cancel(); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } private void getAnimationSao() { animation = new RotateAnimation(360, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setFillAfter(true); animation.setDuration(2000); //两秒转一圈 animation.setInterpolator(new LinearInterpolator()); animation.setRepeatCount(Animation.INFINITE); //循环执行 imgreadline.startAnimation(animation); int[] antenna = new int[]{R.id.reading_antenna1, R.id.reading_antenna2, R.id.reading_antenna3, R.id.reading_antenna4, R.id.reading_antenna5, R.id.reading_antenna6, R.id.reading_antenna7, R.id.reading_antenna8, R.id.reading_antenna9}; int nfcWireIndex = 2; try { nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL", "2"))); } catch (Exception e) { e.printStackTrace(); } alp = new AlphaAnimation(1, 0.2f); alp.setStartOffset(500); alp.setDuration(1000); alp.setFillAfter(false); alp.setInterpolator(new CycleInterpolator(2)); alp.setRepeatCount(Animation.INFINITE); findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp); alp.start(); } @OnClick({R.id.again_bt}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.again_bt: startActivityFinish(QrCodeActivity.class); break; } } @Override protected void initData() { mNfcAdapter = NfcAdapter.getDefaultAdapter(this); waithandler.postDelayed(waitRunnable, 1000); } private static class MyHandler extends Handler { private WeakReference wactivity; public MyHandler(ReadingActivity activity) { wactivity = new WeakReference(activity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); } } private MyHandler waithandler = new MyHandler(this); private Runnable waitRunnable = new Runnable() { @Override public void run() { //5秒没读取到数据 // soundPoolHelper.play("nuliduquzhong", false); soundPoolHelper.play("saomiaotishi", false); } }; /** * 读取NFC标签文本数据 */ private String readNfcTag(Intent intent) { readingProgress.setProgress(0); if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage msgs[] = null; if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } try { if (msgs != null) { NdefRecord record = msgs[0].getRecords()[0]; return parseTextRecord(record); } } catch (Exception e) { } } return null; } public String parseTextRecord(NdefRecord ndefRecord) { if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) { return null; } if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) { return null; } try { byte[] bArray = ndefRecord.getPayload(); StringBuffer sb = new StringBuffer(bArray.length); String sTemp; for (int i = 0; i < bArray.length; i++) { sTemp = Integer.toHexString(0xFF & bArray[i]); if (sTemp.length() < 2) sb.append(0); sb.append(sTemp.toUpperCase()); } return sb.toString(); } catch (Exception e) { throw new IllegalArgumentException(); } } //记录ProgressBar的完成进度 private int status = 0; private int hasDate = 0; public int getStatus() { return status; } public BaseDialog getLoadDiago() { return loadDiago; } public ProgressBar getReadpb() { return readpb; } //创建一个负责更新进度的Handler final private ProgressHandler mHandler = new ProgressHandler(this); private static class ProgressHandler extends Handler { private final WeakReference readingwrActivity; public ProgressHandler(ReadingActivity activity) { readingwrActivity = new WeakReference(activity); } @Override public void handleMessage(Message msg) { ReadingActivity readingActivity = readingwrActivity.get(); if (readingActivity != null) { //表明消息是由该程序发送的 if (msg.what == 0x111) { readingActivity.getReadpb().setProgress(readingActivity.getStatus()); if (readingActivity.getStatus() == 100) { readingActivity.getLoadDiago().dismiss(); } } } } } private boolean issao; //设置一个flag 判断是否正在读取 private String noNetMsg = "正常"; @Override public void onNewIntent(Intent intent) { if (waithandler != null) { waithandler.removeCallbacks(waitRunnable); } textRecord = readNfcTag(intent); Log.e("textRecord-doctor:", textRecord); // if (textRecord.contains("FFFFFFFFFFFF")) if (textRecord == null || textRecord.length() < chipNumberEndIndex) { toast("读取失败"); return; } else { if (issao) { //正在进行读取中 直接return 不做处理 return; } else { issao = true; //开始读取 noNetMsg = "正常"; hasDate = 0; status = 0; //soundPoolHelper.play("yiduquwanbi", false); soundPoolHelper.play("nuliduquzhong", false); loadDiago = new BaseDialogFragment.Builder(this) .setContentView(R.layout.progressreader) .setAnimStyle(BaseDialog.AnimStyle.SCALE) //.setText(id, "我是预设置的文本") .addOnShowListener(new BaseDialog.OnShowListener() { @Override public void onShow(BaseDialog dialog) { //toast("Dialog 显示了"); } }) .addOnCancelListener(new BaseDialog.OnCancelListener() { @Override public void onCancel(BaseDialog dialog) { //toast("Dialog 取消了"); } }) .addOnDismissListener(new BaseDialog.OnDismissListener() { @Override public void onDismiss(BaseDialog dialog) { //进度条走完 进行加载 isWarning = false; chipNumber = textRecord.substring(6, chipNumberEndIndex); Log.e("chipNumberDetail", "" + chipNumber); String binaryStr = ConversionUtil.hexStr2Str(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2)); Log.e("textRecordsub", "" + textRecord.substring((3 + 40 + 1 + 4 + 8) * 2)); //判断字符串是否包含 boolean status = binaryStr.contains("+") || binaryStr.contains("-"); try { if (status) { alarmDetection(true); //第二、三种微电子标签解析方式 } else { String isFour = chipNumber.substring(0,2); if (isFour.contains("72")) { Log.e("微电子标签解析方式", "第四种"); alarmDetectionFour(binaryStr); //第四种微电子标签解析方式 } else { alarmDetection(binaryStr, 1); //第一种微电子标签解析方式 } } } catch (Exception e) { noNetMsg = "扫描异常"; } uploadChip(false); } }) .show(); readpb = loadDiago.findViewById(R.id.read_progress); //启动线程来执行任务 new Thread() { @Override public void run() { super.run(); while (status < 100) { //获取耗时操作的完成百分比 status = doWork(); //发送消息 mHandler.sendEmptyMessage(0x111); } } }.start(); } } } //第四种微电子标签解析方式 public void alarmDetectionFour(String binaryStr) { StringBuilder hexStr = new StringBuilder(); int fourCounts = binaryStr.length() / 8;//有多少份 for (int i = 0; i < fourCounts; i++) { String eightData = binaryStr.substring(i * 8, (i + 1) * 8); //截取出8位 int repeatCount = ConversionUtil.binToDec(eightData.substring(2, 8));//取出后六位转换成数量 hexStr.append(strMultiply(eightData.substring(0, 2), repeatCount)); } //System.out.println(hexStr.toString().length()); alarmDetection(hexStr.toString(), 4); } private String strMultiply(String str, int count) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < count; i++) { sb.append(str); } return sb.toString(); } //进行进度条加载 private int doWork() { //为元素赋值 hasDate += 10; try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } return hasDate; } //判断是否报警 public void alarmDetection(String binaryStr, int chipType) { if (TextUtils.isEmpty(binaryStr) || binaryStr.length() <= 8) { noNetMsg = "温度记录时间不足"; return; } binaryStr = binaryStr.substring(4, binaryStr.length() - 8); //减去启用后的一小时和注射前的两小时 longE("温度二进制1", "" + textRecord.substring((3 + 40 + 1 + 4 + 8) * 2)); longE("binaryStr1", binaryStr); String binaryArr[] = new String[binaryStr.length() / 2]; for (int i = 0; i < binaryArr.length; i++) { binaryArr[i] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1); } LinkedList exceedingIndexs = new LinkedList(); exceedingIndexs.add(-1); for (int i = 0; i < binaryArr.length; i++) { if (!binaryArr[i].equals("01")) { if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) { exceedingIndexs.add(i); } if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) { exceedingIndexs.add(i + 1); } } } int category = 0; if (chipType == 4) { //第四种标签直接取 CATEGORY_TIMES_4 int type = ConversionUtil.hexToDec(chipNumber.substring(0, 2)); String number = type + ""; category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + number.substring(1, 2), 48 + "").toString()); } else { category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + 4, 48 + "").toString()); } longE("alarmDetection1", "" + (exceedingIndexs.size()) / 2.f); if ((exceedingIndexs.size()) / 2.f > category) { // toast("报警"); isWarning = true; //soundPoolHelper.play("xufuhe", false); //warning(); } else { isWarning = false; //soundPoolHelper.play("zhengchang", false); } readingProgress.setProgress(100); } //判断是否报警 public void alarmDetection(boolean isNew) { String binaryStr = ConversionUtil.hexStr2Str(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2)); longE("温度二进制", "" + textRecord.substring((3 + 40 + 1 + 4 + 8) * 2)); if (binaryStr.length() <= 36) { noNetMsg = "温度记录时间不足"; return; } binaryStr = binaryStr.replaceAll(" ", ""); binaryStr = binaryStr.replaceAll("\\+", " +"); binaryStr = binaryStr.replaceAll("\\-", " -"); longE("binaryStr", binaryStr); String binaryArrTmp[] = binaryStr.trim().split(" "); int errorCount = 0; LinkedList newList = new LinkedList(); // String binaryArr[] = binaryStr.split("\\+"); for (int i = 2; i < binaryArrTmp.length - 4; i++) { //这里是判断超过100的次数 /*if (binaryArrTmp[i].length() != 6) { errorCount++; if (errorCount != 6) { noNetMsg = "标签异常"; return; } } else { newList.add(binaryArrTmp[i]); }*/ newList.add(binaryArrTmp[i]); } String binaryArr[] = new String[newList.size()]; for (int i = 0; i < newList.size(); i++) { binaryArr[i] = newList.get(i); } int type = ConversionUtil.hexToDec(chipNumber.substring(0, 2)); String number = type + ""; String code2 = number.substring(1, 2); LinkedList exceedingIndexs = new LinkedList(); exceedingIndexs.add(-1); for (int i = 0; i < binaryArr.length; i++) { // double sz1 = Double.parseDouble(binaryArr[i].replace("\0", "")); if (sz1 >= 100 || sz1 <= -100) { noNetMsg = "标签异常"; return; } double up = Double.parseDouble(TextUtils.isEmpty((String) SPUtils.get("CATEGORY_NORMAL_UP" + code2, "0.05")) ? "0.05" : (String) SPUtils.get("CATEGORY_NORMAL_UP" + code2, "0.05")); double down = Double.parseDouble(TextUtils.isEmpty((String) SPUtils.get("CATEGORY_NORMAL_DOWN" + code2, "0.05")) ? "0.05" : (String) SPUtils.get("CATEGORY_NORMAL_DOWN" + code2, "0.05")); if (up != 0.05 && down != 0.05) { if (!(sz1 < up && sz1 >= down)) { // if(!binaryArr[i].equals(String.valueOf(Integer.parseInt(binaryArr[i])<=+8.0 && Integer.parseInt(binaryArr[i])>=+2.0))) if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) { exceedingIndexs.add(i); } if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) { exceedingIndexs.add(i + 1); } } } else if (up != 0.05 && down == 0.05) { if (!(sz1 < up)) { // if(!binaryArr[i].equals(String.valueOf(Integer.parseInt(binaryArr[i])<=+8.0 && Integer.parseInt(binaryArr[i])>=+2.0))) if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) { exceedingIndexs.add(i); } if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) { exceedingIndexs.add(i + 1); } } } else { if (!(sz1 >= down)) { // if(!binaryArr[i].equals(String.valueOf(Integer.parseInt(binaryArr[i])<=+8.0 && Integer.parseInt(binaryArr[i])>=+2.0))) if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) { exceedingIndexs.add(i); } if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) { exceedingIndexs.add(i + 1); } } } } int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + code2, 48 + "").toString()); longE("alarmDetection", "" + (exceedingIndexs.size()) / 2.f); if ((exceedingIndexs.size()) / 2.f > category) { // toast("报警"); isWarning = true; //soundPoolHelper.play("xufuhe", false); //warning(); } else { isWarning = false; //soundPoolHelper.play("zhengchang", false); } readingProgress.setProgress(100); } private void uploadChip(boolean agin) { if (textRecord != null && textRecord.length() > chipNumberEndIndex) { if (SPUtils.contains("LOCATION")) { Log.e("LOCATION", SPUtils.get("LOCATION", "").toString()); String location[] = SPUtils.get("LOCATION", "").toString().split(","); if (location.length > 1) { Double latitude = Double.parseDouble(location[0]); Double longitude = Double.parseDouble(location[1]); String inoculators = (String) SPUtils.get("INOCULATOR_LIST", ""); Log.e("chipNumber", chipNumber); Log.e("textRecord", textRecord); getPresenter().forDoctor(chipNumber, textRecord, inoculators, longitude, latitude, agin, isWarning, noNetMsg); chipModel = new ChipModel(chipNumber, textRecord, inoculators, longitude, latitude); } else { toast("位置信息错误"); issao = false; //读取结束 } } else { toast("位置信息获取失败"); issao = false; //读取结束 } } else { toast("芯片识别错误"); issao = false; //读取结束 } } @Subscribe(threadMode = ThreadMode.MAIN, sticky = false) public void onEvent(ReadingErrorEvent event) { if (event.getMsg().equals("芯片不存在")) { soundPoolHelper.play("factory_operator_error", false); } //保存未提交信息 if (event.getMsg().indexOf("请检查您的网络状态") != -1) { if (noNetMsg.equals("正常")) { if (event.isNoNetRepeatFlag()) { toast("标签重复使用"); } else { String noNetChipListstr = (String) SPUtils.get("noNetChipList", ""); List noNetChipList; if (TextUtils.isEmpty(noNetChipListstr)) { noNetChipList = new ArrayList<>(); } else { noNetChipList = (List) JSONArray.parse(noNetChipListstr); } noNetChipList.add(chipNumber + ""); SPUtils.put("noNetChipList", JSONArray.toJSONString(noNetChipList)); Intent in = new Intent(this, NoNetReportActivity.class); in.putExtra("isWarning", isWarning); startActivity(in); String user_id = (String) SPUtils.get("USER_ID", ""); if (!user_id.equals("")) { ArrayList chipModelList = (ArrayList) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList()); chipModelList.add(chipModel); SPUtils.put("CHIP_MODEL_LIST_" + user_id, chipModelList); SPUtils.remove("INOCULATOR_LIST"); finish(); } } } else { //toast("标签异常"); toast(noNetMsg); } } } @Override public void uploadChipError(String msg, boolean noNetRepeatFlag) { EventBus.getDefault().post(new ReadingErrorEvent(msg, noNetRepeatFlag)); if (!msg.contains("请检查您的网络状态")) { toast(msg); } issao = false; //读取结束 } @Override public void uploadChipSuccess(VnDetailBean data) { VnDetailBean.DataBean dataBean = data.getData(); /* if (!dataBean.isReviewed()) {*/ Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class); Log.e("getReviewId",""+dataBean.getReviewId()); in.putExtra("dataBean", dataBean); in.putExtra("isWarning", isWarning); in.putExtra("status", dataBean.getStatus()); startActivityFinish(in); /* } else { //复核后再次使用 warning(); }*/ issao = false; //读取结束 } private void warning() { new EvvmMsgDiago.Builder(this) .setTitle("此疫苗已有超温记录,是否继续使用?") // 标题可以不用填写 .setConfirm("确定") .setCancel("取消") // 设置 null 表示不显示取消按钮 //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框 .setListener(new EvvmMsgDiago.OnListener() { @Override public void onConfirm(Dialog dialog) { uploadChip(true); } @Override public void onCancel(Dialog dialog) { } }) .show(); } @Override protected void onStart() { super.onStart(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { animation.cancel(); alp.cancel(); if (mHandler != null) { mHandler.removeCallbacksAndMessages(null); } if (waithandler != null) { waithandler.removeCallbacksAndMessages(null); } // soundPoolHelper.release(); super.onDestroy(); } @Override public boolean isSupportSwipeBack() { // 不使用侧滑功能 return false; } public static void longE(String tag, String msg) { //信息太长,分段打印 //因为String的length是字符数量不是字节数量所以为了防止中文字符过多, // 把4*1024的MAX字节打印长度改为2001字符数 int max_str_length = 2001 - tag.length(); //大于4000时 while (msg.length() > max_str_length) { Log.i(tag, msg.substring(0, max_str_length)); msg = msg.substring(max_str_length); } //剩余部分 Log.e(tag, msg); } }