android中NFC讀寫功能的實現(xiàn)方法
更新時間:2021年09月18日 10:34:10 作者:kcl5715305
這篇文章主要為大家詳細(xì)介紹了android中NFC讀寫功能的實現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了android中NFC讀寫功能的具體代碼,供大家參考,具體內(nèi)容如下
首先檢查一下設(shè)備是否支持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("沒發(fā)現(xiàn)NFC設(shè)備,請確認(rèn)您的設(shè)備支持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("請確認(rèn)NFC功能是否開啟!") .setIcon(R.drawable.ic_banner) .setPositiveButton("現(xiàn)在去開啟......", 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;//讀寫標(biāo)簽中每個塊的密碼 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,}; // 根據(jù)標(biāo)簽類型設(shè)置 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("沒發(fā)現(xiàn)NFC設(shè)備,請確認(rèn)您的設(shè)備支持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("請確認(rèn)NFC功能是否開啟!") .setIcon(R.drawable.ic_banner) .setPositiveButton("現(xiàn)在去開啟......", 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("發(fā)現(xiàn)新的 Tag: " + ++mCount + "\n");// mCount 計數(shù) 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數(shù)組 // info += ByteArrayChange.ByteArrayToHexString(bytesId) + "\n"; // tv2.setText("標(biāo)簽UID: " + "\n" + info); // 讀取存儲信息 // if (mRead.isChecked()) { // // mChange=false; // tv3.setText("讀取成功! " + readTag(tag)); // // readNfcVTag(tag); // etSector.setText(""); // etBlock.setText(""); // etData.setText(""); // } // 寫數(shù)據(jù) if (ifWrite) { if (samCode.length() < 16){ for (int i = samCode.length(); i < 16; i++) { samCode+=" "; } } writeTag(tag, samCode); } // 轉(zhuǎn)換為ASCll // if (mChange.isChecked()) { // tv3.setText(change(tag)); // Toast.makeText(getBaseContext(), "轉(zhuǎn)換成功", Toast.LENGTH_SHORT).show(); // etSector.setText(""); // etBlock.setText(""); // etData.setText(""); // } } } // 寫數(shù)據(jù) 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); } } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實例
這篇文章主要介紹了Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android實現(xiàn)電子羅盤(指南針)方向傳感器的應(yīng)用
今天小編就為大家分享一篇關(guān)于Android實現(xiàn)電子羅盤(指南針)方向傳感器的應(yīng)用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03Windows下搭建Flutter開發(fā)環(huán)境
這篇文章介紹了Windows下搭建Flutter開發(fā)環(huán)境的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11CoordinatorLayout的使用如此簡單(Android)
這篇文章主要為大家詳細(xì)介紹了Android CoordinatorLayout的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09Android Studio進(jìn)行APP圖標(biāo)更改的兩種方式總結(jié)
這篇文章主要介紹了Android Studio進(jìn)行APP圖標(biāo)更改的兩種方式總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06