Read NDEF message from tag two times with one single touch (without moving phone)










1















I got everything successfully by reading the NDEF message from NFC tag. And after I read, I move the phone and it can read the tag again.



I'm using the onNewIntent and foregroundDispatch to handle the message.



The problem is:
I want to read the same NFC tag twice (for security reasons) without moving the phone (without touching the tag a second time). So for a single touch, I want to read twice.



I try to see the life cycle but it seems if you do not move the phone, it will not issue a new intent again.



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?



So how can I read the tag again a second time?










share|improve this question




























    1















    I got everything successfully by reading the NDEF message from NFC tag. And after I read, I move the phone and it can read the tag again.



    I'm using the onNewIntent and foregroundDispatch to handle the message.



    The problem is:
    I want to read the same NFC tag twice (for security reasons) without moving the phone (without touching the tag a second time). So for a single touch, I want to read twice.



    I try to see the life cycle but it seems if you do not move the phone, it will not issue a new intent again.



    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?



    So how can I read the tag again a second time?










    share|improve this question


























      1












      1








      1








      I got everything successfully by reading the NDEF message from NFC tag. And after I read, I move the phone and it can read the tag again.



      I'm using the onNewIntent and foregroundDispatch to handle the message.



      The problem is:
      I want to read the same NFC tag twice (for security reasons) without moving the phone (without touching the tag a second time). So for a single touch, I want to read twice.



      I try to see the life cycle but it seems if you do not move the phone, it will not issue a new intent again.



      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?



      So how can I read the tag again a second time?










      share|improve this question
















      I got everything successfully by reading the NDEF message from NFC tag. And after I read, I move the phone and it can read the tag again.



      I'm using the onNewIntent and foregroundDispatch to handle the message.



      The problem is:
      I want to read the same NFC tag twice (for security reasons) without moving the phone (without touching the tag a second time). So for a single touch, I want to read twice.



      I try to see the life cycle but it seems if you do not move the phone, it will not issue a new intent again.



      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?



      So how can I read the tag again a second time?







      android android-intent tags nfc ndef






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 16 '18 at 12:53









      Michael Roland

      30.4k852115




      30.4k852115










      asked Nov 15 '18 at 22:40









      o1xhacko1xhack

      375




      375






















          1 Answer
          1






          active

          oldest

          votes


















          1














          The NFC intents are only dispatched upon detection of NFC tags. If a tag contains an NDEF message, that message is automatically processed and shared with your app in an intent extra (NfcAdapter.EXTRA_NDEF_MESSAGES).



          If you want to read from the tag again at a later stage (and managed to keep the NFC tag constantly connected), you will need to communicate with the tag directly. You can do this through the tag handle object. This object (class Tag) is also passed to your app upon tag detection (as an intent extra of the NFC intent):



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


          while the tag is connected, you can use that object at any time to initiate communication with your tag. E.g. to freshly read the current NDEF message on the tag, you could use:



          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)







          share|improve this answer























          • thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

            – o1xhack
            Nov 16 '18 at 23:59










          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "1"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328885%2fread-ndef-message-from-tag-two-times-with-one-single-touch-without-moving-phone%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          The NFC intents are only dispatched upon detection of NFC tags. If a tag contains an NDEF message, that message is automatically processed and shared with your app in an intent extra (NfcAdapter.EXTRA_NDEF_MESSAGES).



          If you want to read from the tag again at a later stage (and managed to keep the NFC tag constantly connected), you will need to communicate with the tag directly. You can do this through the tag handle object. This object (class Tag) is also passed to your app upon tag detection (as an intent extra of the NFC intent):



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


          while the tag is connected, you can use that object at any time to initiate communication with your tag. E.g. to freshly read the current NDEF message on the tag, you could use:



          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)







          share|improve this answer























          • thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

            – o1xhack
            Nov 16 '18 at 23:59















          1














          The NFC intents are only dispatched upon detection of NFC tags. If a tag contains an NDEF message, that message is automatically processed and shared with your app in an intent extra (NfcAdapter.EXTRA_NDEF_MESSAGES).



          If you want to read from the tag again at a later stage (and managed to keep the NFC tag constantly connected), you will need to communicate with the tag directly. You can do this through the tag handle object. This object (class Tag) is also passed to your app upon tag detection (as an intent extra of the NFC intent):



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


          while the tag is connected, you can use that object at any time to initiate communication with your tag. E.g. to freshly read the current NDEF message on the tag, you could use:



          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)







          share|improve this answer























          • thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

            – o1xhack
            Nov 16 '18 at 23:59













          1












          1








          1







          The NFC intents are only dispatched upon detection of NFC tags. If a tag contains an NDEF message, that message is automatically processed and shared with your app in an intent extra (NfcAdapter.EXTRA_NDEF_MESSAGES).



          If you want to read from the tag again at a later stage (and managed to keep the NFC tag constantly connected), you will need to communicate with the tag directly. You can do this through the tag handle object. This object (class Tag) is also passed to your app upon tag detection (as an intent extra of the NFC intent):



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


          while the tag is connected, you can use that object at any time to initiate communication with your tag. E.g. to freshly read the current NDEF message on the tag, you could use:



          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)







          share|improve this answer













          The NFC intents are only dispatched upon detection of NFC tags. If a tag contains an NDEF message, that message is automatically processed and shared with your app in an intent extra (NfcAdapter.EXTRA_NDEF_MESSAGES).



          If you want to read from the tag again at a later stage (and managed to keep the NFC tag constantly connected), you will need to communicate with the tag directly. You can do this through the tag handle object. This object (class Tag) is also passed to your app upon tag detection (as an intent extra of the NFC intent):



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


          while the tag is connected, you can use that object at any time to initiate communication with your tag. E.g. to freshly read the current NDEF message on the tag, you could use:



          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)








          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 16 '18 at 12:50









          Michael RolandMichael Roland

          30.4k852115




          30.4k852115












          • thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

            – o1xhack
            Nov 16 '18 at 23:59

















          • thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

            – o1xhack
            Nov 16 '18 at 23:59
















          thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

          – o1xhack
          Nov 16 '18 at 23:59





          thanks. you are day saver. I already tried out that yesterday. But my method got some wrong and not working. Slight different make a lot change!

          – o1xhack
          Nov 16 '18 at 23:59



















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53328885%2fread-ndef-message-from-tag-two-times-with-one-single-touch-without-moving-phone%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Top Tejano songwriter Luis Silva dead of heart attack at 64

          ReactJS Fetched API data displays live - need Data displayed static

          Evgeni Malkin