新闻中心

EEPW首页 > 手机与无线通信 > 设计应用 > Android 2.3.3 近场通信NFC介绍

Android 2.3.3 近场通信NFC介绍

作者:时间:2012-04-19来源:网络收藏

IntentFilter ndef = new IntentFilter ( NfcAdapter . ACTION_NDEF_DISCOVERED);

try {

ndef . addDataType ( */* ); /* Handles all MIME based dispatches.

You should specify only the ones that you need. */

}

catch ( MalformedMimeTypeException e ) {

throw new RuntimeException ( fail , e );

}

intentFiltersArray = new IntentFilter [] {

ndef ,

};

c. 设置一个你程序要处理的 Tag technologies 的列表,调用 Object.class.getName() 方法来获得你想要支持处理的 technology 类。

techListsArray = new String [][] { new String [] { NfcF . class . getName () } };

2. 覆盖下面的方法来打开或关闭前台发布系统。比如 onPause() 和 onResume ()方法。必须在主线程里调用[url=http://developer.android.com/reference/android/nfc/NfcAdapter.html#enableForegroundDispatch%28android.app.Activity,%20android.app.PendingIntent,%20android.content.IntentFilter[],%20java.lang.String[][]%29]enableForegroundDispatch(Activity, PendingIntent, IntentFilter[], String[][])[/url]而且Activity 在前台(可以在 onResume() 里调用来保证这点)。你也要覆盖 onNewIntent 回调来处理得到的 tag 数据。

public void onPause () {

super . onPause ();

mAdapter . disableForegroundDispatch ( this );

}

public void onResume () {

super . onResume ();

mAdapter . enableForegroundDispatch ( this , pendingIntent , intentFiltersArray, techListsArray );

}

public void onNewIntent ( Intent intent ) {

Tag tagFromIntent = intent . getParcelableExtra ( NfcAdapter . EXTRA_TAG );

//do something with tagFromIntent

}

See the ForegroundDispatch sample from API Demos for the complete sample.

使用 tag 上的数据

tag 上的数据是以字节存放,所以你可以将其转换成其他你想要的格式。当往 tag 写东西时,你必须以字节格式来写。 提供 API 来帮助写符合 NDEF 标准的信息。使用此标准能保证你的数据在往 tag 写时能被所有 NFC 设备支持。然而,很多 tag 使用他们自己的标准来存储数据,这些标准也被 支持。但你必须自己实现协议栈来读写这些 tag 。你可以在 android.nfc.tech 里找到所有支持的 technologies ,并且可以在 TagTechnology 接口里对technology 有个了解。这一段是简单在 android 系统里怎样使用 NDEF 消息。这不意味着是一个完整的 NDEF 功能的。但标出了主要需要注意和使用的东西。

为了方便使用 NDEF 消息, android 提供 NdefRecord和 NdefMessage来包装原始字节数据为 NDEF 消息。一个NdefMessage 是保存 0 个或多个 NdefRecords 的容器。每个 NdefRecord 有自己的唯一类型名字格式,记录类型和 ID 来与其他记录区分开。你可以存储不同类型的记录,不同的长度到同一个 NdefMessage 。 NFC tag 容量的限制决定你的NdefMessage 的大小。

那些支持 Ndef 和 NdefFormatable 技术的 tag 可以返回和接受 NdefMessage 对象为参数来进行读写操作。你需要创建你自己的逻辑来为其他在 android.nfc.tech 的 tag 技术实现读写字节的操作。

你可以从 NFC Forum(http://www.nfc-forum.org/specs/) 下载 NDEF 消息标准的技术文档,比如纯文本和智慧型海报 . NFCDemo 例子里声明了纯文本和智慧型海报的 NDef 消息。

读一个 NFC tag

当一个 NFC tag 靠近一个 NFC 设备,一个相应的 Intent 将在设备上被创建。然后通知合适的程序来处理此 Intent 。

下面的方法处理 TAG_DISCOVERED intent 并且使用迭代器来获得包含在 NDEF tag 负载的数据

NdefMessage [] getNdefMessages ( Intent intent ) {

// Parse the intent

NdefMessage [] msgs = null ;

String action = intent . getAction ();

if ( NfcAdapter . ACTION_TAG_DISCOVERED . equals ( action )) {

arcelable [] rawMsgs = intent . getParcelableArrayExtra ( NfcAdapter .EXTRA_NDEF_MESSAGES );

if ( rawMsgs != null ) {

msgs = new NdefMessage [ rawMsgs . length ];

for ( int i = 0 ; i rawMsgs . length ; i ++) {

msgs [ i ] = ( NdefMessage ) rawMsgs [ i ];

}

}

else {

// Unknown tag type

byte [] empty = new byte [] {};

NdefRecord record = new NdefRecord ( NdefRecord . TNF_UNKNOWN , empty , empty, empty );

NdefMessage msg = new NdefMessage ( new NdefRecord [] { record });

msgs = new NdefMessage [] { msg };

}

}

else {

Log . e ( TAG , Unknown intent + intent );

finish ();

}

return msgs ;

}

请记住 NFC 设备读到的数据是 byte 类型,所以你可能需要将他转成其他格式来呈现给用户。 NFCDemo 例子展示了怎样用 com.example.android.nfc.record 中的类来解析 NDEF 消息,比如纯文本和智慧型海报。

写 NFC tag

往 NFC tag 写东西涉及到构造一个 NDEF 消息和使用与 tag 匹配的 Tag 技术。下面的代码展示怎样写一个简单的文本到NdefFormatable tag :

NdefFormatable tag = NdefFormatable . get ( t );

Locale locale = Locale . US ;

final byte [] langBytes = locale . getLanguage (). getBytes ( Charsets . US_ASCII );

String text = Tag, you're it! ;

final byte [] textBytes = text . getBytes ( Charsets . UTF_8 );

final int utfBit = 0 ;

final char status = ( char ) ( utfBit + langBytes . length );

final byte [] data = Bytes . concat ( new byte [] {( byte ) status }, langBytes , textBytes);

NdefRecord record = NdefRecord ( NdefRecord . TNF_WELL_KNOWN , NdefRecord . RTD_TEXT , newbyte [ 0 ], data );

try {

NdefRecord [] records = { text };

NdefMessage message = new NdefMessage ( records );

tag . connect ();

tag . format ( message );

}

catch ( Exception e ){

//do error handling

}

点对点的数据交换

前台推送技术支持简单点对点的数据交换,你可以用 enableForegroundNdefPush(Activity, NdefMessage)方法来打开此功能 . 为了用这个功能:

· 推送数据的 Activity 必须是前台 Activity 。

· 你必须将你要发送的数据封装到 NdefMessage 对象里。

· 接收推送数据的设备必须支持 com.android.npp NDEF 推送协议,这个对于 Android 设备是可选的

假如你的 Activity 打开了前台推送功能并且位于前台,这时标准的 Intent 发布系统是禁止的。然而,如果你的Activity 允许前台发布系统,那么此时检测 tag 的功能仍然是可用的,不过只适用于前台发布系统。

要打开前台推送 :

1. 创建一个你要推送给其他 NFC 设备的包含 NdefRecords 的 NdefMessage 。

2. 在你的 Activity 里实现 onResume()和 onPause()的回调来正确处理前台推送的生命周期。你必须在你的Activity 位于前台并在主线程里调用 enableForegroundNdefPush(Activity, NdefMessage)(可以在onResume() 里调用来保证这点) .

public void onResume () {

super . onResume ();

if ( mAdapter != null )

mAdapter . enableForegroundNdefPush ( this , myNdefMessage );

}

public void onPause () {

super . onPause ();

if ( mAdapter != null )

mAdapter . disableForegroundNdefPush ( this );

}

当 Activity 位于前台,你可以靠近另外一个 NFC 设备来推送数据。请参考例子 ForegroundNdefPush 来了解点对点数据交换。

p2p机相关文章:p2p原理



上一页 1 2 下一页

评论


相关推荐

技术专区

关闭