Android NFC活动onResume onNewIntent

时间:2012-11-29 18:43:36

标签: android android-intent nfc

我在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);
    }
}

1 个答案:

答案 0 :(得分:2)

如果清单中没有过滤器,那么您的应用程序将无法启动以处理标记。