跳到主要内容

开始使用NFC Android

NFC Android中的NFC代表“近场通信” - 一种允许在电话,贴纸和卡之间进行无线近距离数据通信的技术。如果您熟悉巴克莱PayWave或Oyster卡,您就会知道基于“RFID”的技术可以通过简单地将各种东西放在一起来读取数据。

你可以用手机触摸贴纸,海报和NFC,其他手机。此操作可用于启动网站或应用,付款甚至双向传输数据(在Android上,后者称为光束)。与QR码相比,NFC Android提供了更简单(和内置)的机制,用于打开URL,下载应用程序,甚至读取和编写自定义内容。

  • 阅读我们所有的应用设计文章这里

你会学到什么

在本教程中,我们将构建一个可写入NFC Android标签的应用程序,并且还可以从复制控制台游戏中读取类似Top Trumps的数据。如果没有我们应用的用户触摸标记,它将使用内置机制将其带到Android Play商店中应用的下载页面。安装完成后,任何后续的水龙头都会启动应用并在屏幕上显示游戏卡。全部不到200行代码!

为了跟进你需要一个支持NFC的Android手机,如三星Galaxy Nexus或三星Nexus S.你需要的另一件事是一些NFC标签或贴纸。你可以在网上找到这么多地方但是RapidNFC提供一个很好的入门包,其中包括各种可重写标签,该网站还包含围绕不同标签类型的大量信息。请务必预先格式化它们(这显示为一个选项付款),a窃听器在Android 4.0.2中可能会阻止您编码完全空白的标签。

准备工作

在我们开始编写自己的代码之前,我还建议下载恩智浦TagWriter让您熟悉阅读和编写标签。

除了读取和写入文本和URL,您还可以在应用程序的首选项屏幕中免费启用“专业模式”(可通过菜单按钮访问)。一旦启用,您就可以格式化/擦除和写保护标签。

01.入门

现在进入我们的应用程序......第一项工作是将一些数据写入空白标签。我们将包括一个链接到应用下载页面的特殊记录,以及NDEF(NFC数据交换格式)中的游戏数据。

我建议您此时打开源代码,因为我将突出显示此页面上的关键部分。当您导入项目时,请打开AndroidManifest.xml中在XML视图中。

在我们使用NFC Android之前,我们需要在清单XML中添加一些新标签:




>





使用许可权标签将允许我们访问手机中的NFC芯片,并且使用硬件标签将使其成为一项要求,这意味着我们的应用仅适用于Play商店中支持NFC的手机。对于我们CardActivity标签我们添加一个新的意图过滤器,当扫描包含我们游戏格式数据的标签时,这将启动活动。我们通过指定自定义来完成此操作MIME类型,在这种情况下,我选择了“应用程序/ Vnd.netmagazine.nfcdemo”。 Android通过尝试找到标签上数据的最佳匹配来处理NFC标签扫描,提供多种回退机制,以确保标签由正确的应用程序处理,并允许用户在没有明确目标时从选择器对话框中进行选择。

我们需要做的第一件事就是将一些数据写入空白NFC标签,然后打开MainActivity.java。当用户单击应用程序的图标时,将启动此活动。它会显示一个按钮,按下该按钮时,等待标记写入。

在我们的的onCreate()我们获取NFC适配器的参考供以后使用:

mAdapter = NfcAdapter.getDefaultAdapter(this);

NfcAdapter允许我们在任何其他应用获得机会之前开始收听被扫描的标签。这称为“前台调度”。当用户按下我们拨打的按钮时EnableWriteMode()开始这个过程:

Private Void EnableWriteMode(){
MInWriteMode = True;
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,
new Intent(this,getClass())。addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);

IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter [] filters = new IntentFilter [] {tagDetected};

mAdapter.enableForegroundDispatch(this,pendingIntent,filters,null);
}

在这个方法中我们设置了一个的PendingIntent在标签被扫描时运行,在这种情况下我们只是想要意图在扫描任何标记时启动当前活动,因此不设置任何特殊过滤器。系统发送时ACTION_TAG_DISCOVERED,此活动将启动和OnNewIntent()将使用标签详细信息进行调用。

