Android近场通信---NFC基础(五)(转)

转自 http://blog.csdn.net/think_soft/article/details/8190463

Android应用程序记录(Android Application Record---AAR)

在Android4.0(API Level 14)中引入的Android应用程序记录(AAR),提供了较强的在扫描到NFC标签时,启动应用程序的确定性。AAR有嵌入到NDEF记录内部的应用程序的包名。你能够把一个AAR添加到你的NDEF消息的任何记录中,因为Android会针对AAR来搜索整个NDEF消息。如果它找到一个AAR,它就会基于AAR内部的包名来启动应用程序。如果该应用程序不在当前的设备上,会启动Google Play来下载对应的应用程序。

如果你想要防止其他的应用对相同的Intent的过滤并潜在的处理你部署的特定的NFC标签,那么AAR是有用的。AAR仅在应用程序级被支持,因为包名的约束,并不能在Activity级别来过滤Intent。如果你想要在Activity级处理Intent,请使用Intent过滤器。

如果NFC标签中包含了AAR,则NFC标签调度系统会按照下列方式来调度:

1.  通常,尝试使用Intent过滤器来启动一个Activity。如果跟该Intent匹配的Activity也跟AAR匹配,那么就启动该Activity。

2.  如果跟Intent队形的Activity跟AAR不匹配,或者是有多个Activity能够处理该Intent,或者是没有能够处理该Intent的Activity存在,那么就启动由AAR指定的应用程序。

3.  如果没有跟该AAR对应的应用程序,那么就会启动Google Play来小组基于该AAR的应用程序。

注意:你能够用前台调度系统来重写AAR和Intent调度系统,在NFC标签被发现时。它允许优先使用前台的Activity。用这种方法,Activity必须是在前台来重写AAR和Intent调度系统。

如果你依然想要过滤扫描到的没有包含AAR的NFC标签,通常,你能够声明Intent过滤器。如果你的应用程序对不包含AAR的其他NFC标签感兴趣,这种做法是有用的。例如,你可能想要保证你的应用程序处理你部署的专用NFC标签,以及由第三方部署的普通的NFC标签。要记住AAR是在Android4.0以后才指定的,因此部署NFC标签时,你很可能希望使用能够广泛支持AAR和MIME类型/URI的是设备。另外,在你部署NFC标签时,还要想如何编写你的NFC标签,以便让大多数设备(Android设备和其他设备)支持。同过定义相对唯一的MIME类型或URI,让应用程序更容易的区分,就可以做到这一点。

Android提供了简单的创建AAR的API:createApplicationRecord()。你需要做的所有工作就是把AAR嵌入到你的NdefMessage中。除非AAR是NdefMessage中的唯一记录,否则不要把使用NdefMessage的第一条记录。这是因为,Android系统会检查NdefMessage的第一条记录来判断NFC标签的MIME类型或URI,这些信息被用于创建对应应用程序的Intent对象。以下代码演示了如何创建一个AAR:

