2017-11-21 3 views
0

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 
} 

} 

Antwort

0

Aus irgendeinem Grund die doInBackground() Funktion zweimal aufgerufen wird, einmal mit dem Tag, wo die gelesenen Werke, aber dann wieder mit Null in dem Tag, das den Fehler verursacht. Eine Nullprüfung des Tag-Parameters hat es behoben:

protected Void doInBackground(Tag... params) { 
    if (params[0] == null) 
    { 
     return null; 
    } 

    IsoDep tag = IsoDep.get(params[0]); 
    tag.connect(); 
    // [...] transmit APDUs 
} 
Verwandte Themen