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

Я получил все успешно, прочитав сообщение 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?
}

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


person o1xhack    schedule 15.11.2018    source источник


Ответы (1)


Намерения NFC отправляются только при обнаружении тегов NFC. Если тег содержит сообщение NDEF, это сообщение автоматически обрабатывается и передается вашему приложению в дополнительном намерении (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) {}
    }
}
person Michael Roland    schedule 16.11.2018
comment
Благодарю. вы экономите день. Я уже пробовал это вчера. Но мой метод ошибся и не работает. Незначительные изменения делают много изменений! - person o1xhack; 17.11.2018