I have written a program to read out nfc Tags and visualize them onto a Toast which works perfectly fine.Code:
package com.example.myapplication;import android.app.Activity;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.nfc.NdefMessage;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.os.Bundle;import android.os.Parcelable;import android.util.Log;import android.widget.Toast;import java.io.UnsupportedEncodingException;public class MainActivity extends Activity { NfcAdapter nfcAdapter; PendingIntent pendingIntent; IntentFilter writeTagFilters[]; Tag myTag; Context context; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = this; nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // Stop here, we definitely need NFC Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); finish(); } readFromIntent(getIntent()); pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); tagDetected.addCategory(Intent.CATEGORY_DEFAULT); writeTagFilters = new IntentFilter[]{tagDetected}; } private void readFromIntent(Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage[] msgs = null; if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } buildTagViews(msgs); } } private void buildTagViews(NdefMessage[] msgs) { if (msgs == null || msgs.length == 0) return; String text = "";// String tagId = new String(msgs[0].getRecords()[0].getType()); byte[] payload = msgs[0].getRecords()[0].getPayload(); String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; // Get the Text Encoding int languageCodeLength = payload[0] & 0063; // Get the Language Code, e.g. "en" // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); try { // Get the Text text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); } catch (UnsupportedEncodingException e) { Log.e("UnsupportedEncoding", e.toString()); } Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show(); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); readFromIntent(intent); if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){ myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); } }}
But when I want this to be started in another File the app just crashes without giving me an error.
This is my used code:
package com.example.myapplication;import android.app.Activity;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.nfc.NdefMessage;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.os.Bundle;import android.os.Parcelable;import android.util.Log;import android.widget.Toast;import java.io.UnsupportedEncodingException;public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Nfc nfc = new Nfc(); nfc.startnfc(); }}
I didn't change the onCreate since it was imported from my main app, so you have an easier time to understand my code. It obviously wouldn't make a difference..
package com.example.myapplication;import static java.sql.DriverManager.println;import android.app.Activity;import android.app.PendingIntent;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.nfc.NdefMessage;import android.nfc.NfcAdapter;import android.nfc.Tag;import android.os.Bundle;import android.os.Parcelable;import android.util.Log;import android.widget.Toast;import java.io.UnsupportedEncodingException;public class Nfc extends Activity { NfcAdapter nfcAdapter; PendingIntent pendingIntent; IntentFilter writeTagFilters[]; Tag myTag; Context context; public void startnfc() { setContentView(R.layout.activity_main); context = this; nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { // Stop here, we definitely need NFC Toast.makeText(this, "This device doesn't support NFC.", Toast.LENGTH_LONG).show(); finish(); } readFromIntent(getIntent()); pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); tagDetected.addCategory(Intent.CATEGORY_DEFAULT); writeTagFilters = new IntentFilter[]{tagDetected}; } private void readFromIntent(Intent intent) { String action = intent.getAction(); if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); NdefMessage[] msgs = null; if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i < rawMsgs.length; i++) { msgs[i] = (NdefMessage) rawMsgs[i]; } } buildTagViews(msgs); } } private void buildTagViews(NdefMessage[] msgs) { if (msgs == null || msgs.length == 0) return; String text = "";// String tagId = new String(msgs[0].getRecords()[0].getType()); byte[] payload = msgs[0].getRecords()[0].getPayload(); String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16"; // Get the Text Encoding int languageCodeLength = payload[0] & 0063; // Get the Language Code, e.g. "en" // String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII"); try { // Get the Text text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding); } catch (UnsupportedEncodingException e) { Log.e("UnsupportedEncoding", e.toString()); } Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show(); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); readFromIntent(intent); if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){ myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); } }}
this is my second week Ive been programming with Java. Sorry in advance for dumb mistakes