2017-08-16 2 views
1

Ich versuche es so zu machen, dass wenn ich meine App öffne und ein Tag scanne, es einen Toast mit der ID des Tags anzeigt. Das Problem ist, dass ich jedes Mal, wenn ich ein Tag scanne, eine Liste von Anwendungen aufrufe und ich kann meine unter ihnen auswählen.NFC-Vordergrundversand funktioniert nicht

Ich habe versucht, den Vordergrund Dispatch-Mechanismus zu implementieren, aber dann zeigt es überhaupt nichts (es stürzt weder, noch zeigt es den Toast).

Dies ist der Hauptcode:

public class loginPage extends AppCompatActivity { 
    NfcAdapter mAdapter; 
    PendingIntent pendingIntent; 
    private String serialId = ""; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login_page); 
     mAdapter = NfcAdapter.getDefaultAdapter(this); 
     pendingIntent = PendingIntent.getActivity(
       this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 
     if (mAdapter == null) { 
      Toast.makeText(this, 
        "NFC NOT supported on this devices!", 
        Toast.LENGTH_LONG).show(); 
      finish(); 
     } else if (!mAdapter.isEnabled()) { 
      Toast.makeText(this, 
        "NFC NOT Enabled!", 
        Toast.LENGTH_LONG).show(); 
      finish(); 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     mAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 
    } 
    @Override 
    public void onPause(){ 
     super.onPause(); 
     mAdapter.disableForegroundDispatch(this); 

    } 
    @Override 
    public void onNewIntent(Intent intent) { 
     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     String action = intent.getAction(); 
     if (action.equals(NfcAdapter.ACTION_TECH_DISCOVERED)) { 
      try { 
       byte[] tagId = tag.getId(); 
       serialId = toHexString(tagId); 
       Log.d("[ReadCardTools]", "Serial Number: " + serialId); 
       Toast.makeText(this, serialId, Toast.LENGTH_SHORT).show(); 
      } catch (NullPointerException ex) { 
       ex.printStackTrace(); 
       serialId = "ERROR"; 
      } 
     } 
    } 

    public static String toHexString(byte[] bytes) { 
     char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
     char[] hexChars = new char[bytes.length * 2]; 
     int v; 
     for (int j = 0; j < bytes.length; j++) { 
      v = bytes[j] & 0xFF; 
      hexChars[j * 2] = hexArray[v/16]; 
      hexChars[j * 2 + 1] = hexArray[v % 16]; 
     } 
     return new String(hexChars); 
    } 
} 

das Manifest der folgenden Zusätze enthält:

<uses-permission android:name="android.permission.NFC"/> 
<uses-feature android:name="android.hardware.nfc" 
    android:required="true"/> 

und

<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" /> 

Der Filter ist:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> 
<tech-list> 
    <tech>android.nfc.tech.IsoDep</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.NfcA</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.NfcB</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.NfcF</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.NfcV</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.Ndef</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.NdefFormatable</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.MifareClassic</tech> 
</tech-list> 
<tech-list> 
    <tech>android.nfc.tech.MifareUltralight</tech> 
</tech-list> 
</resources> 

logcat sagt nur "D/PersonaManager: isNFCAllowed" jedes Mal, wenn ich ein Tag scanne.

Antwort

1

Die Vordergrundversandsystem, wenn es als eine allumfassende (d.h. mit den letzten beiden Argumente der Methode enableForegroundDispatch() Satz null) aktiviert ist, wird TAG_DISCOVERED Absichten auf Ihre Aktivität senden. Da Sie nur auf TECH_DISCOVERED-Intents hören (und alle anderen ignorieren), werden Sie den Toast bei der Tag-Erkennung nicht anzeigen.

Sie werden daher auch bei Empfang einer TAG_DISCOVERED Absicht in onNewIntent handeln müssen:

@Override 
public void onNewIntent(Intent intent) { 
    String action = intent.getAction(); 
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) || 
     NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
     Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
     if (tag != null) { 
      serialId = toHexString(tag.getId()); 
      Log.d("[ReadCardTools]", "Serial Number: " + serialId); 
      Toast.makeText(this, serialId, Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

danke sehr! Dies funktionierte wie beabsichtigt. –