Прочитать сообщение NDEF из тега два раза одним касанием (без перемещения телефона)

1

Я получил все успешно, прочитав сообщение NDEF из тега NFC. И после того, как я прочитал, я перемещаю телефон, и он может прочитать тег снова.

Я использую onNewIntent и foregroundDispatch для обработки сообщения.

Проблема в том, что я хочу прочитать один и тот же тег NFC дважды (из соображений безопасности), не перемещая телефон (не касаясь тега второй раз). Поэтому для одного прикосновения я хочу прочитать дважды.

Я пытаюсь увидеть жизненный цикл, но, кажется, если вы не переместите телефон, он не будет выдавать новое намерение снова.

private NfcAdapter nfc = null;
private boolean inReadMode = false;
private boolean isNFC_support = false;
private PendingIntent mPendingIntent;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ignore the unrelevent part of layout
    isNFC_support = true;
    nfc = NfcAdapter.getDefaultAdapter(this);
    if(nfc == null) {
        Toast.makeText(this, "Not support NFC device.", Toast.LENGTH_LONG).show();
        isNFC_support = false;
    }
    if(!nfc.isEnabled()) {
        Toast.makeText(this, "Please go the setting and enable NFC first.", Toast.LENGTH_LONG).show();
        isNFC_support = false;
    }
    if (isNFC_support == true) {
        mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    }
}

@Override
protected void onNewIntent(Intent intent) {
    Log.i("NFC", "---- onNewIntent called ---- ");
    if (this.inReadMode && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Log.i("NFC", "---- onNewIntent called ---- AND read nfc success!");
        try {
            readFromTag(intent);
        } catch (Exception e) {
            Log.e("NFC", "nfc cmac validate: ", e);
        }
    }
}

@Override
public void onResume() {
    super.onResume();
    Log.i("NFC", "---- onResume called ---- ");
    nfc.enableForegroundDispatch(this, mPendingIntent, null, null);
}


@Override
public void onPause() {
    Log.i("NFC", "---- onPause called ---- ");
    if (nfc != null) {
        nfc.disableForegroundDispatch(this);
    }
    if (isFinishing()) {
        cleanupReadingFromTag();
    }
    super.onPause();
}

private void readFromTag(Intent intent) throws RuntimeException, NoSuchAlgorithmException, IOException {
    Parcelable[] msgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    // code I handle the message as I get. Not important for read twice I think?
}

Итак, как я могу прочитать тег снова во второй раз?

Теги:
tags
nfc
android-intent
ndef

1 ответ

1
Лучший ответ

Намерения NFC отправляются только при обнаружении меток NFC. Если тег содержит сообщение NDEF, это сообщение автоматически обрабатывается и NfcAdapter.EXTRA_NDEF_MESSAGES вашему приложению с дополнительной целью (NfcAdapter.EXTRA_NDEF_MESSAGES).

Если вы захотите снова прочитать тег на более позднем этапе (и вам удалось поддерживать постоянную связь тега NFC), вам нужно будет напрямую связаться с тегом. Вы можете сделать это через объект дескриптора тега. Этот объект (класс Tag) также передается вашему приложению при обнаружении тега (в качестве дополнительного намерения для намерения NFC):

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

Пока тег подключен, вы можете использовать этот объект в любое время, чтобы инициировать связь с вашим тегом. Например, чтобы только что прочитать текущее сообщение NDEF по тегу, вы можете использовать:

Ndef ndef = Ndef.get(tag);
if (ndef != null) {
    try {
        ndef.connect();
        NdefMessage msg = ndef.getNdefMessage();
        // do something with the NDEF message
    } catch (IOException e) {
    } finally {
        try {
            ndef.close();
        } catch (Exception e) {}
    }
}
  • 0
    Благодарю. Вы экономите день. Я уже попробовал это вчера. Но мой метод ошибся и не работает. Незначительные изменения делают много изменений!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню