Android 安卓应用程序通过点击nfc标签自动启动特定活动

Android 安卓应用程序通过点击nfc标签自动启动特定活动,android,nfc,Android,Nfc,我想通过点击nfc标签来启动应用程序的特定活动。我只能写包名。但是,除了包名之外,我还想添加一个字符串,并基于该字符串启动活动。因此,有一种更标准的方法可以将标记数据静态和动态映射到活动,还有一种更好的方法可以进行静态映射 静态映射的更好方法是,您的标记需要在标记上有一个,然后是另一个具有自定义mimetype的NDEF记录,其中字符串编码在mimetype中(NDEF记录的内容无关紧要)。 (请参见如何创建mimeType NDEF记录) 这是一种更好的方法,因为您可以使用manifest I

我想通过点击nfc标签来启动应用程序的特定活动。我只能写包名。但是,除了包名之外,我还想添加一个字符串,并基于该字符串启动活动。

因此,有一种更标准的方法可以将标记数据静态和动态映射到活动,还有一种更好的方法可以进行静态映射

静态映射的更好方法是,您的标记需要在标记上有一个,然后是另一个具有自定义mimetype的NDEF记录,其中字符串编码在mimetype中(NDEF记录的内容无关紧要)。 (请参见如何创建mimeType NDEF记录)
这是一种更好的方法,因为您可以使用manifest Intent过滤器来指导Android操作系统启动哪个活动

e、 g.
要启动“活动A”的标记A具有应用程序的AAR记录和mimeType为“我的应用程序/活动-A”的NDEF记录
开始“活动B”的标记B有一个应用程序的AAR记录和一个mimeType为“我的应用程序/活动B”的NDEF记录

您的清单将如下所示:-

标签上的
以及包含字符串的,或者您可以使用自定义mimeType,因为这会阻止Android询问要启动哪个NFC应用程序,如果有其他NFC应用程序也处理NDEF文本记录(它们不太可能处理您的自定义mimeType)

然后是标签上的AAR记录和应用程序清单中的意图过滤器的组合,并在主活动和
enableForegroundDispatch
(或更好的
enableReaderMode
)中处理初始意图使用一个活动读取文本或自定义mimeType NDEF消息,然后直接基于文本字符串启动正确的活动,或者使用它查找要启动的活动

使用带有动态查找的自定义mimeType的示例。 您的清单将如下所示:-


主要活动使用
enableForegroundDispatch


....
专用NfcAdapter适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Intent minent=getIntent();
//检查应用程序是否因为清单中的意图过滤器而启动,如果是,则从意图中读取数据
if(NfcAdapter.ACTION\u NDEF\u DISCOVERED.equals(intent.getAction())){
手册内容(意图);
}
//在此处显示手动应用程序从图标开始的其他内容
//这可能只是启动默认的其他活动
}
@凌驾
受保护的void onNewIntent(意图){
super.onNewIntent(意向);
//检查意图来自NFC NDEF,来自foregroundDispatch
if(NfcAdapter.ACTION\u NDEF\u DISCOVERED.equals(intent.getAction())){
手册内容(意图);
}
}
恢复时公开作废(){
super.onResume();
PendingEvent=PendingEvent.getActivity(此,0,新意图(此,
getClass()).addFlags(Intent.FLAG\u ACTIVITY\u SINGLE\u TOP),0);
IntentFilter ndef=新的IntentFilter(NfcAdapter.ACTION\u ndef\u发现);
试一试{
//仅查找自定义mimeType
ndef.addDataType(“我的应用程序/文本”);
}
捕获(格式错误的dmimetype异常){
抛出新的运行时异常(“失败”,e);
}
intentFiltersArray=newintentfilter[]{ndef,};
enableForegroundDispatch(this,pendingent,intentFiltersArray,null);
}
@凌驾
公共无效暂停(){
super.onPause();
适配器。disableForegroundDispatch(此);
}
私人无效手册内容(意图){
Parcelable[]rawMessages=intent.getParcelableArrayExtra(NfcAdapter.EXTRA\u NDEF\u消息);
如果((rawMessages!=null)&&(rawMessages.length>0)){
ndefMessage=(ndefMessage)原始消息[0];
}
NdefRecord firstRecord=ndefMessage.getRecords()[0];
字符串有效负载=firstRecord.getPayload();
//要启动的动态查找活动
int activityId=查找(有效负载);
//开始正确的活动
意图;
开关(活动ID){
案例0:
意向=新意向(此,ActivityA.class);
案例1:
意向=新意向(此,ActivityB.class);
}
星触觉(意向);
}
所有活动中都应包含暂停时的
onPause
onResume
onNewIntent
handleIntent
,因此,如果在这些活动中出现卡片,则会启动正确的活动

因此,有许多场景需要处理

  • 没有安装应用程序-标签上的AAR记录将导致Android打开Play Store,提示用户安装您的应用程序。安装应用程序后,标签需要超出范围并再次输入范围,以触发Android操作系统再次读取并触发场景2

  • 应用程序已安装-标签上的自定义mimeType将导致Android启动主活动,并读取有效负载并启动正确的活动

  • 该应用程序已在运行-
    enableForegroundDispatch
    (或更好的
    enableReaderMode
    )将读取标记的自定义mimeType和有效负载字符串,并根据读取的mimeType切换到正确的活动


  • 听起来你对Android应用程序记录和清单意图过滤器感到困惑。当点击NFC标签时,您是否希望应用程序已经安装?并且已在运行另一个活动。如果应用程序已安装,则应打开该应用程序的特定活动。没有安装它应该要求从playstore安装。谢谢。我现在可以使用mime类型标记启动特定的活动。现在,我的标记包含AAR和mime类型的数据。因为我也想从play store安装。使用MIME类型,如果我启动了应用程序,我想在我想基于数据执行任务时读取MIME数据,该数据存储在标记中。示例:我的标记包含一些id。基于该id,我想检查数据库