| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- 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;
- /**
- * 厂家操作员登录页面
- */
- 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();
- }
- }
|