NdefMessage msg = new NdefMessage(

new NdefRecord[] {

...,

NdefRecord.createApplicationRecord("com.example.android.beam")}

把NDEF消息发射到其他设备上

Android Beam允许在两个Android设备之间进行简单的对等数据交换,想要把数据发送给另一个设备的应用程序必须是在前台,并且接收数据的设备必须不被锁定。当发射设备跟接收设备的距离足够近的时候,发射设备会显示“Touch to Beam(触摸发射)”的UI。然后,用户能够选择是否把消息发射给接收设备。

注意:在API Level 10中可以利用前台的NDEF推送,它提供了与Android Beam类似的功能。这些API已经过时了,但是在一些老旧设备上还有效。更多的信息请看enableForegroundNdefPush()

通过调用下列两个方法中的任意一个,就能够为你的应用程序启用Android Beam:

1.  setNdefPushMessage():这个方法把接收到的NdefMessage对象作为一个消息设置给Beam。当两个设备足够近的时候,就会自动的发送消息。

2.  setNdefPushMessageCallback():接收包含createNdefMessage()方法的回调,当设备在发射数据的范围内时,这个回调方法会被调用。回调会让你只在需要的时候创建NDEF消息。

一个Activity一次只能推送一条NDEF消息,因此如果同时使用了这两种方法,那么setNdefPushMessageCallback()方法的优先级要高于setNdefPushMessage()方法。要使用Android Beam,通常必须满足以下条件:

1.  发射数据的Activity必须是在前台。两个设备的屏幕都必须没有被锁定;

2.  必须发要发射的数据封装到一个NdefMessage对象中;

3.  接收发射数据的NFC设备必须支持com.android.npp NDEF推送协议或是NFC组织的SNEP协议(简单的NDEF交换协议)。在API Level9(Android2.3)到API Level 13(Android3.2)的设备上需要com.android.npp协议。在API Level 14(Android4.0)和以后的设备上,com.android.npp和SNEP都需要。

注意:如果在前台的Activity启用了Android Beam,那么标准的Intent调度系统就会被禁用。但是,如果该Activity还启用了前台调度,那么在前台调度系统中,它依然能够扫描到跟Intent过滤器匹配的NFC标签。

启用Android Beam:

1.  创建一个准备推送到另一个设备上的包含NdefRecord的NdefMessage对象。

2.  调用带有NdefMessage类型参数的setNdefPushMessage()方法,或者是在Activity的onCreate()方法中调用setNdefPushMessageCallback方法来传递实现NfcAdapter.CreateNdefMessageCallback接口的对象。这两个方法都至少需要一个准备要启用Android Beam的Activity,以及一个可选的其他的活跃的Activity列表。

通常,如果你的Activity在任何时候都值推送相同的NDEF消息,那么当两个设备在通信范围内的时候,使用setNdefPushMessage()就可以了。当你的应用程序要关注应用程序的当前内容,并想要根据用户在你的应用程序中的行为来推送NDEF消息时,就要使用setNdefPushMessageCallback方法。

下列示例代码演示了如何在activity的onCreate()方法中调用NfcAdapter.CreateNdefMessageCallback方法(完整的示例请看AndroidBeamDemo)。这个示例中还有帮助创建MIME记录的方法:

package com.example.android.beam;

import android.app.Activity;

import android.content.Intent;

import android.nfc.NdefMessage;

import android.nfc.NdefRecord;

import android.nfc.NfcAdapter;

import android.nfc.NfcAdapter.CreateNdefMessageCallback;

import android.nfc.NfcEvent;

import android.os.Bundle;

import android.os.Parcelable;

import android.widget.TextView;

import android.widget.Toast;

import java.nio.charset.Charset;

public class Beam extends Activity implements CreateNdefMessageCallback {

NfcAdapter mNfcAdapter;

TextView textView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView textView = (TextView) findViewById(R.id.textView);

// Check for available NFC Adapter

mNfcAdapter = NfcAdapter.getDefaultAdapter(this);

if (mNfcAdapter == null) {

Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();

finish();

return;

}

// Register callback

mNfcAdapter.setNdefPushMessageCallback(this, this);

}

@Override

public NdefMessage createNdefMessage(NfcEvent event) {

String text = ("Beam me up, Android!\n\n" +

"Beam Time: " + System.currentTimeMillis());

NdefMessage msg = new NdefMessage(

new NdefRecord[] { createMime(

"application/vnd.com.example.android.beam", text.getBytes())

/**

* The Android Application Record (AAR) is commented out. When a device

* receives a push with an AAR in it, the application specified in the AAR

* is guaranteed to run. The AAR overrides the tag dispatch system.

* You can add it back in to guarantee that this

* activity starts when receiving a beamed message. For now, this code

* uses the tag dispatch system.

*/

//,NdefRecord.createApplicationRecord("com.example.android.beam")

});

return msg;

}

@Override

public void onResume() {

super.onResume();

// Check to see that the Activity started due to an Android Beam

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {

processIntent(getIntent());

}

}

@Override

public void onNewIntent(Intent intent) {

// onResume gets called after this to handle the intent

setIntent(intent);

}

/**

* Parses the NDEF Message from the intent and prints to the TextView

*/

void processIntent(Intent intent) {

textView = (TextView) findViewById(R.id.textView);

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(

NfcAdapter.EXTRA_NDEF_MESSAGES);

// only one message sent during the beam

NdefMessage msg = (NdefMessage) rawMsgs[0];

// record 0 contains the MIME type, record 1 is the AAR, if present

textView.setText(new String(msg.getRecords()[0].getPayload()));

}

}

注意:上例代码把AAR给注释掉了,你可以删除它。如果你启用了AAR,那么该应用程序就会始终接收在AAR中指定的Android Beam消息。如果该应用程序不存在,Google Play就会启动下载程序。因此,如果使用AAR,对于Android4.0以后的设备,下列的Intent过滤器,在技术上不是必须的:

<intent-filter>

<action android:name="android.nfc.action.NDEF_DISCOVERED"/>

<category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="application/vnd.com.example.android.beam"/>

</intent-filter>

有了这个Intent过滤器,com.example.android.beam应用就能够在以下情况下被启动:

1.  扫描到NFC标签;

