2014-11-03 306 views
0

我刚刚在Android上使用NFC。我有几个问题。首先,让我介绍一下代码。在我的程序中,它只是从记录中检索有效负载并将它们记录为字符串。为什么总是TECH_DISCOVERED或TAG_DISCOVERED而不是NDEF_DISCOVERED?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    adapter = NfcAdapter.getDefaultAdapter(this); 
    nfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
    nfcFilter = new IntentFilter[]{ 
       new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED), 
       new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), 
       new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED) 
      }; 
    techList = new String[][]{{Ndef.class.getName()}}; 
} 

@Override 
public void onResume(){ 
    super.onResume(); 

    if (adapter != null){ 
     adapter.enableForegroundDispatch(this, nfcPendingIntent, nfcFilter, techList); 
     if (!adapter.isEnabled()){ 
      Toast.makeText(this, "please enable your nfc", Toast.LENGTH_SHORT).show(); 
     } 
    } else { 
     Toast.makeText(this, "your device do not have nfc.", Toast.LENGTH_SHORT).show(); 
    } 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    if (adapter != null){ 
     adapter.disableForegroundDispatch(this); 
    } 
} 

@Override 
protected void onNewIntent(Intent intent){ 
    String TAG = "onNewIntent"; 
    super.onNewIntent(intent); 

    Log.d(TAG, "action: "+intent.getAction()); 
    //Log.d(TAG, "type: "+intent.getType()); 
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())){ 
     Parcelable[] rawMsg = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     if (rawMsg != null){ 
      for (int i=0; i<rawMsg.length; i++){ 
       NdefMessage msg = (NdefMessage)rawMsg[i]; 
       NdefRecord[] records = msg.getRecords(); 
       for (int j=0; j<records.length; j++){ 
        Log.d(TAG, records[j].toMimeType()+""); 
        byte [] payload = records[j].getPayload(); 
        if (payload != null && payload.length > 0){ 
         Log.d(TAG, new String(payload, 1, payload.length-1)); 
        } 
       } 
      } 
     } 
    } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())){ 

    } else if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){ 
     Parcelable[] rawMsg = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
     if (rawMsg != null){ 
      for (int i=0; i<rawMsg.length; i++){ 
       NdefMessage msg = (NdefMessage)rawMsg[i]; 
       NdefRecord[] records = msg.getRecords(); 
       for (int j=0; j<records.length; j++){ 
        Log.d(TAG, records[j].toMimeType()+""); 
        byte [] payload = records[j].getPayload(); 
        if (payload != null && payload.length > 0){ 
         Log.d(TAG, new String(payload, 1, payload.length-1)+"("+j+")"); 
        } 
       } 
      } 
     } 
    } 
} 

在这里,它涉及两个问题:

  1. 结果告诉前台调度员只能望尘莫及TECH_DISCOVERED(与techList)和TAG_DISCOVERED(不techList),但错过了NDEF_DISCOVERED。

  2. 当我离开应用程序并扫描NFC标签时,它会自动将我带到网站(我把网址作为记录)。它如何告诉这个记录包括一个打开浏览器或拨打电话的动作?

+0

为什么我不能触发NDEF_DISCOVERED动作? – Simon 2014-11-03 10:07:43

回答

3

NDEF_DISCOVERED意图过滤器将典型地(一些例外似乎存在)仅当它具有其上的标记匹配NDEF消息相关联的数据类型相匹配。因此,例如,数据类型规范*/*将匹配任何MIME类型:

IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); 
try { 
    ndef.addDataType("*/*"); 
} catch (MalformedMimeTypeException e) {} 
nfcFilter = new IntentFilter[]{ 
     ndef, 
     new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED), 
     new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED) 
}; 

同样,如果你只想要触发特定URL http://www.example.com/,你可以使用:

IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED); 
ndef.addDataScheme("http"); 
ndef.addDataAuthority("www.example.com", null); 

注意 - 与前台调度系统 - 你通常只会注册你想匹配的最通用的意图过滤器。因此,如果您的前台调度意向过滤器已经包含动作TAG_DISCOVERED,则不需要添加任何更多特定的过滤器(如TECH_DISCOVEREDNDEF_DISCOVERED),因为您的活动已经收到任何发现的标记。 TECH_DISCOVEREDNdef标记技术相同:这已包含任何可触发NDEF_DISCOVERED的标记。但是,请注意,TAG_DISCOVERED intent过滤器的特殊之处在于,它在与前台调度一起使用时意味着“全部捕获”,而其意味着“仅后备”(即仅在与其他任何应用程序没有更好的匹配时才匹配)在基于清单的意图过滤器中。

+0

我添加了数据类型,但它仍然不是NDEF_DISCOVERED操作。如果我使用TAG_DISCOVERED代替,可以类似地检索消息吗?所有消息是否都遵循NDEF格式? – Simon 2014-11-04 03:43:52

+0

@Simon什么NDEF消息你有你的标签?如果您收到所有三个意图过滤器组合的TAG_DISCOVERED意向操作(如上所述),则您的标记不包含任何NDEF消息/不会被检测为NDEF标记。 – 2014-11-04 06:05:37

+0

我有2个文本/普通记录,标签支持ndef,nfca,ultralight技术......如何知道标签是否有NDEF消息?或检测为NDEF?结构确实遵循NDEF消息,因为我在代码中执行的操作如此顺利 – Simon 2014-11-04 08:08:17

相关问题