package eVVM.apk.ui.first; import android.content.Intent; import android.location.Location; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.os.Parcelable; import android.os.Bundle; import android.util.Log; import android.view.View; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import butterknife.OnClick; import eVVM.apk.R; import eVVM.apk.helper.GPS.GPSLocationListener; import eVVM.apk.helper.GPS.GPSLocationManager; import eVVM.apk.helper.SPUtils; import eVVM.apk.helper.SoundPoolHelper; import eVVM.apk.ui.bean.UploadChipBean; import eVVM.apk.ui.home.BaseNfcActivity; import eVVM.apk.helper.ActivityStackManager; import eVVM.apk.helper.DoubleClickHelper; import eVVM.apk.ui.home.uploadChip.UploadChipContract; import eVVM.apk.ui.report.vndetail.VnReportDetailActivity; import eVVM.apk.ui.report.vndetail.VnReportDetailForDoctorActivity; public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View { private GPSLocationManager gpsLocationManager; private Location location; private boolean isWarning = false; @Override protected int getLayoutId() { return R.layout.activity_reading; } @Override protected int getTitleId() { return R.id.reading_title; } @Override protected void initView() { soundPoolHelper = new SoundPoolHelper(4,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); } @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); gpsLocationManager = GPSLocationManager.getInstances(ReadingActivity.this); } private SoundPoolHelper soundPoolHelper; @Override public void uploadChipError(String msg) { if(msg.equals("芯片不存在")){ soundPoolHelper.play("factory_operator_error",false); } toast(msg); } @Override public void uploadChipSuccess(UploadChipBean data) { soundPoolHelper.play("factory_operator_success",false); SPUtils.remove("INOCULATOR_LIST"); } /** * 读取NFC标签文本数据 */ private String readNfcTag(Intent intent) { 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()); } alarmDetection(bArray,sb.substring(6,56 * 2)); return sb.toString(); } catch (Exception e) { throw new IllegalArgumentException(); } } @Override public void onNewIntent(Intent intent) { isWarning = false; String textRecord = readNfcTag(intent); if(textRecord != null && textRecord.length() > 56 * 2){ if(location != null){ String inoculatorIds = (String) SPUtils.get("INOCULATOR_LIST",""); if(inoculatorIds.equals("")){ toast("无受种者信息"); } getPresenter().forDoctor(textRecord.substring(6,56 * 2),textRecord,inoculatorIds,location.getLongitude(),location.getLatitude()); Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class); in.putExtra("VnchipNumber",textRecord.substring(6,56 * 2)); in.putExtra("isWarning",isWarning); startActivity(in); }else{ toast("位置信息获取失败"); } }else{ toast("芯片识别错误"); } } public void alarmDetection(byte[] bytes,String chipNumber){ try{ //将byte[]转为各种进制的字符串 String binaryStr = new BigInteger(1, bytes).toString(2); int startIndex = (3 + 16 + 16 + 1 + 4 + 7 ) * 4 + 1 * 4 ; //减去前边非温度部分和启用后的一小时 int marginRight = 2 * 4; //减去疫苗使用前的两小时 String binaryArr[] = new String[(binaryStr.length() - marginRight) / 2 - startIndex]; for (int i = startIndex; i < (binaryStr.length() - marginRight) / 2; i++) { binaryArr[i - startIndex] = 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); } } } // 48小时 int type = Integer.parseInt(chipNumber.substring(1,2), 16); int category = Integer.parseInt(SPUtils.get("categorytimes_" + type,48).toString()); if((exceedingIndexs.size() - 1) / 2.f > category){ // toast("报警"); isWarning = true; }else{ // toast("正常"); } }catch (Exception e){ e.printStackTrace(); } } @Override protected void onStart() { super.onStart(); //开启定位 gpsLocationManager.start(new ReadingActivity.MyListener()); } @Override protected void onStop() { super.onStop(); //终止定位 gpsLocationManager.stop(); } @Override protected void onDestroy() { super.onDestroy(); } class MyListener implements GPSLocationListener { @Override public void UpdateLocation(Location _location) { if (_location != null) { location = _location; } } @Override public void UpdateStatus(String provider, int status, Bundle extras) { if ("gps" == provider) { //Toast.makeText(FactoryOperatorActivity.this, "定位类型:" + provider, Toast.LENGTH_SHORT).show(); } } @Override public void UpdateGPSProviderStatus(int gpsStatus) { } } // // @Override // public void onBackPressed() { // if (DoubleClickHelper.isOnDoubleClick()) { // //移动到上一个任务栈,避免侧滑引起的不良反应 // moveTaskToBack(false); // postDelayed(new Runnable() { // // @Override // public void run() { // // 进行内存优化,销毁掉所有的界面 // ActivityStackManager.getInstance().finishAllActivities(); // // 销毁进程 // System.exit(0); // } // }, 300); // } else { // toast(getResources().getString(R.string.home_exit_hint)); // } // } @Override public boolean isSupportSwipeBack() { // 不使用侧滑功能 return false; } }