この例にいくつかの変更を加えて、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);
}
}