Ich versuche, Smartcards über NFC auf Android zu lesen. Ich hatte eine Lösung in Eclipse arbeiten, aber danach nur auf Android Studio Migration funktioniert einmal, liest alle Daten von der Karte, aber dann friert und wiederholt diesen Fehler immer und immer wieder:Android NFC - Versuch, virtuelle Methode aufzurufen boolean android.nfc.Tag.hasTech (int) 'auf einem Null-Objekt-Referenz
Versuch virtuelle Methode aufzurufen ' boolean android.nfc.Tag.hasTech (int) 'für einen Nullobjektverweis
W/System.err: java.lang.NullPointerException: Versuch, virtuelle Methode aufzurufen' boolean android.nfc.Tag.hasTech (int) 'auf einer null-Objektreferenz
W/System.err: bei android.nfc.tech.IsoDep.get (IsoDep.java:61)
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="packageName"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.NFC" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true" >
<activity
android:name=".NFCReader"
android:label="@string/app_name"
android:launchmode="singleTask" >
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
<meta-data
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>
</application>
</manifest>
NFCReader:
public class NFCReader extends Activity {
private NfcAdapter mNfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
finish();
return;
}
if (!mNfcAdapter.isEnabled()) {
Log.e(TAG, "NFC is disabled.");
} else {
}
final Tag tagFromIntent = this.getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
new ReadCardTask().execute(tagFromIntent);
handleIntent(getIntent());
this.finish();
}
private void handleIntent(Intent intent) {
String action = intent.getAction();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
String type = intent.getType();
if (MIME_TEXT_PLAIN.equals(type)) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
new NdefReaderTask().execute(tag);
} else {
Log.d(TAG, "Wrong mime type: " + type);
}
} else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String[] techList = tag.getTechList();
String searchedTech = Ndef.class.getName();
for (String tech : techList) {
if (searchedTech.equals(tech)) {
new NdefReaderTask().execute(tag);
break;
}
}
}
}
protected Void doInBackground(Tag... params) {
IsoDep tag = IsoDep.get(params[0]);
tag.connect();
// [...] transmit APDUs
}
}