Android NFC的相关资源,需求和设置

你可以在Android的NFC支持页面找到相关的API文档和NFC的示例代码:

http://developer.android.com/reference/android/nfc/package-summary.html

接下来该怎么做呢?通常需要硬件的支持(手机支持NFC)和添加你的应用的权限。

这需要你修改你的AndroidManifest.xml文件,将最低的SDK版本更改为10,也就是Android2.3.3及以上版本:

<uses-sdkandroid:minSdkVersion="10"/>

还有就是你的手机需要支持NFC,应用必须获取与硬件交互的权限:

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

你也可以通过定义Intent来对NFC扫描获取的数据进行过滤处理。这里仅仅是使用ACTION_NDEF_DISCOVERED处理字符数据。当然也有其他的NFC规格的数据类型的定义。

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

NFC数据交换格式

NdefMessage包含传输在NDEF中的数据,每个NdefMessage由定义在NdefRecord的多个记录组成。每个NdefRecord根据它指明的3-bit的TNF进行解释。查看完整的TNF列表及其映射,最常用的TNF是TNF_WELL_KNOWN 和 TNF_MIME_MEDIA。标签调度系统通过三个Intent处理解包的NFC数据(通过Intent传递数据)。根据优先级的先后,它们是ACTION_NDEF_DISCOVERED,ACTION_TECH_DISCOVERED,和ACTION_TAG_DISCOVERED。

这里是官方的描述:“只要可能,尽可能的使用NDEF消息和ACTION_NDEF_DISCOVERED,因为三个Intent中最详细的。这个Intent可以比其他两个Intent在更加合适的时间启动你的应用,给用户更好的体验”。

在Android中读取NFC标签 和贴纸


正如我们在前一节提到,NdefMessage 是交换NFC数据最常用的方式。当然,你仍然可以定义你自己的non-NDEF 数据,但是这超出了本教程的范围。为了说明数据是如何被标签调度系统解析和处理的,我们仅在我们的实例中使用简单的纯文本。对于其他类型,看一下官方网站。

NfcAdapter用来监测设备对NFC的支持。前台调度系统允许一个活动拦截一个意图并允许这个活动比其他处理相同意图的活动拥有更高的优先级。

在onNewIntent(),我们试图解析所有的NDEF消息和它们的记录。因为有几个不同的数据类型,这个例子仅仅试图解析由inNdefRecord.RTD_TEXT定义的文本类型。

packagecom.songsoft.NFC;importjava.util.Arrays;importandroid.app.Activity;
importandroid.app.PendingIntent;
importandroid.content.Intent;
importandroid.content.IntentFilter;
importandroid.nfc.NdefMessage;
importandroid.nfc.NdefRecord;
importandroid.nfc.NfcAdapter;
importandroid.nfc.Tag;
importandroid.nfc.tech.NfcF;
importandroid.os.Bundle;
importandroid.os.Parcelable;
importandroid.util.Log;
importandroid.widget.TextView;publicclass TagDispatch extends Activity {private TextView mTextView;private NfcAdapter mNfcAdapter;private PendingIntent mPendingIntent;private IntentFilter[] mIntentFilters;private String[][] mNFCTechLists;@Overridepublic void onCreate(Bundle savedState){super.onCreate(savedState);setContentView(R.layout.main);mTextView =(TextView)findViewById(R.id.tv);mNfcAdapter =NfcAdapter.getDefaultAdapter(this);if (mNfcAdapter != null) {mTextView.setText("读取一个NFC标签");} else {mTextView.setText("不支持NFC。");}mPendingIntent =PendingIntent.getActivity(this, 0,newIntent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);IntentFilter ndefIntent = newIntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);try {ndefIntent.addDataType("*/*");mIntentFilters = newIntentFilter[] { ndefIntent };} catch (Exception e) {Log.e("TagDispatch",e.toString());}mNFCTechLists = newString[][] { new String[] { NfcF.class.getName() } };}@Overridepublic void onNewIntent(Intent intent){       String action =intent.getAction();Tag tag =intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);String s = action +"\n\n" + tag.toString();Parcelable[] data =intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);if (data != null) {try {for (int i= 0; i < data.length; i++) {                                       NdefRecord[] recs = ((NdefMessage)data[i]).getRecords();for(int j = 0; j < recs.length; j++) {if(recs[j].getTnf() == NdefRecord.TNF_WELL_KNOWN &&Arrays.equals(recs[j].getType(),NdefRecord.RTD_TEXT)) {byte[]payload = recs[j].getPayload();StringtextEncoding = ((payload[0] & 0200) == 0) ? "UTF-8" :"UTF-16";intlangCodeLen = payload[0] & 0077;s+= ("\n\nNdefMessage[" + i + "], NdefRecord[" + j +"]:\n\"" +newString(payload, langCodeLen + 1,payload.length- langCodeLen - 1, textEncoding) +"\"");}}}} catch (Exceptione) {Log.e("TagDispatch",e.toString());}}mTextView.setText(s);}@Overridepublic void onResume() {super.onResume();if (mNfcAdapter != null)       mNfcAdapter.enableForegroundDispatch(this, mPendingIntent,mIntentFilters, mNFCTechLists);}@Overridepublic void onPause() {super.onPause();if (mNfcAdapter != null)mNfcAdapter.disableForegroundDispatch(this);}
}

