这篇文章主要为大家详细介绍了android中NFC读写功能的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了android中NFC读写功能的具体代码,供大家参考,具体内容如下
首先检查一下设备是否支持NFC功能
private?void?checkNFCFunction()?{ ????????//?TODO?Auto-generated?method?stub ????????mNfcAdapter?=?NfcAdapter.getDefaultAdapter(this); ????????//?check?the?NFC?adapter?first ????????if?(mNfcAdapter?==?null)?{ ????????????//?mTextView.setText("NFC?apdater?is?not?available"); ????????????Dialog?dialog?=?null; ????????????AlertDialog.Builder?customBuilder?=?new?AlertDialog.Builder( ????????????????????this); ????????????customBuilder ????????????????????.setTitle("很遗憾") ????????????????????.setMessage("没发现NFC设备,请确认您的设备支持NFC功能!") ????????????????????.setIcon(R.drawable.ic_banner) ????????????????????.setPositiveButton("是", ????????????????????????????new?DialogInterface.OnClickListener()?{ ????????????????????????????????public?void?onClick(DialogInterface?dialog, ????????????????????????????????????????????????????int?which)?{ ????????????????????????????????????dialog.dismiss(); ????????????????????????????????????finish(); ????????????????????????????????} ????????????????????????????}); ????????????dialog?=?customBuilder.create(); ????????????dialog.setCancelable(false);//?back ????????????dialog.setCanceledOnTouchOutside(false); ????????????SetDialogWidth(dialog).show(); ????????????return; ????????}?else?{ ????????????if?(!mNfcAdapter.isEnabled())?{ ????????????????Dialog?dialog?=?null; ????????????????AlertDialog.Builder?customBuilder?=?new?AlertDialog.Builder( ????????????????????????this); ????????????????customBuilder ????????????????????????.setTitle("提示") ????????????????????????.setMessage("请确认NFC功能是否开启!") ????????????????????????.setIcon(R.drawable.ic_banner) ????????????????????????.setPositiveButton("现在去开启......", ????????????????????????????????new?DialogInterface.OnClickListener()?{ ????????????????????????????????????public?void?onClick(DialogInterface?dialog, ????????????????????????????????????????????????????????int?which)?{ ????????????????????????????????????????dialog.dismiss(); ????????????????????????????????????????Intent?setnfc?=?new?Intent( ????????????????????????????????????????????????Settings.ACTION_NFC_SETTINGS); ????????????????????????????????????????startActivity(setnfc); ????????????????????????????????????} ????????????????????????????????}); ????????????????dialog?=?customBuilder.create(); ????????????????dialog.setCancelable(false);//?back ????????????????dialog.setCanceledOnTouchOutside(false); ????????????????SetDialogWidth(dialog).show(); ????????????????return; ????????????} ????????} ????}
读取NFC信息?
package?com.xxzhy.shujucaiji.fengxiang;
import?android.app.Dialog; import?android.app.PendingIntent; import?android.content.DialogInterface; import?android.content.Intent; import?android.content.IntentFilter; import?android.nfc.FormatException; import?android.nfc.NdefMessage; import?android.nfc.NdefRecord; import?android.nfc.NfcAdapter; import?android.nfc.Tag; import?android.nfc.tech.MifareClassic; import?android.nfc.tech.Ndef; import?android.nfc.tech.NfcA; import?android.nfc.tech.NfcB; import?android.nfc.tech.NfcF; import?android.nfc.tech.NfcV; import?android.os.Bundle; import?android.provider.Settings; import?android.support.v7.app.AlertDialog; import?android.support.v7.app.AppCompatActivity; import?android.text.TextUtils; import?android.util.DisplayMetrics; import?android.util.Log; import?android.view.View; import?android.view.WindowManager; import?android.widget.Button; import?android.widget.LinearLayout; import?android.widget.TextView; import?android.widget.Toast; import?com.xxzhy.shujucaiji.R; import?com.xxzhy.shujucaiji.utils.ByteArrayChange; import?com.xxzhy.shujucaiji.utils.ToStringHex; import?com.xxzhy.shujucaiji.utils.ToastUtil; import?com.xxzhy.shujucaiji.utils.WebServiceClient; import?org.json.JSONException; import?org.json.JSONObject; import?java.io.IOException; import?butterknife.BindView; import?butterknife.ButterKnife;
/** ?*?Created?by?apple?on?2017/10/30. ?*/ public?class?FengxiangThreeActivity?extends?AppCompatActivity?{ ????@BindView(R.id.tv_bianma) ????TextView?tvBianma; ????@BindView(R.id.ll_input) ????LinearLayout?llInput; ????@BindView(R.id.noteText) ????TextView?noteText; ????@BindView(R.id.writeBtn) ????Button?writeBtn; ????String[][]?mTechLists; ????private?Boolean?ifWrite; ????private?NfcAdapter?mNfcAdapter; ????private?PendingIntent?mPendingIntent; ????private?IntentFilter[]?mFilters; ????byte[]?code?=?MifareClassic.KEY_DEFAULT;//读写标签中每个块的密码 ????private?byte[]?b0; ????int?block[]?=?{4,?5,?6,?8,?9,?10,?12,?13,?14,?16,?17,?18,?20,?21,?22,?24, ????????????25,?26,?28,?29,?30,?32,?33,?34,?36,?37,?38,?40,?41,?42,?44,?45,?46, ????????????48,?49,?50,?52,?53,?54,?56,?57,?58,?60,?61,?62}; ????private?String?samCode; ????@Override ????protected?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.activity_fengxiang_three); ????????ButterKnife.bind(this); ????????writeBtn.setOnClickListener(new?View.OnClickListener()?{ ????????????@Override ????????????public?void?onClick(View?view)?{ ????????????????ifWrite?=?true; ????????????} ????????}); ????????samCode?=?getIntent().getStringExtra("samCode"); ????????tvBianma.setText(samCode); ????????checkNFCFunction();?//?NFC?Check ????????mPendingIntent?=?PendingIntent.getActivity(this,?0,?new?Intent(this, ????????????????getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),?0); ????????//?Setup?an?intent?filter?for?all?MIME?based?dispatches ????????IntentFilter?ndef?=?new?IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED); ????????try?{ ????????????ndef.addDataType("*/*"); ????????}?catch?(IntentFilter.MalformedMimeTypeException?e)?{ ????????????throw?new?RuntimeException("fail",?e); ????????} ????????mFilters?=?new?IntentFilter[]{ndef,}; ????????//?根据标签类型设置 ????????mTechLists?=?new?String[][]{new?String[]{NfcA.class.getName()}}; ????} ????private?void?checkNFCFunction()?{ ????????//?TODO?Auto-generated?method?stub ????????mNfcAdapter?=?NfcAdapter.getDefaultAdapter(this); ????????//?check?the?NFC?adapter?first ????????if?(mNfcAdapter?==?null)?{ ????????????//?mTextView.setText("NFC?apdater?is?not?available"); ????????????Dialog?dialog?=?null; ????????????AlertDialog.Builder?customBuilder?=?new?AlertDialog.Builder( ????????????????????this); ????????????customBuilder ????????????????????.setTitle("很遗憾") ????????????????????.setMessage("没发现NFC设备,请确认您的设备支持NFC功能!") ????????????????????.setIcon(R.drawable.ic_banner) ????????????????????.setPositiveButton("是", ????????????????????????????new?DialogInterface.OnClickListener()?{ ????????????????????????????????public?void?onClick(DialogInterface?dialog, ????????????????????????????????????????????????????int?which)?{ ????????????????????????????????????dialog.dismiss(); ????????????????????????????????????finish(); ????????????????????????????????} ????????????????????????????}); ????????????dialog?=?customBuilder.create(); ????????????dialog.setCancelable(false);//?back ????????????dialog.setCanceledOnTouchOutside(false); ????????????SetDialogWidth(dialog).show(); ????????????return; ????????}?else?{ ????????????if?(!mNfcAdapter.isEnabled())?{ ????????????????Dialog?dialog?=?null; ????????????????AlertDialog.Builder?customBuilder?=?new?AlertDialog.Builder( ????????????????????????this); ????????????????customBuilder ????????????????????????.setTitle("提示") ????????????????????????.setMessage("请确认NFC功能是否开启!") ????????????????????????.setIcon(R.drawable.ic_banner) ????????????????????????.setPositiveButton("现在去开启......", ????????????????????????????????new?DialogInterface.OnClickListener()?{ ????????????????????????????????????public?void?onClick(DialogInterface?dialog, ????????????????????????????????????????????????????????int?which)?{ ????????????????????????????????????????dialog.dismiss(); ????????????????????????????????????????Intent?setnfc?=?new?Intent( ????????????????????????????????????????????????Settings.ACTION_NFC_SETTINGS); ????????????????????????????????????????startActivity(setnfc); ????????????????????????????????????} ????????????????????????????????}); ????????????????dialog?=?customBuilder.create(); ????????????????dialog.setCancelable(false);//?back ????????????????dialog.setCanceledOnTouchOutside(false); ????????????????SetDialogWidth(dialog).show(); ????????????????return; ????????????} ????????} ????} ????private?Dialog?SetDialogWidth(Dialog?dialog)?{ ????????//?TODO?自动生成的方法存根 ????????DisplayMetrics?dm?=?new?DisplayMetrics(); ????????getWindowManager().getDefaultDisplay().getMetrics(dm); ????????int?screenWidth?=?dm.widthPixels; ????????int?screenHeight?=?dm.heightPixels; ????????WindowManager.LayoutParams?params?=?dialog.getWindow().getAttributes(); ????????if?(screenWidth?>?screenHeight)?{ ????????????params.width?=?(int)?(((float)?screenHeight)?*?0.875); ????????}?else?{ ????????????params.width?=?(int)?(((float)?screenWidth)?*?0.875) ????????} ????????dialog.getWindow().setAttributes(params); ????????return?dialog; ????} ????@Override ????protected?void?onNewIntent(Intent?intent)?{ ????????//?TODO?自动生成的方法存根 ????????super.onNewIntent(intent); //????????tv1.setText("发现新的?Tag:??"?+?++mCount?+?"\n");//?mCount?计数 ????????String?intentActionStr?=?intent.getAction();//?获取到本次启动的action ????????if?(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intentActionStr)//?NDEF类型 ????????????????||?NfcAdapter.ACTION_TECH_DISCOVERED.equals(intentActionStr)//?其他类型 ????????????????||?NfcAdapter.ACTION_TAG_DISCOVERED.equals(intentActionStr))?{//?未知类型 ????????????//?在intent中读取Tag?id ????????????Tag?tag?=?intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); ????????????byte[]?bytesId?=?tag.getId();//?获取id数组 //????????????info?+=?ByteArrayChange.ByteArrayToHexString(bytesId)?+?"\n"; //????????????tv2.setText("标签UID:??"?+?"\n"?+?info); ????????????//?读取存储信息 //????????????if?(mRead.isChecked())?{ //????????????????//?mChange=false; //????????????????tv3.setText("读取成功!?"?+?readTag(tag)); //????????????????//?readNfcVTag(tag); //????????????????etSector.setText(""); //????????????????etBlock.setText(""); //????????????????etData.setText(""); //????????????} ????????????//?写数据 ????????????if?(ifWrite)?{ ????????????????if?(samCode.length()?<?16){ ????????????????????for?(int?i?=?samCode.length();?i?<?16;?i++)?{ ????????????????????????samCode+="?"; ????????????????????} ????????????????} ????????????????writeTag(tag,?samCode); ????????????} ????????????//?转换为ASCll //????????????if?(mChange.isChecked())?{ //????????????????tv3.setText(change(tag)); //????????????????Toast.makeText(getBaseContext(),?"转换成功",?Toast.LENGTH_SHORT).show(); //????????????????etSector.setText(""); //????????????????etBlock.setText(""); //????????????????etData.setText(""); //????????????} ????????} ????} ????//?写数据 ????public?void?writeTag(Tag?tag,?String?str)?{ ????????MifareClassic?mfc?=?MifareClassic.get(tag); ????????try?{ ????????????if?(mfc?!=?null)?{ ????????????????mfc.connect(); ????????????}?else?{ ????????????????Toast.makeText(this,?"写入失败",?Toast.LENGTH_SHORT).show(); ????????????????return; ????????????} ????????????boolean?b?=?mfc.authenticateSectorWithKeyA(5,?code); ????????????if?(b)?{ ????????????????mfc.writeBlock(4?*?5,?str.getBytes()); ????????????????mfc.close(); ????????????????ToastUtil.showToast("写入成功"); ????????????????finish(); ????????????} ????????}?catch?(IOException?e)?{ ????????????e.printStackTrace(); ????????????ToastUtil.showToast("写入失败"); ????????} ????} ????@Override ????protected?void?onResume()?{ ????????super.onResume(); ????????enableForegroundDispatch(); ????} ????private?void?enableForegroundDispatch()?{ ????????if?(mNfcAdapter?!=?null)?{ ????????????mNfcAdapter.enableForegroundDispatch(this,?mPendingIntent, ????????????????????mFilters,?mTechLists); ????????} ????} ????@Override ????public?void?onPause()?{ ????????super.onPause(); ????????disableForegroundDispatch(); ????} ????private?void?disableForegroundDispatch()?{ ????????//?TODO?自动生成的方法存根 ????????if?(mNfcAdapter?!=?null)?{ ????????????mNfcAdapter.disableForegroundDispatch(this); ????????} ????} }
|