7febb35db94b66f753c3e966ef603c1d6b34bfbb.svn-base 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package eVVM.apk.ui.vaccination;
  2. import android.content.Intent;
  3. import android.location.Location;
  4. import android.nfc.NdefMessage;
  5. import android.nfc.NdefRecord;
  6. import android.nfc.NfcAdapter;
  7. import android.os.Bundle;
  8. import android.os.Parcelable;
  9. import android.view.View;
  10. import android.view.animation.AlphaAnimation;
  11. import android.view.animation.Animation;
  12. import android.view.animation.CycleInterpolator;
  13. import android.view.animation.LinearInterpolator;
  14. import android.view.animation.RotateAnimation;
  15. import android.widget.ImageView;
  16. import java.math.BigInteger;
  17. import java.util.ArrayList;
  18. import java.util.Arrays;
  19. import java.util.LinkedList;
  20. import butterknife.BindView;
  21. import butterknife.OnClick;
  22. import eVVM.apk.R;
  23. import eVVM.apk.helper.GPS.GPSLocationListener;
  24. import eVVM.apk.helper.GPS.GPSLocationManager;
  25. import eVVM.apk.helper.SPUtils;
  26. import eVVM.apk.helper.SoundPoolHelper;
  27. import eVVM.apk.ui.bean.VnDetailBean;
  28. import eVVM.apk.ui.home.BaseNfcActivity;
  29. import eVVM.apk.ui.home.uploadChip.UploadChipContract;
  30. import eVVM.apk.ui.vaccination.save.ChipModel;
  31. public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View {
  32. private GPSLocationManager gpsLocationManager;
  33. private Location location;
  34. private boolean isWarning = false;
  35. private ChipModel chipModel;
  36. @BindView(R.id.reading__line)
  37. ImageView imgreadline;
  38. @Override
  39. protected int getLayoutId() {
  40. return R.layout.activity_reading;
  41. }
  42. @Override
  43. protected int getTitleId() {
  44. return R.id.reading_title;
  45. }
  46. @Override
  47. protected void initView() {
  48. getAnimationSao(); //进行雷达扫描动画
  49. soundPoolHelper = new SoundPoolHelper(4,SoundPoolHelper.TYPE_MUSIC)
  50. .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
  51. .loadDefault(ReadingActivity.this)
  52. .load(ReadingActivity.this,"factory_operator_success",R.raw.factory_operator_success)
  53. .load(ReadingActivity.this,"factory_operator_error",R.raw.factory_operator_error);
  54. }
  55. private void getAnimationSao() {
  56. Animation animation=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
  57. animation.setFillAfter(true);
  58. animation.setDuration(2000); //两秒转一圈
  59. animation.setInterpolator(new LinearInterpolator());
  60. animation.setRepeatCount(Animation.INFINITE); //循环执行
  61. imgreadline.startAnimation(animation);
  62. 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,
  63. R.id.reading_antenna7,R.id.reading_antenna8,R.id.reading_antenna9};
  64. int nfcWireIndex = 2;
  65. try{
  66. nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL","2")));
  67. }catch (Exception e){
  68. e.printStackTrace();
  69. }
  70. AlphaAnimation alp = new AlphaAnimation(1, 0.2f);
  71. alp.setStartOffset(500);
  72. alp.setDuration(1000);
  73. alp.setFillAfter(false);
  74. alp.setInterpolator(new CycleInterpolator(2));
  75. alp.setRepeatCount(Animation.INFINITE);
  76. findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
  77. alp.start();
  78. }
  79. @OnClick({R.id.again_bt})
  80. public void onViewClicked(View view) {
  81. switch (view.getId()) {
  82. case R.id.again_bt:
  83. startActivityFinish(QrCodeActivity.class);
  84. break;
  85. }
  86. }
  87. @Override
  88. protected void initData() {
  89. mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
  90. gpsLocationManager = GPSLocationManager.getInstances(ReadingActivity.this);
  91. }
  92. private SoundPoolHelper soundPoolHelper;
  93. /**
  94. * 读取NFC标签文本数据
  95. */
  96. private String readNfcTag(Intent intent) {
  97. if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
  98. Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES);
  99. NdefMessage msgs[] = null;
  100. if (rawMsgs != null) {
  101. msgs = new NdefMessage[rawMsgs.length];
  102. for (int i = 0; i < rawMsgs.length; i++) {
  103. msgs[i] = (NdefMessage) rawMsgs[i];
  104. }
  105. }
  106. try {
  107. if (msgs != null) {
  108. NdefRecord record = msgs[0].getRecords()[0];
  109. return parseTextRecord(record);
  110. }
  111. } catch (Exception e) {
  112. }
  113. }
  114. return null;
  115. }
  116. public String parseTextRecord(NdefRecord ndefRecord) {
  117. if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
  118. return null;
  119. }
  120. if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
  121. return null;
  122. }
  123. try {
  124. byte[] bArray = ndefRecord.getPayload();
  125. StringBuffer sb = new StringBuffer(bArray.length);
  126. String sTemp;
  127. for (int i = 0; i < bArray.length; i++) {
  128. sTemp = Integer.toHexString(0xFF & bArray[i]);
  129. if (sTemp.length() < 2)
  130. sb.append(0);
  131. sb.append(sTemp.toUpperCase());
  132. }
  133. alarmDetection(bArray,sb.substring(6,chipNumberEndIndex));
  134. return sb.toString();
  135. } catch (Exception e) {
  136. throw new IllegalArgumentException();
  137. }
  138. }
  139. @Override
  140. public void onNewIntent(Intent intent) {
  141. isWarning = false;
  142. String textRecord = readNfcTag(intent);
  143. if(textRecord != null && textRecord.length() > chipNumberEndIndex){
  144. if(location != null){
  145. String inoculatorIds = (String) SPUtils.get("INOCULATOR_LIST","");
  146. // if(inoculatorIds.equals("")){
  147. // toast("无受种者信息");
  148. // }
  149. String chipNumber = textRecord.substring(6,chipNumberEndIndex);
  150. getPresenter().forDoctor(chipNumber,textRecord,inoculatorIds,location.getLongitude(),location.getLatitude());
  151. chipModel = new ChipModel(chipNumber,textRecord,inoculatorIds,location.getLongitude(),location.getLatitude());
  152. }else{
  153. toast("位置信息获取失败");
  154. }
  155. }else{
  156. toast("芯片识别错误");
  157. }
  158. }
  159. @Override
  160. public void uploadChipError(String msg) {
  161. if(msg.equals("芯片不存在")){
  162. soundPoolHelper.play("factory_operator_error",false);
  163. }
  164. //保存未提交信息
  165. if(msg.indexOf("请检查您的网络状态") != -1 ){
  166. String user_id = (String) SPUtils.get("USER_ID", "");
  167. if (!user_id.equals("")){
  168. ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id,new ArrayList<ChipModel> ());
  169. chipModelList.add(chipModel);
  170. SPUtils.put("CHIP_MODEL_LIST_" + user_id,chipModelList);
  171. SPUtils.remove("INOCULATOR_LIST");
  172. finish();
  173. }
  174. }
  175. toast(msg);
  176. }
  177. @Override
  178. public void uploadChipSuccess(VnDetailBean data) {
  179. VnDetailBean.DataBean dataBean = data.getData();
  180. soundPoolHelper.play("factory_operator_success",false);
  181. SPUtils.remove("INOCULATOR_LIST");
  182. Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class);
  183. in.putExtra("dataBean",dataBean);
  184. in.putExtra("isWarning",isWarning);
  185. startActivityFinish(in);
  186. }
  187. //判断是否报警
  188. public void alarmDetection(byte[] bytes,String chipNumber){
  189. try{
  190. //将byte[]转为各种进制的字符串
  191. String binaryStr = new BigInteger(1, bytes).toString(2);
  192. int startIndex = (3 + 16 + 16 + 1 + 4 + 7 ) * 4 + 1 * 4 ; //减去前边非温度部分和启用后的一小时
  193. int marginRight = 2 * 4; //减去疫苗使用前的两小时
  194. String binaryArr[] = new String[(binaryStr.length() - marginRight) / 2 - startIndex];
  195. for (int i = startIndex; i < (binaryStr.length() - marginRight) / 2; i++) {
  196. binaryArr[i - startIndex] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1);
  197. }
  198. LinkedList<Integer> exceedingIndexs = new LinkedList<Integer>();
  199. exceedingIndexs.add(-1);
  200. for (int i = 0; i < binaryArr.length; i++) { //不计算开始的一小时和最后两小时
  201. if(!binaryArr[i].equals("01")){
  202. if(i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)){
  203. exceedingIndexs.add(i);
  204. }
  205. if(i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)){
  206. exceedingIndexs.add(i + 1);
  207. }
  208. }
  209. }
  210. // 48小时
  211. int type = Integer.parseInt(chipNumber.substring(1,2), 16);
  212. int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + type,48).toString());
  213. if((exceedingIndexs.size() - 1) / 2.f > category){
  214. // toast("报警");
  215. isWarning = true;
  216. }else{
  217. isWarning = false;
  218. // toast("正常");
  219. }
  220. }catch (Exception e){
  221. e.printStackTrace();
  222. }
  223. }
  224. @Override
  225. protected void onStart() {
  226. super.onStart();
  227. //开启定位
  228. gpsLocationManager.start(new ReadingActivity.MyListener());
  229. }
  230. @Override
  231. protected void onStop() {
  232. super.onStop();
  233. //终止定位
  234. gpsLocationManager.stop();
  235. }
  236. @Override
  237. protected void onDestroy() {
  238. super.onDestroy();
  239. }
  240. class MyListener implements GPSLocationListener {
  241. @Override
  242. public void UpdateLocation(Location _location) {
  243. if (_location != null) {
  244. location = _location;
  245. }
  246. }
  247. @Override
  248. public void UpdateStatus(String provider, int status, Bundle extras) {
  249. if ("gps" == provider) {
  250. //Toast.makeText(FactoryOperatorActivity.this, "定位类型:" + provider, Toast.LENGTH_SHORT).show();
  251. }
  252. }
  253. @Override
  254. public void UpdateGPSProviderStatus(int gpsStatus) {
  255. }
  256. }
  257. //
  258. // @Override
  259. // public void onBackPressed() {
  260. // if (DoubleClickHelper.isOnDoubleClick()) {
  261. // //移动到上一个任务栈,避免侧滑引起的不良反应
  262. // moveTaskToBack(false);
  263. // postDelayed(new Runnable() {
  264. //
  265. // @Override
  266. // public void run() {
  267. // // 进行内存优化,销毁掉所有的界面
  268. // ActivityStackManager.getInstance().finishAllActivities();
  269. // // 销毁进程
  270. // System.exit(0);
  271. // }
  272. // }, 300);
  273. // } else {
  274. // toast(getResources().getString(R.string.home_exit_hint));
  275. // }
  276. // }
  277. @Override
  278. public boolean isSupportSwipeBack() {
  279. // 不使用侧滑功能
  280. return false;
  281. }
  282. }