public void onNewIntent(Intent intent){
If(mInWriteMode){
MInWriteMode = False;

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
WriteTag(标签);
}
}

OnNewIntent()我们拿出NFC标签并开始写入WriteTag()。这是我们演示中迄今为止最大的方法:

private boolean writeTag(Tag tag){
//如果未安装应用程序,则记录以启动Play商店
NdefRecord appRecord = NdefRecord.createApplicationRecord(“com.netmagazine.nfcdemo”);

//包含我们自定义“复古控制台”游戏数据的记录,使用自定义MIME_TYPE
byte [] payload = getRandomConsole()。getBytes();
byte [] mimeBytes = MimeType.NFC_DEMO.getBytes(Charset.forName(“US-ASCII”));
NdefRecord cardRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,mimeBytes,new byte [0],payload);
NdefMessage message = new NdefMessage(new NdefRecord [] {cardRecord,appRecord});

尝试{
//查看标签是否已经过NDEF格式化
Ndef ndef = Ndef.get(tag);
If(ndef!= Null){
Ndef.connect();

If(!ndef.isWritable()){
DisplayMessage(“只读标记。”);
返回false;
}

//计算出我们需要多少空间来存储数据
int size = message.toByteArray()。length;
if(ndef.getMaxSize()<size){
DisplayMessage(“标签没有足够的可用空间。”);
返回false;
}

Ndef.writeNdefMessage(消息);
DisplayMessage(“标签写成功。”);
返回true;
} Else {
//尝试格式化标记
NdefFormatable format = NdefFormatable.get(tag);
If(format!= Null){
尝试{
Format.connect();
Format.format(消息);
DisplayMessage(“标签写成功!”);
返回true;
} Catch(IOException E){
DisplayMessage(“无法将标签格式化为NDEF。”);
返回false;
}
} Else {
DisplayMessage(“Tag似乎不支持NDEF格式。”);
返回false;
}

02. NDEF

我们存储的数据在单个NDEF消息中组织成NDEF记录。我们要做的第一件事是创建一个“应用程序记录”,AppRecord。这是Android 4的新功能,如果在NFC标签中找到匹配的包名,它会强制系统在其他人之前启动您的应用。之后我们创造了我们的CardRecord其中包含随机生成的游戏控制台。该有效载荷是我们存储自定义数据的地方,在这种情况下只是游戏控制台的小写名称。

接下来,我们确定标签是否已通过调用格式化为NDEFNdef.get(标签)。如果它已经是NDEF格式化,我们检查它是否可写并且数据不是太大。一切顺利,我们用数据写Ndef.writeNdefMessage()。如果标签还没有NDEF格式,我们使用NdefFormattable.format()在格式化标签的同时写入数据。就是这样,我们写了一个NFC标签!

写入标签后点击主页按钮退出应用程序并重新扫描标签。它现在应该启动CardActivity并显示控制台的游戏卡。打开CardActivity.java看看我们如何从中读取信息意图

Intent Intent = GetIntent();
if(intent.getType()!= null && intent.getType()。equals(MimeType.NFC_DEMO)){
Parcelable [] RawMsgs =
getIntent()。getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_

消息);
NdefMessage msg =(NdefMessage)rawMsgs [0];
NdefRecord cardRecord = msg.getRecords()[0];
String consoleName = new String(cardRecord.getPayload());
DisplayCard(consoleName);
}

}
} Catch(例外e){
DisplayMessage(“写标签失败”);
}

返回false;
}

在这里,我们只是检查意图确保类型匹配我们的自定义mime类型。有了这个决心,我们可以继续抓住NdefMessage来自意图的额外内容。在我们的例子中,我们知道第一个NdefRecord是我们的CardRecord,在有效负载中包含我们的控制台名称。在控制台名称已知的情况下,我们只需在ImageView中显示正确的图像。

在很短的时间内,我们设法将自定义数据写入NFC标签,自动下载应用程序以读取它并回读自定义游戏数据。从这里你可以扩展演示,成为一个完全可玩的游戏甚至使用Android Beam 手机通过NFC手机进行多人游戏。

喜欢这个?阅读这些!

单词:Richard Leggett

理查德是...的创始人Valis Interactive,专注于移动和Web应用程序开发。



翻译字数超限