Note that there are some explanatory texts on larger screens.

plurals
  1. POArrayIndexOutOfBoundsException After Scanning NFC Tag
    primarykey
    data
    text
    <p>I'm attempting to rebuild my NFC Tag Reader </p> <p><a href="https://stackoverflow.com/questions/16071121/converting-existing-nfc-script-to-read-multiple-ndef-records">https://stackoverflow.com/questions/16071121/converting-existing-nfc-script-to-read-multiple-ndef-records</a></p> <p>and I'm getting the following error: </p> <pre><code> java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 </code></pre> <p>on the line: </p> <pre><code> NdefMessage msg2 = (NdefMessage) rawMsgs[1]; </code></pre> <p>I understand the issue is usually related to trying to access an array item that doesn't exist however I'm really not sure how to resolve the issue in the following implementation.</p> <p>P.S.</p> <p>The issue only occurs when scanning a new NFC tag. I noticed something VERY interesting though... </p> <p>If I comment out the following two lines the app does not crash AND scans the tag successfully! </p> <pre><code>// NdefMessage msg2 = (NdefMessage) rawMsgs[1]; // beamMsg2.setText(new String(msg.getRecords()[1].getPayload())); </code></pre> <p>SOURCE:</p> <pre><code>public class Nfc extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { NfcAdapter mNfcAdapter; TextView beamMsg; TextView beamMsg2; private static final int MESSAGE_SENT = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.nfc); beamMsg = (TextView) findViewById(R.id.msg); beamMsg2 = (TextView) findViewById(R.id.msg_ID); beamMsg.setText("Peter Smith"); beamMsg2.setText("123456"); // Check for available NFC Adapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { beamMsg = (TextView) findViewById(R.id.msg); beamMsg2= (TextView) findViewById(R.id.msg_ID); beamMsg.setText("NFC is not available on this device."); beamMsg2.setText("NFC is not available on this device."); } else { // Register callback to set NDEF message mNfcAdapter.setNdefPushMessageCallback(this, this); // Register callback to listen for message-sent success mNfcAdapter.setOnNdefPushCompleteCallback(this, this); } } public void submitClicked(View v) { Toast toast = Toast.makeText(getApplicationContext(), R.string.info, Toast.LENGTH_LONG); toast.show(); } /** * Implementation for the CreateNdefMessageCallback interface */ @Override public NdefMessage createNdefMessage(NfcEvent event) { NdefMessage msg = new NdefMessage(NdefRecord.createMime( beamMsg.getText() .toString(), null)); return msg; } public NdefMessage createNdefMessage_two(NfcEvent event) { NdefMessage msg2 = new NdefMessage(NdefRecord.createMime( beamMsg2.getText() .toString(), null)); return msg2; } /** * Implementation for the OnNdefPushCompleteCallback interface */ @Override public void onNdefPushComplete(NfcEvent arg0) { // A handler is needed to send messages to the activity when this // callback occurs, because it happens from a binder thread mHandler.obtainMessage(MESSAGE_SENT).sendToTarget(); } /** This handler receives a message from onNdefPushComplete */ private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_SENT: Toast.makeText(getApplicationContext(), "Message sent!", Toast.LENGTH_LONG).show(); break; } } }; @Override public void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; NdefMessage msg2 = (NdefMessage) rawMsgs[1]; // record 0 contains the MIME type, record 1 is the AAR, if present beamMsg.setText(new String(msg.getRecords()[0].getPayload())); beamMsg2.setText(new String(msg.getRecords()[1].getPayload())); } @Override public boolean onCreateOptionsMenu(Menu menu) { // If NFC is not available, we won't be needing this menu if (mNfcAdapter == null) { return super.onCreateOptionsMenu(menu); } MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } // @Override // public boolean onOptionsItemSelected(MenuItem item) { // switch (item.getItemId()) { // case R.id.menu_settings: // Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS); // startActivity(intent); // return true; // default: // return super.onOptionsItemSelected(item); // } } //}//} </code></pre> <p>EDIT AFTER ANSWER:</p> <pre><code>public class Connect extends Activity implements CreateNdefMessageCallback, OnNdefPushCompleteCallback { NfcAdapter mNfcAdapter; TextView beamMsg; TextView beamMsg2; private static final int MESSAGE_SENT = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.connect); beamMsg = (TextView) findViewById(R.id.msg); beamMsg2 = (TextView) findViewById(R.id.msg_ID); beamMsg.setText("Peter Smith"); beamMsg2.setText("123456"); // Check for available NFC Adapter mNfcAdapter = NfcAdapter.getDefaultAdapter(this); if (mNfcAdapter == null) { beamMsg = (TextView) findViewById(R.id.msg); beamMsg2= (TextView) findViewById(R.id.msg_ID); beamMsg.setText("NFC is not available on this device."); beamMsg2.setText("NFC is not available on this device."); } else { // Register callback to set NDEF message mNfcAdapter.setNdefPushMessageCallback(this, this); // Register callback to listen for message-sent success mNfcAdapter.setOnNdefPushCompleteCallback(this, this); } } public void submitClicked(View v) { Toast toast = Toast.makeText(getApplicationContext(), R.string.info, Toast.LENGTH_LONG); toast.show(); } /** * Implementation for the CreateNdefMessageCallback interface */ @Override public NdefMessage createNdefMessage(NfcEvent event) { NdefMessage msg = new NdefMessage(NdefRecord.createMime( beamMsg.getText() .toString(), null)); return msg; } public NdefMessage createNdefMessage_two(NfcEvent event) { NdefMessage msg2 = new NdefMessage(NdefRecord.createMime( beamMsg2.getText() .toString(), null)); return msg2; } /** * Implementation for the OnNdefPushCompleteCallback interface */ @Override public void onNdefPushComplete(NfcEvent arg0) { // A handler is needed to send messages to the activity when this // callback occurs, because it happens from a binder thread mHandler.obtainMessage(MESSAGE_SENT).sendToTarget(); } /** This handler receives a message from onNdefPushComplete */ private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_SENT: Toast.makeText(getApplicationContext(), "Message sent!", Toast.LENGTH_LONG).show(); break; } } }; @Override public void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage[] msg = new NdefMessage[rawMsgs.length]; for (int i = 0; i &lt; msg.length; i++) { msg[i] = (NdefMessage) rawMsgs[i]; // record 0 contains the MIME type, record 1 is the AAR, if present beamMsg[i].setText(new String(msg[i].getRecords()[1].getPayload())); beamMsg2[i].setText(new String(msg[i].getRecords()[1].getPayload())); }} @Override public boolean onCreateOptionsMenu(Menu menu) { // If NFC is not available, we won't be needing this menu if (mNfcAdapter == null) { return super.onCreateOptionsMenu(menu); } MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return true; } // @Override // public boolean onOptionsItemSelected(MenuItem item) { // switch (item.getItemId()) { // case R.id.menu_settings: // Intent intent = new Intent(Settings.ACTION_NFCSHARING_SETTINGS); // startActivity(intent); // return true; // default: // return super.onOptionsItemSelected(item); // } } //}//} </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload