0

この例にいくつかの変更を加えて、NFC タグ リーダー/ライターを開発しました。

「タイプX」と「タイプY」のカードを持っています。タイプ X カードは Ndef 読み取り/書き込み可能で、1 つは Mifare Classic、もう 1 つは Mifare Ultralight です。タイプ Y カードは Ndef フォーマット可能で、1 つはプロテクト (バス カード) で、もう 1 つはプロテクトされていません。

デバイス(Galaxy S3)から3つの音が出ますが、そのうちの1つは「このカードは読み書きが簡単です」という「美しい音」です。もう一つは、「このカードは手強いけど、情報はあるよ」という「いい音」です。最後は「醜い音」で、「NFCタグを見せているようですが、気にしません」と言っています。

アプリケーションを画面に表示して実行すると、Type X カードで美しいサウンドが得られ、読み取り/書き込みが可能になり、Type 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 };
}

私の履歴書:

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);
    }
}
4

1 に答える 1

2

マニフェストにフィルターがない場合、アプリケーションはタグを処理するために起動されません。

于 2012-11-29T21:27:26.060 に答える