• 【转】Android实现NFC读写


    文章原地址:https://blog.csdn.net/sky2016_w/article/details/79026596

    一、NFC是什么?

    近距离无线通讯技术,这个技术由非接触式射频识别(RFID)演变而来,由飞利浦半导体(现恩智浦半导体公司)、诺基亚和索尼共同研制开发,其基础是RFID及互连技术。近场通信(Near Field Communication,NFC)是一种短距高频的无线电技术,在13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。NFC采用主动和被动两种读取模式。

    NFC通信模式主要有以下几种(信息来源):

    1.读卡器模式(Reader/writer mode):

    作为非接触读卡器使用,比如从海报或者展览信息电子标签上读取相关信息。亦可实现NFC手机之间的数据交换,对于企业环境的中的文件共享,或者对于多玩家的游戏应用,都将带来诸多的便利。

    2. 点对点模式(P2Pmode):

    此模式和红外线差不多,可用于数据交换,只是传输距离较短,传输创建速度较快,传输速度也快些,功耗低(蓝牙也类似)。将两个具备NFC功能的设备无线链接,能实现数据点对点传输,如下载音乐、交换图片或者同步设备地址薄。因此通过NFC,多个设备如数位相机、PDA、计算机和手机之间都可以交换资料或者服务。

    3.卡模式(Cardemulation):

    这个模式其实就是相当于一张采用RFID技术的IC卡,可以替代大量的IC卡(包括信用卡)使用的场合,如商场刷卡、公交卡、门禁管制,车票,门票等等。此种方式下,有一个极大的优点,那就是卡片通过非接触读卡器的 RF 域来供电,即使寄主设备(如手机)没电也可以工作。

    二、如何使用与集成到项目?

    1、首先在manifests里面声明NFC和添加相应的权限;

    <uses-feature  
            android:name="android.hardware.nfc"  
            android:required="true" />  
    <uses-permission android:name="android.permission.NFC" />
    

    2、在Activity标签中声明识别NFC标签;

    <activity android:name=".Activity.Main.NFCActivity">  
        <intent-filter>  
            <action android:name="android.nfc.action.TAG_DISCOVERED" />  
    
            <category android:name="android.intent.category.DEFAULT" />  
    
            <data android:mimeType="*/*" />  
        </intent-filter>  
    </activity>
    

    3、封装NFC的读写,方便调用;

    public class NfcUtils {  
    
        //nfc  
        public static NfcAdapter mNfcAdapter;  
        public static IntentFilter[] mIntentFilter = null;  
        public static PendingIntent mPendingIntent = null;  
        public static String[][] mTechList = null;  
    
        /** 
         * 构造函数,用于初始化nfc
         */  
        public NfcUtils(Activity activity) {  
            mNfcAdapter = NfcCheck(activity);  
            NfcInit(activity);  
        }  
    
        /** 
         * 检查NFC是否打开 
         */  
        public static NfcAdapter NfcCheck(Activity activity) {  
            NfcAdapter mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);  
            if (mNfcAdapter == null) {  
                return null;  
            } else {  
                if (!mNfcAdapter.isEnabled()) {  
                    Intent setNfc = new Intent(Settings.ACTION_NFC_SETTINGS);  
                    activity.startActivity(setNfc);  
                }  
            }  
            return mNfcAdapter;  
        }  
    
        /** 
         * 初始化nfc设置 
         */  
        public static void NfcInit(Activity activity) {  
            mPendingIntent = PendingIntent.getActivity(activity, 0, new Intent(activity, activity.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);  
            IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);  
            IntentFilter filter2 = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);  
            try {  
                filter.addDataType("*/*");  
            } catch (IntentFilter.MalformedMimeTypeException e) {  
                e.printStackTrace();  
            }  
            mIntentFilter = new IntentFilter[]{filter, filter2};  
            mTechList = null;  
        }  
    
        /**  
         * 读取NFC的数据  
         */  
        public static String readNFCFromTag(Intent intent) throws UnsupportedEncodingException {  
            Parcelable[] rawArray = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);  
            if (rawArray != null) {  
                NdefMessage mNdefMsg = (NdefMessage) rawArray[0];  
                NdefRecord mNdefRecord = mNdefMsg.getRecords()[0];  
                if (mNdefRecord != null) {  
                    String readResult = new String(mNdefRecord.getPayload(), "UTF-8");  
                    return readResult;  
                }  
            }  
            return "";  
        }  
    
    
        /** 
         * 往nfc写入数据 
         */  
        public static void writeNFCToTag(String data, Intent intent) throws IOException, FormatException {  
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
            Ndef ndef = Ndef.get(tag);  
            ndef.connect();  
            NdefRecord ndefRecord = NdefRecord.createTextRecord(null, data);  
            NdefRecord[] records = {ndefRecord};  
            NdefMessage ndefMessage = new NdefMessage(records);  
            ndef.writeNdefMessage(ndefMessage);  
        }  
    
        /** 
         * 读取nfcID 
         */  
        public static String readNFCId(Intent intent) throws UnsupportedEncodingException {  
            Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
            String id = ByteArrayToHexString(tag.getId());  
            return id;  
        }  
    
        /** 
         * 将字节数组转换为字符串 
         */  
        private static String ByteArrayToHexString(byte[] inarray) {  
            int i, j, in;  
            String[] hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"};  
            String out = "";  
    
            for (j = 0; j < inarray.length; ++j) {  
                in = (int) inarray[j] & 0xff;  
                i = (in >> 4) & 0x0f;  
                out += hex[i];  
                i = in & 0x0f;  
                out += hex[i];  
            }  
            return out;  
        }  
    }  
    

    4、在NFCActivity代码中的使用、使用标签的前台调度系统;

    @Override  
    public void initData() {  
        //nfc初始化设置  
        NfcUtils nfcUtils = new NfcUtils(this);  
    } 
    
    @Override  
    protected void onResume() {  
        super.onResume();  
        //开启前台调度系统  
        NfcUtils.mNfcAdapter.enableForegroundDispatch(this, NfcUtils.mPendingIntent, NfcUtils.mIntentFilter, NfcUtils.mTechList);  
    }
    @Override  
    protected void onPause() {  
        super.onPause();  
        //关闭前台调度系统  
        NfcUtils.mNfcAdapter.disableForegroundDispatch(this);  
    }
    
    @Override  
    protected void onNewIntent(Intent intent) {  
        super.onNewIntent(intent);  
        //当该Activity接收到NFC标签时,运行该方法  
        //调用工具方法,读取NFC数据  
        String str = NfcUtils.rendFromTag(intent);  
    } 
    

    5、判断手机是否支持NFC

    PackageManager packageManager = this.getPackageManager();
    boolean b1 = packageManager.hasSystemFeature(PackageManager.FEATURE_NFC);
    Toast.makeText(context, "是否支持nfc:" + b1, 1).show();
    
     
     
    3人点赞
     
     


    作者:LockJo
    链接:https://www.jianshu.com/p/61f90708bb02
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    《剑指Offer》算法题——“旋转数组”的最小数字
    驱动是如何运行的
    Logistic回归,梯度上升算法理论详解和实现
    Python 字符串前面加'r'
    Python中文编码问题(字符串前面加'u')
    最大长度回文子串(Manacher's algorithm)
    没有重复字符的子串的最大长度
    Python格式化输出
    python strip()函数和Split函数的用法总结
    Python中的sorted函数以及operator.itemgetter函数
  • 原文地址:https://www.cnblogs.com/javalinux/p/14543681.html
Copyright © 2020-2023  润新知