• 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的布局中有一个向左的返回按钮,则识别过程中有很大概率返回按钮会被选中,页面会莫名其妙关闭的情况。

      

  • 相关阅读:
    Day 69
    Day 68
    Day 67
    Day 66
    Day 65
    Day 64
    Day 63
    Day 62
    Day 61
    Day 60
  • 原文地址:https://www.cnblogs.com/tony-yang-flutter/p/15028794.html
Copyright © 2020-2023  润新知