糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > android nfc 原始读取 Android NFC读取数据

android nfc 原始读取 Android NFC读取数据

时间:2021-04-25 13:53:19

相关推荐

android nfc 原始读取 Android NFC读取数据

1、添加相应的权限和gradle引用

android:name="android.hardware.nfc"

android:required="true"/><?xml version="1.0"encoding="utf-8"?>

android.nfc.tech.IsoDep-->

android.nfc.tech.NfcAtech>

android.nfc.tech.NfcB-->

android.nfc.tech.NfcF-->

android.nfc.tech.NfcV-->

android.nfc.tech.Ndeftech>

android.nfc.tech.NdefFormatable-->

android.nfc.tech.MifareClassic-->

android.nfc.tech.MifareUltralight-->

tech-list>

resources>

tech-list>resources>

3、使用NFC的activity添加设置

android:launchMode="singleTop">

intent-filter>

intent-filter>

intent-filter>

android:resource="@xml/nfc_tech_filter"/>

activity>

4、NFCActivity代码packagecom.sam.more.activitys.rfid_nfc;

importandroid.annotation.SuppressLint;importandroid.app.PendingIntent;importandroid.content.Intent;importandroid.nfc.NdefMessage;importandroid.nfc.NfcAdapter;importandroid.os.Bundle;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;importandroid.widget.Toast;

importcom.sam.more.R;

importjava.util.Calendar;importjava.util.List;

importbutterknife.BindView;importbutterknife.ButterKnife;importbutterknife.OnClick;/**

*Author:Sam

*Date:/11/259:41

*Describe:NFC读取数据页面*/

publicclassNFCActivityextendsAppCompatActivity{

privatestaticfinalStringTAG="NfcActivity";

@BindView(R.id.tv_show_nfc)

TextViewtvShowNfc;

@BindView(R.id.btn_clean)

ButtonbtnClean;privatePendingIntentmPendingIntent;privateNfcAdaptermNfcAdapter;

@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);

setContentView(R.layout.activity_nfc);

ButterKnife.bind(this);

Log.i(TAG,"onCreate:");

//初始化nfc

mNfcAdapter=NfcAdapter.getDefaultAdapter(this);

mPendingIntent=PendingIntent.getActivity(this,0,newIntent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);if(mNfcAdapter==null){

Toast.makeText(this,"NFC不可用",Toast.LENGTH_SHORT).show();

finish();return;

}

}

@OverrideprotectedvoidonResume(){super.onResume();

Log.i(TAG,"onResume:");if(mNfcAdapter!=null){//有nfc功能

if(mNfcAdapter.isEnabled()){//nfc功能打开了//隐式启动

mNfcAdapter.enableForegroundDispatch(this,mPendingIntent,null,null);

}else{

Toast.makeText(this,"请打开NFC功能",Toast.LENGTH_SHORT).show();

}

}

}

@OverrideprotectedvoidonNewIntent(Intentintent){super.onNewIntent(intent);

Log.i(TAG,"onNewIntent:");

setIntent(intent);if(mNfcAdapter!=null){//有nfc功能

if(mNfcAdapter.isEnabled()){//nfc功能打开了resolveIntent(getIntent());

}else{

Toast.makeText(this,"请打开NFC功能",Toast.LENGTH_SHORT).show();

}

}

}

@OverrideprotectedvoidonPause(){super.onPause();if(mNfcAdapter!=null){

mNfcAdapter.disableForegroundDispatch(this);

}

}

//初次判断是什么类型的NFC卡

privatevoidresolveIntent(Intentintent){

NdefMessage[]msgs=NfcUtils.getNdefMsg(intent);//重点功能,解析nfc标签中的数据

if(msgs==null){

Toast.makeText(this,"非NFC启动",Toast.LENGTH_SHORT).show();

}else{

setNFCMsgView(msgs);

}

}

/**

*显示扫描后的信息

*

*@paramndefMessagesndef数据*/

@SuppressLint("SetTextI18n")privatevoidsetNFCMsgView(NdefMessage[]ndefMessages){if(ndefMessages==null||ndefMessages.length==0){return;

}

Calendarcalendar=Calendar.getInstance();inthour=calendar.get(Calendar.HOUR_OF_DAY);intminute=calendar.get(Calendar.MINUTE);

tvShowNfc.append(hour+":"+minute+"\n");

Listrecords=NdefMessageParser.parse(ndefMessages[0]);finalintsize=records.size();for(inti=0;i

ParsedNdefRecordrecord=records.get(i);

tvShowNfc.append(record.getViewText()+"\n");

}

}

@OnClick({R.id.btn_clean})publicvoidonViewClicked(Viewview){switch(view.getId()){caseR.id.btn_clean:

tvShowNfc.setText("");break;

}

}

}

NfcUtils工具类packagecom.sam.more.activitys.rfid_nfc;

importandroid.content.Intent;importandroid.nfc.NdefMessage;importandroid.nfc.NdefRecord;importandroid.nfc.NfcAdapter;importandroid.nfc.Tag;importandroid.nfc.tech.MifareClassic;importandroid.nfc.tech.MifareUltralight;importandroid.os.Parcelable;importandroid.util.Log;

importjava.util.Arrays;

/**

*Auther:Sam

*Time:/11/2417:26

*Describe:*/