通过AndroidBeam将NFC数据传到其他设备

通过Android Beam的支持发送NFC数据,所以这个活动通常被成为“beaming”。许多NDEF数据可以被传递,当然可以定义你自己的格式。这个实例演示了如何创建一个纯文本类型的记录。大部分代码看起来很熟悉。

packagecom.songsoft.NFC;importjava.nio.charset.Charset;
importjava.util.Locale;importandroid.app.Activity;
importandroid.nfc.NdefMessage;
importandroid.nfc.NdefRecord;
importandroid.nfc.NfcAdapter;
importandroid.os.Bundle;
importandroid.widget.TextView;publicclass BeamData extends Activity {private NfcAdapter mNfcAdapter;private TextView mTextView;private NdefMessage mNdefMessage;@Overridepublic void onCreate(Bundle savedState){super.onCreate(savedState);setContentView(R.layout.main);mTextView =(TextView)findViewById(R.id.tv);mNfcAdapter =NfcAdapter.getDefaultAdapter(this);if (mNfcAdapter != null) {mTextView.setText("到另外一个设备");} else {mTextView.setText("不支持NFC");}mNdefMessage = newNdefMessage(newNdefRecord[] {createNewTextRecord("NDEF文本记录的第一个实例", Locale.ENGLISH, true),createNewTextRecord("NDEF文本记录的第二个实例", Locale.ENGLISH, true) });}public static NdefRecordcreateNewTextRecord(String text, Locale locale, boolean encodeInUtf8) {byte[] langBytes =locale.getLanguage().getBytes(Charset.forName("US-ASCII"));Charset utfEncoding =encodeInUtf8 ? Charset.forName("UTF-8") :Charset.forName("UTF-16");byte[] textBytes =text.getBytes(utfEncoding);int utfBit = encodeInUtf8 ? 0: (1 << 7);char status = (char)(utfBit +langBytes.length);byte[] data = new byte[1 +langBytes.length + textBytes.length];data[0] = (byte)status;System.arraycopy(langBytes,0, data, 1, langBytes.length);System.arraycopy(textBytes,0, data, 1 + langBytes.length, textBytes.length);return newNdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data);}@Overridepublic void onResume() {super.onResume();if (mNfcAdapter != null)mNfcAdapter.enableForegroundNdefPush(this,mNdefMessage);}@Overridepublic void onPause() {super.onPause();if (mNfcAdapter != null)mNfcAdapter.disableForegroundNdefPush(this);}
}

总结

本NFC教程主要以强调一些关键的方面作为出发点,要想活的更多的信息,可以访问Android的官方网站。

转载于:https://www.cnblogs.com/hainange/archive/2013/04/21/6153573.html

