ad4438b8c0105d7183aba334478e5e6ba75e9d50.svn-base 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. package eVVM.apk.ui.vaccination;
  2. import android.animation.Animator;
  3. import android.animation.AnimatorSet;
  4. import android.animation.ObjectAnimator;
  5. import android.app.Dialog;
  6. import android.content.Intent;
  7. import android.content.res.Resources;
  8. import android.nfc.NdefMessage;
  9. import android.nfc.NdefRecord;
  10. import android.nfc.NfcAdapter;
  11. import android.os.Build;
  12. import android.os.Parcelable;
  13. import android.support.annotation.RequiresApi;
  14. import android.util.DisplayMetrics;
  15. import android.util.Log;
  16. import android.view.View;
  17. import android.view.animation.AlphaAnimation;
  18. import android.view.animation.Animation;
  19. import android.view.animation.CycleInterpolator;
  20. import android.view.animation.DecelerateInterpolator;
  21. import android.view.animation.LinearInterpolator;
  22. import android.view.animation.RotateAnimation;
  23. import android.widget.ImageView;
  24. import android.widget.ProgressBar;
  25. import android.widget.RelativeLayout;
  26. import com.hjq.dialog.MessageDialog;
  27. import java.util.ArrayList;
  28. import java.util.Arrays;
  29. import java.util.LinkedList;
  30. import butterknife.BindView;
  31. import butterknife.OnClick;
  32. import eVVM.apk.R;
  33. import eVVM.apk.helper.ConversionUtil;
  34. import eVVM.apk.helper.SPUtils;
  35. import eVVM.apk.helper.SoundPoolHelper;
  36. import eVVM.apk.ui.bean.VnDetailBean;
  37. import eVVM.apk.ui.home.BaseNfcActivity;
  38. import eVVM.apk.ui.home.uploadChip.UploadChipContract;
  39. import eVVM.apk.ui.vaccination.save.ChipModel;
  40. public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View {
  41. private boolean isWarning = false;
  42. private ChipModel chipModel;
  43. private SoundPoolHelper soundPoolHelper;
  44. private String textRecord = "";
  45. private String chipNumber = "";
  46. @BindView(R.id.reading__line)
  47. ImageView imgreadline;
  48. @BindView(R.id.reading_progress)
  49. ProgressBar readingProgress;
  50. @BindView(R.id.fly_phonerl)
  51. RelativeLayout flyphonerl;
  52. private Animation animation;
  53. private AlphaAnimation alp;
  54. private AnimatorSet animatorSetsuofang;
  55. private AnimatorSet animatorSetsuofang2;
  56. @Override
  57. protected int getLayoutId() {
  58. return R.layout.activity_reading;
  59. }
  60. @Override
  61. protected int getTitleId() {
  62. return R.id.reading_title;
  63. }
  64. @Override
  65. protected void initView() {
  66. getAnimationSao(); //进行雷达扫描动画
  67. soundPoolHelper = new SoundPoolHelper(4,SoundPoolHelper.TYPE_MUSIC)
  68. .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
  69. .loadDefault(ReadingActivity.this)
  70. .load(ReadingActivity.this,"factory_operator_success",R.raw.factory_operator_success)
  71. .load(ReadingActivity.this,"factory_operator_error",R.raw.factory_operator_error)
  72. .load(ReadingActivity.this,"xufuhe",R.raw.xufuhe)
  73. .load(ReadingActivity.this,"zhengchang",R.raw.zhengchang);
  74. getFlyPhone();
  75. }
  76. private void getFlyPhone() {
  77. Resources resources = this.getResources();
  78. DisplayMetrics dm = resources.getDisplayMetrics();
  79. int height3 = dm.heightPixels;
  80. //组合动画
  81. animatorSetsuofang = new AnimatorSet();
  82. // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
  83. ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY());
  84. animatorSetsuofang.setDuration(3500);
  85. animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  86. animatorSetsuofang.play(scaleY);
  87. animatorSetsuofang.start();
  88. animatorSetsuofang.addListener(new Animator.AnimatorListener() {
  89. @Override
  90. public void onAnimationStart(Animator animation) {
  91. }
  92. @Override
  93. public void onAnimationEnd(Animator animation) {
  94. postDelayed(new Runnable() {
  95. @Override
  96. public void run() {
  97. //flyphonerl.setVisibility(View.GONE);
  98. animatorSetsuofang.cancel();
  99. getFlyGoBack();
  100. }
  101. }, 3500);
  102. }
  103. @Override
  104. public void onAnimationCancel(Animator animation) {
  105. }
  106. @Override
  107. public void onAnimationRepeat(Animator animation) {
  108. }
  109. });
  110. }
  111. private void getFlyGoBack() {
  112. Resources resources = this.getResources();
  113. DisplayMetrics dm = resources.getDisplayMetrics();
  114. int height3 = dm.heightPixels;
  115. //组合动画
  116. animatorSetsuofang2 = new AnimatorSet();
  117. // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
  118. ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3);
  119. animatorSetsuofang2.setDuration(3000);
  120. animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
  121. animatorSetsuofang2.play(scaleY);
  122. animatorSetsuofang2.start();
  123. animatorSetsuofang2.addListener(new Animator.AnimatorListener() {
  124. @Override
  125. public void onAnimationStart(Animator animation) {
  126. }
  127. @Override
  128. public void onAnimationEnd(Animator animation) {
  129. flyphonerl.setVisibility(View.GONE);
  130. animatorSetsuofang2.cancel();
  131. }
  132. @Override
  133. public void onAnimationCancel(Animator animation) {
  134. }
  135. @Override
  136. public void onAnimationRepeat(Animator animation) {
  137. }
  138. });
  139. }
  140. private void getAnimationSao() {
  141. animation = new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
  142. animation.setFillAfter(true);
  143. animation.setDuration(2000); //两秒转一圈
  144. animation.setInterpolator(new LinearInterpolator());
  145. animation.setRepeatCount(Animation.INFINITE); //循环执行
  146. imgreadline.startAnimation(animation);
  147. 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,
  148. R.id.reading_antenna7,R.id.reading_antenna8,R.id.reading_antenna9};
  149. int nfcWireIndex = 2;
  150. try{
  151. nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL","2")));
  152. }catch (Exception e){
  153. e.printStackTrace();
  154. }
  155. alp = new AlphaAnimation(1, 0.2f);
  156. alp.setStartOffset(500);
  157. alp.setDuration(1000);
  158. alp.setFillAfter(false);
  159. alp.setInterpolator(new CycleInterpolator(2));
  160. alp.setRepeatCount(Animation.INFINITE);
  161. findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
  162. alp.start();
  163. }
  164. @OnClick({R.id.again_bt})
  165. public void onViewClicked(View view) {
  166. switch (view.getId()) {
  167. case R.id.again_bt:
  168. startActivityFinish(QrCodeActivity.class);
  169. break;
  170. }
  171. }
  172. @Override
  173. protected void initData() {
  174. mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
  175. }
  176. /**
  177. * 读取NFC标签文本数据
  178. */
  179. private String readNfcTag(Intent intent) {
  180. readingProgress.setProgress(0);
  181. if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
  182. Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES);
  183. NdefMessage msgs[] = null;
  184. if (rawMsgs != null) {
  185. msgs = new NdefMessage[rawMsgs.length];
  186. for (int i = 0; i < rawMsgs.length; i++) {
  187. msgs[i] = (NdefMessage) rawMsgs[i];
  188. }
  189. }
  190. try {
  191. if (msgs != null) {
  192. NdefRecord record = msgs[0].getRecords()[0];
  193. return parseTextRecord(record);
  194. }
  195. } catch (Exception e) {
  196. }
  197. }
  198. return null;
  199. }
  200. public String parseTextRecord(NdefRecord ndefRecord) {
  201. if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
  202. return null;
  203. }
  204. if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
  205. return null;
  206. }
  207. try {
  208. byte[] bArray = ndefRecord.getPayload();
  209. StringBuffer sb = new StringBuffer(bArray.length);
  210. String sTemp;
  211. for (int i = 0; i < bArray.length; i++) {
  212. sTemp = Integer.toHexString(0xFF & bArray[i]);
  213. if (sTemp.length() < 2)
  214. sb.append(0);
  215. sb.append(sTemp.toUpperCase());
  216. }
  217. return sb.toString();
  218. } catch (Exception e) {
  219. throw new IllegalArgumentException();
  220. }
  221. }
  222. @Override
  223. public void onNewIntent(Intent intent) {
  224. textRecord = readNfcTag(intent);
  225. if(textRecord == null || textRecord.length() < chipNumberEndIndex){
  226. toast("读取失败");
  227. return;
  228. }
  229. isWarning = false;
  230. chipNumber = textRecord.substring(6,chipNumberEndIndex);
  231. uploadChip();
  232. alarmDetection();
  233. }
  234. //判断是否报警
  235. public void alarmDetection(){
  236. try{
  237. String binaryStr = ConversionUtil.hexToBins(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2));
  238. binaryStr = binaryStr.substring(4,binaryStr.length() - 8); //减去启用后的一小时和注射前的两小时
  239. Log.e("温度二进制",binaryStr);
  240. String binaryArr[] = new String[binaryStr.length() / 2];
  241. for (int i = 0; i < binaryArr.length ; i++) {
  242. binaryArr[i] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1);
  243. }
  244. LinkedList<Integer> exceedingIndexs = new LinkedList<Integer>();
  245. exceedingIndexs.add(-1);
  246. for (int i = 0; i < binaryArr.length; i++) {
  247. if(!binaryArr[i].equals("01")){
  248. if(i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)){
  249. exceedingIndexs.add(i);
  250. }
  251. if(i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)){
  252. exceedingIndexs.add(i + 1);
  253. }
  254. }
  255. }
  256. int type = Integer.parseInt(chipNumber.substring(1,2), 16);
  257. int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + type,48).toString());
  258. if((exceedingIndexs.size() - 1) / 2.f > category){
  259. // toast("报警");
  260. isWarning = true;
  261. soundPoolHelper.play("xufuhe",false);
  262. warning();
  263. }else{
  264. isWarning = false;
  265. soundPoolHelper.play("zhengchang",false);
  266. }
  267. readingProgress.setProgress(100);
  268. }catch (Exception e){
  269. e.printStackTrace();
  270. }
  271. }
  272. private void uploadChip(){
  273. if(textRecord != null && textRecord.length() > chipNumberEndIndex){
  274. if(SPUtils.contains("LOCATION")){
  275. Log.e("LOCATION",SPUtils.get("LOCATION","").toString());
  276. String location[] = SPUtils.get("LOCATION","").toString().split(",");
  277. if(location.length > 1){
  278. Double latitude = Double.parseDouble(location[0]);
  279. Double longitude = Double.parseDouble(location[1]);
  280. String inoculators = (String)SPUtils.get("INOCULATOR_LIST","");
  281. Log.e("chipNumber", chipNumber);
  282. Log.e("textRecord", textRecord);
  283. getPresenter().forDoctor(chipNumber,textRecord,inoculators,longitude,latitude);
  284. chipModel = new ChipModel(chipNumber,textRecord,inoculators,longitude,latitude);
  285. }else {
  286. toast("位置信息错误");
  287. }
  288. }else{
  289. toast("位置信息获取失败");
  290. }
  291. }else{
  292. toast("芯片识别错误");
  293. }
  294. }
  295. @Override
  296. public void uploadChipError(String msg) {
  297. if(msg.equals("芯片不存在")){
  298. // soundPoolHelper.play("factory_operator_error",false);
  299. }
  300. //保存未提交信息
  301. if(msg.indexOf("请检查您的网络状态") != -1 ){
  302. String user_id = (String) SPUtils.get("USER_ID", "");
  303. if (!user_id.equals("")){
  304. ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id,new ArrayList<ChipModel> ());
  305. chipModelList.add(chipModel);
  306. SPUtils.put("CHIP_MODEL_LIST_" + user_id,chipModelList);
  307. SPUtils.remove("INOCULATOR_LIST");
  308. finish();
  309. }
  310. }
  311. toast(msg);
  312. }
  313. @Override
  314. public void uploadChipSuccess(VnDetailBean data) {
  315. VnDetailBean.DataBean dataBean = data.getData();
  316. // soundPoolHelper.play("factory_operator_success",false);
  317. SPUtils.remove("INOCULATOR_LIST");
  318. Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class);
  319. in.putExtra("dataBean",dataBean);
  320. in.putExtra("isWarning",isWarning);
  321. startActivityFinish(in);
  322. }
  323. private void warning(){
  324. new MessageDialog.Builder(this)
  325. .setTitle("") // 标题可以不用填写
  326. .setMessage("此疫苗需复核,是否继续使用?")
  327. .setConfirm("确定")
  328. .setCancel("取消") // 设置 null 表示不显示取消按钮
  329. //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
  330. .setListener(new MessageDialog.OnListener() {
  331. @Override
  332. public void onConfirm(Dialog dialog) {
  333. uploadChip();
  334. }
  335. @Override
  336. public void onCancel(Dialog dialog) {
  337. //toast("取消了");
  338. }
  339. })
  340. .show();
  341. }
  342. @Override
  343. protected void onStart() {
  344. super.onStart();
  345. }
  346. @Override
  347. protected void onStop() {
  348. super.onStop();
  349. }
  350. @Override
  351. protected void onDestroy() {
  352. animation.cancel();
  353. alp.cancel();
  354. super.onDestroy();
  355. }
  356. //
  357. // @Override
  358. // public void onBackPressed() {
  359. // if (DoubleClickHelper.isOnDoubleClick()) {
  360. // //移动到上一个任务栈,避免侧滑引起的不良反应
  361. // moveTaskToBack(false);
  362. // postDelayed(new Runnable() {
  363. //
  364. // @Override
  365. // public void run() {
  366. // // 进行内存优化,销毁掉所有的界面
  367. // ActivityStackManager.getInstance().finishAllActivities();
  368. // // 销毁进程
  369. // System.exit(0);
  370. // }
  371. // }, 300);
  372. // } else {
  373. // toast(getResources().getString(R.string.home_exit_hint));
  374. // }
  375. // }
  376. @Override
  377. public boolean isSupportSwipeBack() {
  378. // 不使用侧滑功能
  379. return false;
  380. }
  381. }