publicclassNfcUtils{privatestaticfinalStringTAG="NfcUtil";

/**

*解析ndefRecord文本数据

*

*@paramndefRecord

*@return

*/

publicstaticStringparse(NdefRecordndefRecord){//verifytnf得到TNF的值

if(ndefRecord.getTnf()!=NdefRecord.TNF_WELL_KNOWN){returnnull;

}

//得到字节数组进行判断

if(!Arrays.equals(ndefRecord.getType(),NdefRecord.RTD_TEXT)){returnnull;

}

try{//获得一个字节流

byte[]payload=ndefRecord.getPayload();//payload[0]取第一个字节。0x80:十六进制(最高位是1剩下全是0)

StringtextEncoding=((payload[0]&0x80)==0)?"UTF-8":"UTF-16";//获得语言编码长度

intlanguageCodeLength=payload[0]&0x3f;//获得语言编码

StringlanguageCode=newString(payload,1,languageCodeLength,"US-ASCII");//Stringtext=newString(payload,languageCodeLength+1,payload.length-languageCodeLength-1,textEncoding);

returntext;

}catch(Exceptione){thrownewIllegalArgumentException();

}

}

//初次判断是什么类型的NFC卡

publicstaticNdefMessage[]getNdefMsg(Intentintent){if(intent==null)returnnull;

//nfc卡支持的格式

Tagtag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

String[]temp=tag.getTechList();for(Strings:temp){

Log.i(TAG,"resolveIntenttag:"+s);

}

Stringaction=intent.getAction();

if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)||

NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)||

NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)){

Parcelable[]rawMessage=intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

NdefMessage[]ndefMessages;

//判断是哪种类型的数据默认为NDEF格式

if(rawMessage!=null){

Log.i(TAG,"getNdefMsg:ndef格式");

ndefMessages=newNdefMessage[rawMessage.length];for(inti=0;i

ndefMessages[i]=(NdefMessage)rawMessage[i];

}

}else{//未知类型

Log.i(TAG,"getNdefMsg:未知类型");byte[]empty=newbyte[0];byte[]id=intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);

Parcelableparcelable=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);byte[]payload=dumpTagData(parcelable).getBytes();

NdefRecordrecord=newNdefRecord(NdefRecord.TNF_UNKNOWN,empty,id,payload);

NdefMessagemsg=newNdefMessage(newNdefRecord[]{record});

ndefMessages=newNdefMessage[]{msg};

}

returnndefMessages;

}

returnnull;

}

//一般公交卡,扫描的信息

privatestaticStringdumpTagData(Parcelablep){

StringBuildersb=newStringBuilder();

Tagtag=(Tag)p;byte[]id=tag.getId();

sb.append("TagID(hex):").append(getHex(id)).append("\n");

sb.append("TagID(dec):").append(getDec(id)).append("\n");

sb.append("ID(reversed):").append(getReversed(id)).append("\n");

Stringprefix="android.nfc.tech.";

sb.append("Technologies:");for(Stringtech:tag.getTechList()){

sb.append(tech.substring(prefix.length()));

sb.append(",");

}

sb.delete(sb.length()-2,sb.length());for(Stringtech:tag.getTechList()){if(tech.equals(MifareClassic.class.getName())){

sb.append('\n');

MifareClassicmifareTag=MifareClassic.get(tag);

Stringtype="Unknown";switch(mifareTag.getType()){caseMifareClassic.TYPE_CLASSIC:

type="Classic";break;caseMifareClassic.TYPE_PLUS:

type="Plus";break;caseMifareClassic.TYPE_PRO:

type="Pro";break;

}

sb.append("MifareClassictype:");

sb.append(type);

sb.append('\n');

sb.append("Mifaresize:");

sb.append(mifareTag.getSize()+"bytes");

sb.append('\n');

sb.append("Mifaresectors:");

sb.append(mifareTag.getSectorCount());

sb.append('\n');

sb.append("Mifareblocks:");

sb.append(mifareTag.getBlockCount());

}

if(tech.equals(MifareUltralight.class.getName())){

sb.append('\n');

MifareUltralightmifareUlTag=MifareUltralight.get(tag);

Stringtype="Unknown";switch(mifareUlTag.getType()){caseMifareUltralight.TYPE_ULTRALIGHT:

type="Ultralight";break;caseMifareUltralight.TYPE_ULTRALIGHT_C:

type="UltralightC";break;

}

sb.append("MifareUltralighttype:");

sb.append(type);

}

}returnsb.toString();

}

privatestaticStringgetHex(byte[]bytes){

StringBuildersb=newStringBuilder();for(inti=bytes.length-1;i>=0;--i){intb=bytes[i]&0xff;if(b

sb.append('0');

sb.append(Integer.toHexString(b));if(i>0){

sb.append("");

}

}returnsb.toString();

}

privatestaticlonggetDec(byte[]bytes){longresult=0;longfactor=1;for(inti=0;i

result+=value*factor;

factor*=256l;

}returnresult;

}

privatestaticlonggetReversed(byte[]bytes){longresult=0;longfactor=1;for(inti=bytes.length-1;i>=0;--i){longvalue=bytes[i]&0xffl;

result+=value*factor;

factor*=256l;

}returnresult;

}

}

如果觉得《android nfc 原始读取 Android NFC读取数据》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。