Android近场通信NFC基础五文档格式.docx
- 文档编号:16412784
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:6
- 大小:18.43KB
Android近场通信NFC基础五文档格式.docx
《Android近场通信NFC基础五文档格式.docx》由会员分享,可在线阅读,更多相关《Android近场通信NFC基础五文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
3.如果没有跟该AAR对应的应用程序,那么就会启动GooglePlay来小组基于该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:
NdefMessagemsg=newNdefMessage(
newNdefRecord[]{
...,
NdefRecord.createApplicationRecord("
com.example.android.beam"
)}
把NDEF消息发射到其他设备上
AndroidBeam允许在两个Android设备之间进行简单的对等数据交换,想要把数据发送给另一个设备的应用程序必须是在前台,并且接收数据的设备必须不被锁定。
当发射设备跟接收设备的距离足够近的时候,发射设备会显示“TouchtoBeam(触摸发射)”的UI。
然后,用户能够选择是否把消息发射给接收设备。
在APILevel10中可以利用前台的NDEF推送,它提供了与AndroidBeam类似的功能。
这些API已经过时了,但是在一些老旧设备上还有效。
更多的信息请看enableForegroundNdefPush()。
通过调用下列两个方法中的任意一个,就能够为你的应用程序启用AndroidBeam:
1.setNdefPushMessage():
这个方法把接收到的NdefMessage对象作为一个消息设置给Beam。
当两个设备足够近的时候,就会自动的发送消息。
2.setNdefPushMessageCallback():
接收包含createNdefMessage()方法的回调,当设备在发射数据的范围内时,这个回调方法会被调用。
回调会让你只在需要的时候创建NDEF消息。
一个Activity一次只能推送一条NDEF消息,因此如果同时使用了这两种方法,那么setNdefPushMessageCallback()方法的优先级要高于setNdefPushMessage()方法。
要使用AndroidBeam,通常必须满足以下条件:
1.发射数据的Activity必须是在前台。
两个设备的屏幕都必须没有被锁定;
2.必须发要发射的数据封装到一个NdefMessage对象中;
3.接收发射数据的NFC设备必须支持com.android.nppNDEF推送协议或是NFC组织的SNEP协议(简单的NDEF交换协议)。
在APILevel9(Android2.3)到APILevel13(Android3.2)的设备上需要com.android.npp协议。
在APILevel14(Android4.0)和以后的设备上,com.android.npp和SNEP都需要。
如果在前台的Activity启用了AndroidBeam,那么标准的Intent调度系统就会被禁用。
但是,如果该Activity还启用了前台调度,那么在前台调度系统中,它依然能够扫描到跟Intent过滤器匹配的NFC标签。
启用AndroidBeam:
1.创建一个准备推送到另一个设备上的包含NdefRecord的NdefMessage对象。
2.调用带有NdefMessage类型参数的setNdefPushMessage()方法,或者是在Activity的onCreate()方法中调用setNdefPushMessageCallback方法来传递实现NfcAdapter.CreateNdefMessageCallback接口的对象。
这两个方法都至少需要一个准备要启用AndroidBeam的Activity,以及一个可选的其他的活跃的Activity列表。
通常,如果你的Activity在任何时候都值推送相同的NDEF消息,那么当两个设备在通信范围内的时候,使用setNdefPushMessage()就可以了。
当你的应用程序要关注应用程序的当前内容,并想要根据用户在你的应用程序中的行为来推送NDEF消息时,就要使用setNdefPushMessageCallback方法。
下列示例代码演示了如何在activity的onCreate()方法中调用NfcAdapter.CreateNdefMessageCallback方法(完整的示例请看AndroidBeamDemo)。
这个示例中还有帮助创建MIME记录的方法:
packagecom.example.android.beam;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.nfc.NdefMessage;
importandroid.nfc.NdefRecord;
importandroid.nfc.NfcAdapter;
importandroid.nfc.NfcAdapter.CreateNdefMessageCallback;
importandroid.nfc.NfcEvent;
importandroid.os.Bundle;
importandroid.os.Parcelable;
importandroid.widget.TextView;
importandroid.widget.Toast;
importjava.nio.charset.Charset;
publicclassBeamextendsActivityimplementsCreateNdefMessageCallback{
NfcAdaptermNfcAdapter;
TextViewtextView;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextViewtextView=(TextView)findViewById(R.id.textView);
//CheckforavailableNFCAdapter
mNfcAdapter=NfcAdapter.getDefaultAdapter(this);
if(mNfcAdapter==null){
Toast.makeText(this,"
NFCisnotavailable"
Toast.LENGTH_LONG).show();
finish();
return;
}
//Registercallback
mNfcAdapter.setNdefPushMessageCallback(this,this);
publicNdefMessagecreateNdefMessage(NfcEventevent){
Stringtext=("
Beammeup,Android!
\n\n"
+
"
BeamTime:
+System.currentTimeMillis());
NdefMessagemsg=newNdefMessage(
newNdefRecord[]{createMime(
application/.example.android.beam"
text.getBytes())
/**
*TheAndroidApplicationRecord(AAR)iscommentedout.Whenadevice
*receivesapushwithanAARinit,theapplicationspecifiedintheAAR
*isguaranteedtorun.TheAARoverridesthetagdispatchsystem.
*Youcanadditbackintoguaranteethatthis
*activitystartswhenreceivingabeamedmessage.Fornow,thiscode
*usesthetagdispatchsystem.
*/
//,NdefRecord.createApplicationRecord("
)
});
returnmsg;
publicvoidonResume(){
super.onResume();
//ChecktoseethattheActivitystartedduetoanAndroidBeam
if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())){
processIntent(getIntent());
publicvoidonNewIntent(Intentintent){
//onResumegetscalledafterthistohandletheintent
setIntent(intent);
*ParsestheNDEFMessagefromtheintentandprintstotheTextView
voidprocessIntent(Intentintent){
textView=(TextView)findViewById(R.id.textView);
Parcelable[]rawMsgs=intent.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES);
//onlyonemessagesentduringthebeam
NdefMessagemsg=(NdefMessage)rawMsgs[0];
//record0containstheMIMEtype,record1istheAAR,ifpresent
textView.setText(newString(msg.getRecords()[0].getPayload()));
}
上例代码把AAR给注释掉了,你可以删除它。
如果你启用了AAR,那么该应用程序就会始终接收在AAR中指定的AndroidBeam消息。
如果该应用程序不存在,GooglePlay就会启动下载程序。
因此,如果使用AAR,对于Android4.0以后的设备,下列的Intent过滤器,在技术上不是必须的:
<
intent-filter>
<
actionandroid:
name="
android.nfc.action.NDEF_DISCOVERED"
/>
categoryandroid:
android.intent.category.DEFAULT"
dataandroid:
mimeType="
/intent-filter>
有了这个Intent过滤器,com.example.android.beam应用就能够在以下情况下被启动:
1.扫描到NFC标签;
2.接收到com.example.android.beam类型的AAR或NDEF消息中包含一条application/.example.android.beam类型的MIME记录的Androidbeam的时候。
即使通过AAR能够保证了一个应用程序被启动或下载,但是还是推荐使用Intent过滤器,因为它会让你选择启动应用程序中Activity,而不是总启动AAR中指定的应用程序包的主Activity。
AAR没有Activity级别的粒度。
而且还有一些android设备不支持AAR,你还应该在NDEF消息的第一条NDEF记录中嵌入标识信息,以及对应的过滤器。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 近场 通信 NFC 基础