我在this example上做了一些更改,开发了NFC标签读写器。
我有“X型”和“Y型”牌。 X型卡是Ndef可读/可写的,一个是Mifare Classic,一个是Mifare Ultralight。 Y型卡是Ndef Formatable,其中一个是受保护的(公交卡),另一个不是。
我从设备中获得三个声音(Galaxy S3),其中一个是“美妙的声音”,说“这张卡很容易写入和读取,好吧”。另一个是“好听的”,说“这张卡很难,但我收到了一些信息。”最后一个是“丑陋的声音”,说“我看到你给我看了一个NFC标签,但我不在乎。”
当我在屏幕上运行应用程序时,我使用X型卡获得了美妙的声音,可以读/写,我使用Y型卡获得了良好的声音,我至少可以获得他们的技术信息。
然而,当我在背景上运行应用程序并且我在设备的主菜单时,我用X型卡获得了美妙的声音,一切都很好用,当我点击Y型卡时,我听到了丑陋的声音,该应用程序未显示在屏幕上,没有任何反应。
下面你可以看到我的部分代码,我认为我在 onResume 或 onNewIntent 操作上做错了。根据代码知道什么可能是错的,或者还有什么可能导致这种事情?谢谢 我的onStart:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
setContentView(R.layout.main);
findViewById(R.id.write_tag).setOnClickListener(mTagWriter);
mNote = ((EditText) findViewById(R.id.note));
mTechNotes = ((TextView) findViewById(R.id.tech_notes));
mNote.addTextChangedListener(mTextWatcher);
// Handle all of our received NFC intents in this activity.
mNfcPendingIntent = PendingIntent.getActivity(this, 0,
new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
// Intent filters for reading a note from a tag or exchanging over p2p.
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
try {
ndefDetected.addDataType("text/plain");
} catch (MalformedMimeTypeException e) { }
mNdefExchangeFilters = new IntentFilter[] { ndefDetected, tagDetected };
// Intent filters for writing to a tag
mWriteTagFilters = new IntentFilter[] { tagDetected };
}
我的onResume:
protected void onResume() {
super.onResume();
mResumed = true;
// Sticky notes received from Android
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
NdefMessage[] messages = getNdefMessages(getIntent());
byte[] payload = messages[0].getRecords()[0].getPayload();
setNoteBody(new String(payload));
setTechNotesBody(getTagInfo(getIntent()))
setIntent(new Intent()); // Consume this intent.
} else if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {
setTechNotesBody(getTagInfo(getIntent()));
setIntent(new Intent());
}
enableNdefExchangeMode();
}
我的onPause:
protected void onPause() {
super.onPause();
mResumed = false;
mNfcAdapter.disableForegroundNdefPush(this);
}
我的onNewIntent:
protected void onNewIntent(Intent intent) {
// NDEF exchange mode
if (!mWriteMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
NdefMessage[] msgs = getNdefMessages(intent);
promptForContent(msgs[0], getTagInfo(intent));
} else if(!mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
promptForContent(null, getTagInfo(intent));
}
// Tag writing mode
if (mWriteMode && NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
writeTag(getNoteAsNdef(), detectedTag);
}
}
答案 0 :(得分:2)
如果清单中没有过滤器,那么您的应用程序将无法启动以处理标记。