android nfc

来源:互联网 发布:linux cp -f 编辑:程序博客网 时间:2024/03/28 22:48

近场通讯是一种点对点的短距高频的通讯方式,通讯的速度很快.

标签调度系统:
1 当设备扫描到nfc标签时,首先去解析标签,识别出数据中的mime或者uri
2 将数据封装成一个Intent.
3 交给注册特定意图的activity去解析.

意图的优先级:ACTION_NDEF_DISCOVERED最高.ACTION_TECH_DISCOVERED其次.ACTION_TAG_DISCOVERED最后.

一个NDEF格式的标签使用一个NdefMessage来包装,
一个NdefMessage由0个或多个NdefRecord组成,
其中有各种各样的NdefRecord,比如放Url的,
放文本信息的等等.

1 如果想要activity可以处理nfc信息,需要添加intent-filter:

            <intent-filter >                <action android:name="android.nfc.action.NDEF_DISCOVERED"></action>                <category android:name="android.intent.category.DEFAULT"></category>                <data android:mimeType="text/plain"/>            </intent-filter>

如果想要应用支持nfc,需要添加权限:

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

2 检测打开nfc设备:

        adapter=NfcAdapter.getDefaultAdapter(this);        if(adapter==null){            Toast.makeText(this,"设备不支持nfc", Toast.LENGTH_LONG).show();            this.finish();        }        ///打开nfc设备        if(!adapter.isEnabled()){            Intent intent=new Intent(Settings.ACTION_NFC_SETTINGS);            startActivity(intent);        }

3 设置当前activity为处理nfc信息的优先activity,当存在多个nfc处理activity时.

    @Override    protected void onResume() {        // TODO 自动生成的方法存根        super.onResume();        if(adapter!=null){            //设置处理nfc优先级最高            adapter.enableForegroundDispatch(this, pi, null, null);        }    }    @Override    protected void onDestroy() {        // TODO 自动生成的方法存根        super.onDestroy();        if(adapter!=null){            adapter.disableForegroundDispatch(this);        }    }

4
当设备中的nfc扫描器扫描到电子标签后,会向应用程序发送
ACTION_TAG_DISCOVERED的Intent,接受到意图之后,就可以进行读写操作.

@Override    protected void onNewIntent(Intent intent) {        // TODO 自动生成的方法存根        super.onNewIntent(intent);        write(intent);        Read(intent);    }
    public void write(Intent intent){        Tag tag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);        if(tag!=null){            //创建记录            //打开指定的应用程序            NdefRecord record1=NdefRecord.createApplicationRecord(packageName);            //打开网络            NdefRecord record2=NdefRecord.createUri(Uri.parse("http://www.baidu.com"));            NdefRecord[] records=new NdefRecord[]{/*record1,record2,*/                    //文本                    new NdefRecord(NdefRecord.TNF_WELL_KNOWN,                            NdefRecord.RTD_TEXT,                             new byte[]{0},                            packageName.getBytes(Charset.forName("gb2312"))),                    new NdefRecord(NdefRecord.TNF_WELL_KNOWN,                            NdefRecord.RTD_TEXT,                            new byte[]{0},                            "1".getBytes(Charset.forName("gb2312")))            };            //创建消息            NdefMessage msg=new NdefMessage(records);            //格式的检测类            Ndef ndef=Ndef.get(tag);            if(ndef!=null){                try {                    //连接设备                    ndef.connect();                    //可写                    if(ndef.isWritable()){                        //判断大小                        int size=msg.getByteArrayLength();                        if(ndef.getMaxSize()>size){                            //写入数据                            ndef.writeNdefMessage(msg);                        }                    }                } catch (Exception e) {                    // TODO 自动生成的 catch 块                    e.printStackTrace();                }            }else{                //需要格式化                NdefFormatable formatable=NdefFormatable.get(tag);                try {                    if(formatable!=null){                        //链接                        formatable.connect();                        //格式化并写入数据                        formatable.format(msg);                        Log.v("tag", "写入成功");                    }                } catch (Exception e) {                    // TODO 自动生成的 catch 块                    e.printStackTrace();                }            }        }else{            return ;        }    }

读取:

    public void Read(Intent intent){        Tag tag=intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);        if(tag==null){               return ;           }           if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())){               Parcelable[] data=intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);               if(data!=null){                   NdefMessage[] msgs=new NdefMessage[data.length];                   for(int i=0;i<data.length;i++){                       msgs[i]=(NdefMessage) data[i];                       NdefRecord[] records=msgs[i].getRecords();                       for(int j=0;j<records.length;i++){                           ////获取数据                           Log.v("tag", records[j].getPayload().toString());                       }                   }               }           }    }
0 0
原创粉丝点击