Android中NFC编程相关推荐

  1. (转)Android中JNI编程的那些事儿

    Android中JNI编程的那些事儿 首先说明,Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须是通过Java代码嵌入Native C/C++--即通过JNI的方式来使用本地(Na ...

  2. android中NFC读写功能的实现方法

    这篇文章主要为大家详细介绍了android中NFC读写功能的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了android中NFC读写功能的 ...

  3. Android中网络编程

    在Android中几种网络编程的方式: (1)针对TCP/IP的Socket.ServerSocket (2)针对UDP的DatagramSocket.DatagramPackage.这里需要注意的是 ...

  4. Android中NFC的使用

    NFC开发也是我们开发中会遇到的,所以我们也有必要了解一下. 1.权限配置 <!-- NFC --> <uses-permission android:name="andr ...

  5. Android中NFC读写

    参考网址:https://blog.csdn.net/sky2016_w/article/details/79026596 https://www.jianshu.com/p/61f90708bb02 ...

  6. Android中网络编程出错

    在android 2.3上设计的下载程序,在android 4.0上运行时报android.os.NetworkOnMainThreadException异常,原来在4.0中,访问网络不能在主程序中进 ...

  7. 如何在android中设置背景,如何在Android中以编程方式设置背景可绘制

    MMTTMM layout.setBackgroundResource(R.drawable.ready);是正确的.实现它的另一种方法是使用以下方法:final int sdk = android. ...

  8. android 通话结束广播,在Android中以编程方式结束通话

    侃侃尔雅 您无需成为系统应用程序.首先,com.android.internal.telephony在您的项目中创建包,并将其放入名为" ITelephony.aidl" 的文件中 ...

  9. android开发板功能,Android中NFC模块PN532开发板应用/原理图/PCB等全部资料

    PN532是NXP最近推出的一款NFC芯片,支持读卡器模式和卡模式(需要卡芯片Smart MX),支持TypeA丶TypeB丶TypeC三个标准.该NFC模块PN532开发板特点: @ 内部带一个MC ...

最新文章

  1. python好还是c+-JAVA,Python和C+各有什么特点和优势?
  2. 在Linux上编写并运行Java文件
  3. Linux命令之 mount -- 文件系统挂载
  4. ThinkPHP V5 漏洞利用
  5. html 图片防盗链,【反防盗链】介绍一个对付图片防盗链的方法
  6. ln: 创建符号链接 “include/asm”: 不支持的操作
  7. 数据可视:让科幻走向现实
  8. 2019年宁波高职技能考计算机,2019年宁波职业技术学院高职提前招生考试综合素质测试大纲...
  9. Easyui 默认图标以及自定义图标
  10. 微信小程序图片布满整个窗口
  11. Java毕设项目电商后台管理系统计算机(附源码+系统+数据库+LW)
  12. 计算机专业英语思维导图
  13. 让 Alfred 支持拼音
  14. 字体图标文件服务器提示404,iis环境下字体图标woff/woff2/svg返回404不显示的原因与解决方法...
  15. 洗牌复原次数c语言公式,洗牌算法Fisher-Yates以及C语言随机数的产生
  16. 陆港澳台正则 + 陆港澳台身份证+回乡证+台胞证+护照正则表达式,及 根据身份证号码,获取性别、获取生日、计算年龄、获取地址、获取生肖、获取星座...
  17. 智慧园区运行监控中心
  18. 【华为OD机试真题 C++】数字涂色 【2022 Q4 | 100分】
  19. 饥荒linux服务器搭建
  20. Atitit db analysis statistics tonjyi fsy数据库统计分析目录1. Atitit 数据库表与注释文档与统计(表,说明) 11.1. 获取表列表 数据库包含哪些

热门文章

  1. oracle中的rowid--伪列-删除表中的重复内容-实用
  2. Kali Linux重新支持RTL8814au芯片
  3. iOS 9音频应用播放音频之iOS 9音频播放进度
  4. iOS游戏框架Sprite Kit基础教程第1章编写第一个Sprite Kit程序
  5. 计算机用户账户添加,windows添加用户账户
  6. python爬虫项目教程_Python 爬虫速成教程,还有35个实战项目送给你
  7. ERP成分简介--听觉感觉反应
  8. oracle em 双网卡,VirtualBox 双网卡配置
  9. 这二维码鬼畜起来了,加颜色加插画还能加GIF
  10. “接着奏乐接着舞”,大脑也是这么想的