【发布时间】:2014-11-03 04:57:45
【问题描述】:
我刚接触 Android 中的 NFC。我有几个问题。首先,让我介绍一下代码。在我的程序中,它只是简单地从记录中检索有效负载并将它们记录为字符串。
@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+")");
}
}
}
}
}
}
这里有两个问题:
结果告诉前台调度程序仅捕获 TECH_DISCOVERED(带有 techList)和 TAG_DISCOVERED(不带 techList)但错过了 NDEF_DISCOVERED。
当我离开应用程序并扫描 NFC 标签时,它会自动将我带到网站(我将 url 作为记录)。它如何告诉该记录包括打开浏览器或拨打电话的操作?
【问题讨论】:
-
为什么我不能触发 NDEF_DISCOVERED 动作???
标签: android nfc intentfilter ndef