package eVVM.apk.ui.home; import android.app.PendingIntent; import android.content.Intent; import android.nfc.FormatException; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.Tag; import android.nfc.tech.Ndef; import android.os.Parcelable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Locale; import eVVM.apk.R; import eVVM.apk.common.MyActivity; import eVVM.apk.helper.ActivityStackManager; import eVVM.apk.helper.DoubleClickHelper; /** * 厂家操作员登录页面 */ public class FactoryOperatorActivity extends MyActivity { private PendingIntent mPendingIntent; private Tag mTag; private NfcAdapter mNfcAdapter; @Override protected int getLayoutId() { return R.layout.activity_factory_operator; } @Override protected int getTitleId() { return 0; //标题栏id } @Override protected void initView() { //初始化view oncreat() readNdef(); } @Override protected void initData() { //初始化数据 } private void readNdef(){ if (mTag == null){ toast("不能识别的标签类型!"); finish(); return; } Ndef ndef = Ndef.get(mTag);//获取ndef对象 try { ndef.connect();//连接 NdefMessage ndefMessage = ndef.getNdefMessage();//获取NdefMessage对象 if (ndefMessage!=null){ Log.e("***",parseTextRecord(ndefMessage.getRecords()[0])); } toast("数据读取成功!"); } catch (IOException e) { e.printStackTrace(); } catch (FormatException e) { e.printStackTrace(); }finally { try { ndef.close();//关闭链接 } catch (IOException e) { e.printStackTrace(); } } } /** * 解析NDEF文本数据,从第三个字节开始,后面的文本数据 * @param ndefRecord * @return */ public static String parseTextRecord(NdefRecord ndefRecord) { /** * 判断数据是否为NDEF格式 */ //判断TNF if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) { return null; } //判断可变的长度的类型 if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) { return null; } try { //获得字节数组,然后进行分析 byte[] payload = ndefRecord.getPayload(); //下面开始NDEF文本数据第一个字节,状态字节 //判断文本是基于UTF-8还是UTF-16的,取第一个字节"位与"上16进制的80,16进制的80也就是最高位是1, //其他位都是0,所以进行"位与"运算后就会保留最高位 String textEncoding = ((payload[0] & 0x80) == 0) ? "UTF-8" : "UTF-16"; //3f最高两位是0,第六位是1,所以进行"位与"运算后获得第六位 int languageCodeLength = payload[0] & 0x3f; //下面开始NDEF文本数据第二个字节,语言编码 //获得语言编码 String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); //下面开始NDEF文本数据后面的字节,解析出文本 String textRecord = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); return textRecord; } catch (Exception e) { throw new IllegalArgumentException(); } } /** * 创建NDEF文本数据 * @param text * @return */ public static NdefRecord createTextRecord(String text) { byte[] langBytes = Locale.CHINA.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = Charset.forName("UTF-8"); //将文本转换为UTF-8格式 byte[] textBytes = text.getBytes(utfEncoding); //设置状态字节编码最高位数为0 int utfBit = 0; //定义状态字节 char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; //设置第一个状态字节,先将状态码转换成字节 data[0] = (byte) status; //设置语言编码,使用数组拷贝方法,从0开始拷贝到data中,拷贝到data的1到langBytes.length的位置 System.arraycopy(langBytes, 0, data, 1, langBytes.length); //设置文本字节,使用数组拷贝方法,从0开始拷贝到data中,拷贝到data的1 + langBytes.length //到textBytes.length的位置 System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); //通过字节传入NdefRecord对象 //NdefRecord.RTD_TEXT:传入类型 读写 NdefRecord ndefRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); return ndefRecord; } @Override protected void onStart() { super.onStart(); if(!checkGpsAndNfc()){ finish(); } //创建PendingIntent对象,当检测到一个Tag标签就会执行此Intent mNfcAdapter= NfcAdapter.getDefaultAdapter(this);//设备的NfcAdapter对象 mPendingIntent=PendingIntent.getActivity(this,0,new Intent(this,getClass()),0); } @Override protected void onStop() { super.onStop(); } @Override protected void onResume() { super.onResume(); if (mNfcAdapter!=null){ //打开前台发布系统,使页面优于其它nfc处理.当检测到一个Tag标签就会执行mPendingIten mNfcAdapter.enableForegroundDispatch(this,mPendingIntent,null,null); } } @Override protected void onPause() { super.onPause(); if(mNfcAdapter!=null){ mNfcAdapter.disableForegroundDispatch(this);//关闭前台发布系统 } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); mTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);//获取到Tag标签对象 String[] techList = mTag.getTechList(); System.out.println("标签支持的tachnology类型:"); for (String tech:techList){ System.out.println(tech); } } @Override protected void onDestroy() { super.onDestroy(); } @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; } }