Android读取NFCA类型的数据

一、概要

  本例子为读取nfca类型的数据,应用场景是读取燃气卡的id。

二、示例代码

  1.在AndroidManifest.xml中加入nfc权限 

 <!--    支持nfc功能-->
    <uses-permission android:name="android.permission.NFC" />
    <!--    只有提供了nfc功能的手机可安装-->
    <uses-feature
        android:name="android.hardware.nfc"
        android:required="true" />

  2.新建一个BaseNfcActivity 

public class BaseNfcActivity extends FragmentActivity {
    protected NfcAdapter mNfcAdapter;
    private PendingIntent mPendingIntent;

    /**
     * onCreat->onStart->onResume->onPause->onStop->onDestroy
     * 启动Activity,界面可见时.
     */
    @Override
    protected void onStart() {
        super.onStart();
        //此处adapter需要重新获取,否则无法获取message
        mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
        //一旦截获NFC消息,就会通过PendingIntent调用窗口
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()), 0);
        if (!ifNFCUse()) {
            ToastUtil.getInstance()
                    .showTips(this, R.mipmap.ic_launcher, "请在系统中打开nfc功能");
        }
    }
/**以下是nfc相关的介绍*/
    /**
     * 检测工作,判断设备的NFC支持情况
     *
     * @return
     */
    protected boolean ifNFCUse() {
        if (mNfcAdapter == null) {
            ToastUtil.getInstance().show(this, "设备不支持NFC!");
            return false;
        }
        if (mNfcAdapter != null && !mNfcAdapter.isEnabled()) {
            ToastUtil.getInstance().show(this, "请在系统设置中先启用NFC功能!");
            return false;
        }
        return true;
    }

    /**nfc介绍结束*/
    /**
     * 获得焦点,按钮可以点击
     */
    @Override
    public void onResume() {
        super.onResume();
        //设置处理优于所有其他NFC的处理
        if (mNfcAdapter != null)
            mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
    }

    /**
     * 暂停Activity,界面获取焦点,按钮可以点击
     */
    @Override
    public void onPause() {
        super.onPause();
        //恢复默认状态
        if (mNfcAdapter != null)
            mNfcAdapter.disableForegroundDispatch(this);
    }
}

  3.新建一个子类SubNfcActivity继承BaseNfcActivity 

public class SubNfcActivity extends BaseNfcActivity {

    private String mTagText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ic_card_distinguish);
    }

   //必须要重写onNewIntent,不然获取不到ic卡数据 @Override
public void onNewIntent(Intent intent) { //1.获取Tag对象 super.onNewIntent(intent); String icCardString = readNFCAData(intent); Log.e("ic卡号:",icCardString);
} /** * 读取nfca类型的卡号 * @param intent * @return */ public String readNFCAData(Intent intent){ //1.获取Tag对象 StringBuilder sb = new StringBuilder(); Bundle datas = intent.getExtras(); Set<String> keys = datas.keySet(); for (String key : keys){ if("android.nfc.extra.ID".equals(key)){ String data = byteArrayToHex((byte[]) datas.get(key)); String replaceSpace = getReverseStr(data); sb.append(Long.parseLong(replaceSpace,16)); } } return sb.toString(); } /** * 得到的data数据取反 * @param data * @return */ private String getReverseStr(String data){ String[] icStrSub = data.split(" "); StringBuilder myResult = new StringBuilder(); for(int i=icStrSub.length-1;i>=0;i--){ myResult.append(icStrSub[i]); } return myResult.toString(); } private String byteArrayToHex(byte[] bytes) { StringBuffer sBuffer = new StringBuffer(); for(byte b : bytes){ int hexInt = b<0?256+b:b; if(hexInt<10){ sBuffer.append("0"+Integer.toHexString(hexInt)+" "); }else{ sBuffer.append(Integer.toHexString(hexInt)+" "); } } return sBuffer.toString().toUpperCase(); } }

  4.在AndroidManifest.xml中注册Activity,并且吧其启动模式设置给singleTop

  

 <activity
            android:name=".SubNfcActivity"
            android:launchMode="singleTop"
            />

  

到此就结束了,把代码往项目中一贴,运行一下做测试就行了。

注意事项:

  ic卡识别页面尽量不要有什么可以获取焦点的地方(特别是第一项),不然会出现莫名其妙的问题。在上述案例中表现为,如果SubNfcActivity的布局中有一个向左的返回按钮,则识别过程中有很大概率返回按钮会被选中,页面会莫名其妙关闭的情况。

  

原文地址:https://www.cnblogs.com/tony-yang-flutter/p/15028794.html