Android近场通信NFC基础五.docx

上传人:b****4 文档编号:3507393 上传时间:2022-11-23 格式:DOCX 页数:6 大小:18.43KB
下载 相关 举报
Android近场通信NFC基础五.docx_第1页
第1页 / 共6页
Android近场通信NFC基础五.docx_第2页
第2页 / 共6页
Android近场通信NFC基础五.docx_第3页
第3页 / 共6页
Android近场通信NFC基础五.docx_第4页
第4页 / 共6页
Android近场通信NFC基础五.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

Android近场通信NFC基础五.docx

《Android近场通信NFC基础五.docx》由会员分享,可在线阅读,更多相关《Android近场通信NFC基础五.docx(6页珍藏版)》请在冰豆网上搜索。

Android近场通信NFC基础五.docx

Android近场通信NFC基础五

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

 

Android应用程序记录(AndroidApplicationRecord---AAR)

在Android4.0(APILevel14)中引入的Android应用程序记录(AAR),提供了较强的在扫描到NFC标签时,启动应用程序的确定性。

AAR有嵌入到NDEF记录内部的应用程序的包名。

你能够把一个AAR添加到你的NDEF消息的任何记录中,因为Android会针对AAR来搜索整个NDEF消息。

如果它找到一个AAR,它就会基于AAR内部的包名来启动应用程序。

如果该应用程序不在当前的设备上,会启动GooglePlay来下载对应的应用程序。

如果你想要防止其他的应用对相同的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对应的应用程序,那么就会启动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);

}

@Override

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("com.example.android.beam")

});

returnmsg;

}

@Override

publicvoidonResume(){

super.onResume();

//ChecktoseethattheActivitystartedduetoanAndroidBeam

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

processIntent(getIntent());

}

}

@Override

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过滤器,在技术上不是必须的:

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

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

mimeType="application/.example.android.beam"/>

有了这个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记录中嵌入标识信息,以及对应的过滤器。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1