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
- Android NFC
- android nfc
- android nfc
- android NFC
- Android NFC
- Android NFC
- android nfc
- Android NFC
- Android NFC
- [NFC]Android的近场通信---NFC概要
- 【NFC】Android NFC API Reference中英文
- 【NFC】Android NFC API Reference中英文
- Android 2.3 NFC简介
- Android NFC架构分析
- Android NFC架构分析
- Android 上 NFC 应用
- Android NFC Porting 1
- Android 近场通信(NFC)
- 【Android】安卓学习笔记之定制ListView 的界面
- 1009. 说反话 (20)
- 基于opencv图片的傅里叶变换
- 8VC Venture Cup 2016 - Elimination Round F. Group Projects(DP)
- android小问题-------------SimpleCursorAdapter使用时的问题。 java.lang.IllegalArgumentException: column '_id' d
- android nfc
- Spark应用开发如何设定配置生效
- KMP字符串模式匹配详解
- Inheritance and virtual functions
- 《春日记》开发记录【3】
- word2vec中文相似词计算和聚类的使用说明及c语言源码
- redis源码阅读(1)---- 开始
- 单件模式
- 快速傅里叶变换