2015-06-15 43 views
4

我想使用NFC标签启动应用程序。我使用了Start Android application from NFC-tag with extra data或通过使用NDEF_DISCOVERED/TECH_DISCOVERED意图过滤器中描述的Android应用程序记录(AAR)。但是,如何通过NFC事件将NFC标签中的数据(例如一些文本)传递给我的活动?Android NFC在启动应用程序时传递单个参数

我已阅读NFC Basics,但据我了解,它似乎想实现一个读取标签的机制,当我真的不想重新读取标签,一旦应用程序被打开标记,但是我只想让数据同时传入。

此外,这些机制似乎允许应用在标签启动后读取标签。换句话说,我担心如果有人在应用程序打开后再次打开该标签,该标签将再次被读取(这是我所做的而不是想要的)。

其次,我该如何创建这样的NDEF消息?

+0

应用程序的数据来自哪里?从NFC标签或其他地方? – corvairjo

+0

您是否阅读过http://developer.android.com/guide/topics/connectivity/nfc/nfc.html? –

+0

corvairjo - 数据将来自NFC标签。所以我想NFC标签启动应用程序(这很容易),然后传入一个字符串(这是我觉得很困惑)。 –

回答

6

Android将自动读取NFC标签的NDEF消息,为了处理它基于Android的应用程序记录基于第一NDEF记录

  • 开始注册活动,
  • 启动应用程序(AAR )在NDEF消息中的任何地方。

为了让您的活动开始,并有Android的通过预读取NDEF消息,你可以使用NDEF_DISCOVERED意图过滤器:

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <data android:scheme="vnd.android.nfc" 
     android:host="ext" 
     android:pathPrefix="/example.com:mycustomtype"/> 
</intent-filter> 
从活动中

然后,您可以处理该NDEF消息:

public void onResume() { 
    super.onResume(); 
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { 
     NdefMessage[] msgs = null; 
     Parcelable[] 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]; 
      } 
     } 

     if ((msgs != null) && (msgs.length > 0)) { 
      NdefRecord[] records = msgs[0].getRecords(); 
      NdefRecord firstRecord = records[0]; 
      byte[] payloadData = firstRecord.getPayload(); 

      // do something with the payload (data passed through your NDEF record) 
      // or process remaining NDEF message 

     } 
    } 
} 

请注意,onResume()会在您的活动成为前台活动时运行。因此,它可能会在同一个标​​签上运行多次。因此,您可以使用另一种生命周期方法,或者采取一些预防措施,避免多次解析消息。

如果您想要放弃所有进一步的NFC事件,一旦您的活动开放,您可以按照我在Android app enable NFC only for one Activity的回应中描述的方法进行操作。因此,你的前景调度寄存器(这使您的活动优先接收NFC事件,然后你可以简单地下降这些事件。

public void onResume() { 
    super.onResume(); 
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
    nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 
} 

public void onPause() { 
    super.onPause(); 
    NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 
    nfcAdapter.disableForegroundDispatch(this); 
} 

public void onNewIntent(Intent intent) { 
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) { 
     // drop NFC events 
    } 
} 

最后,创建NDEF消息的NFC标签,你会做这样的事情:

byte[] payload = ... // generate your data payload 
NdefMessage msg = new NdefMessage(
    NdefRecord.createExternal("example.com", "mycustomtype", payload) 
) 

如果你想确保只有您的应用程序是通过这个标签开始(或者如果没有安装Play商店打开你的应用程序),你还可以添加一个AAR:

NdefMessage msg = new NdefMessage(
    NdefRecord.createExternal("example.com", "mycustomtype", payload), 
    NdefRecord.createApplicationRecord("com.example.your.app.package") 
) 
+0

完美!可能是在下周实施,并会根据我的发现进行更新。谢谢您的帮助! –

+0

@Michael Roland“..onResume()只要你的活动成为前台活动就运行......” 我们该如何处理它,我花了很多时间弄清楚它?任何想法 ? – Anna

相关问题