2.  接收到com.example.android.beam类型的AAR或NDEF消息中包含一条application/vnd.com.example.android.beam类型的MIME记录的Android beam的时候。

即使通过AAR能够保证了一个应用程序被启动或下载,但是还是推荐使用Intent过滤器,因为它会让你选择启动应用程序中Activity,而不是总启动AAR中指定的应用程序包的主Activity。AAR没有Activity级别的粒度。而且还有一些android设备不支持AAR,你还应该在NDEF消息的第一条NDEF记录中嵌入标识信息,以及对应的过滤器。

时间: 2024-11-14 08:15:31

Android近场通信---NFC基础(五)(转)的相关文章

Android近场通信---NFC基础(一)(转)

转自 http://blog.csdn.net/think_soft/article/details/8169483 本文译自:http://developer.android.com/guide/topics/connectivity/nfc/nfc.html 本文介绍在Android系通过你所能执行的基本任务?它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架API?有关更高级的话题,包括对非NDEF格式数据的讨论,情况“高级 NFC” NDEF

Android近场通信---NFC基础(三)(转)

转自 http://blog.csdn.net/think_soft/article/details/8180203 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种.两种或全部三种类型的NFC的Intent来过滤.但是,通常想要在应用程序启动时控制最常用的ACTION_NDEF_DISCOVERED类型的Intent.在没有过滤ACTION_NDEF_DISCOVERED类型的Intent的应用程序,或数据负载不是

Android近场通信---NFC基础(四)(转)

转自http://blog.csdn.net/think_soft/article/details/8184539 从Intent中获取信息 如果因为NFC的Intent而启动一个Activity,那么你就能够从Intent中获取被扫描到的NFC标签的相关信息.根据被扫描到的标签,Intent对象能够以下额外的信息: 1.  EXTRA_TAG(必须的):它是一个代表了被扫描到的标签的Tag对象: 2.  EXTRA_NDEF_MESSAGES(可选):它是一个解析来自标签中的NDEF消息的数组

Android近场通信---NFC基础(二)(转)

转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的Intent对象的创建时,它会把该Intent对象发送给感兴趣的应用程序.如果有多个应用程序能够处理该Intent对象,就会显示Activity选择器,让用户选择Activity.标签调度系统定义了三种Intent对象,以下按照由高到低的优先级列出这三种Intent对象: 1.  ACTION_NDEF

Android中文翻译 - NFC基础

NFC 基础 本文档介绍了在Android上的基本的NFC任务.它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC data),并介绍Android框架里支持这些功能的API.对于更高级的主题,包括与非NDEF数据的讨论,请参阅高级NFC. 当使用NDEF 数据和Android时,有两个主要的使用场景: •从一个NFC 标签里读取NDEF 数据 •使用 Android Beam™ 快速传输Beaming NDEF messages从一台设备到

Android近场通信---高级NFC(二)

读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在直接使用NFC标签工作时,你依然能够读写NDEF数据.这是你想要如何构建的事情.下例演示了如何使用MIFARE超薄标签来工作: package com.example.android.nfc; import android.nfc.Tag; import android.nfc.tech.MifareUltralight; import and

Android NFC近场通信03----读写MifareClassic卡

                                       Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16个分区(sector),每个分区4个块(block),每个块(block) 16个byte数据 2K: 32个分区,每个分区4个块(block),每个块(block) 16个byte数据 4K:64个分区,每个分区4个块(

Android NFC近场通信02----读写卡的准备工作

                    Android NFC近场通信02----读写卡的准备工作      由于公司接了一个听上去感觉比较NB的项目,给某油田做派工系统 .并由小女子负责Android客户端的开发工作~~开发时的Android设备看上去是比较高大上哈,防爆的,其实很多次同事们都想开玩笑的说试试摔地上,都防爆嘛,那肯定摔不坏的哈~~开发过程中需要用到NFC技术,所以就在网上学习并整理了一下关于Android nfc相关的知识~好了,切入主题,本文写读写卡前的准备工作: ps:这一

NFC:Arduino、Android与PhoneGap近场通信

NFC:Arduino.Android与PhoneGap近场通信(第一本全面讲解NFC应用开发的技术著作移动智能设备近距离通信编程实战入门) [美]Tom Igoe(汤姆.伊戈),Don Coleman(唐.科尔曼),Brian Jepson(布莱恩.杰普森) 著   金建刚 冯依 姚尚朗 译 ISBN 978-7-121-23997-7 2014年9月出版 定价:65.00元 244页 16开 编辑推荐 欢迎进入近场通信(NFC)的世界,这种飞速发展的新技术能通过无线信号在靠近的电子设备间进行