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读取数据》对你有帮助,请点赞、收藏,并留下你的观点哦!