2012-12-08 11 views
12

Sto tentando di avviare un'attività specifica quando il mio telefono esegue la scansione di un tag NFC. Questo è ciò che il mio manifesto appare come:Avvio di un'attività specifica durante la scansione del tag NFC

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.lgandroid.ddcnfc" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-permission android:name="android.permission.NFC"/> 

<uses-sdk 
    android:minSdkVersion="14" 
    android:targetSdkVersion="16" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.lgandroid.ddcnfc.BluePrintActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
      <data android:mimeType="application/com.lgandroid.ddcnfc"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.LoginActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.MainActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.PointDiagnosisActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.PointControlActivity" 
     android:label="@string/app_name" > 
    </activity> 
    <activity 
     android:name="com.lgandroid.ddcnfc.SystemDiagnosisActivity" 
     android:label="@string/app_name" > 
    </activity> 



    <activity android:name="com.lgandroid.ddcnfc.SettingsActivity" android:label="@string/app_name"></activity> 
</application> 

Ogni volta che avvio la scansione tag, i miei principali lanci di attività, ma mi piacerebbe il mio BluePrintActivity per lanciare. Non sono sicuro del perché questo sia il caso. Ecco il mio codice per la scrittura di tag:

private boolean writeTag(Tag tag) { 
     NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc"); 
     NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord }); 

     try { 
      // see if tag is already NDEF formatted 
      Ndef ndef = Ndef.get(tag); 
      if (ndef != null) { 
       ndef.connect(); 

       if (!ndef.isWritable()) { 
        nfcTextView.setText("Read-only tag."); 
        return false; 
       } 

       // work out how much space we need for the data 
       int size = message.toByteArray().length; 
       if (ndef.getMaxSize() < size) { 
        nfcTextView.setText("Tag doesn't have enough free space."); 
        return false; 
       } 

       ndef.writeNdefMessage(message); 
       nfcTextView.setText("Tag written successfully."); 
       return true; 
      } else { 
       // attempt to format tag 
       NdefFormatable format = NdefFormatable.get(tag); 
       if (format != null) { 
        try { 
         format.connect(); 
         format.format(message); 
         nfcTextView.setText("Tag written successfully!\nClose this app and scan tag."); 
         return true; 
        } catch (IOException e) { 
         nfcTextView.setText("Unable to format tag to NDEF."); 
         return false; 
        } 
       } else { 
        nfcTextView.setText("Tag doesn't appear to support NDEF format."); 
        return false; 
       } 
      } 
     } catch (Exception e) { 
      nfcTextView.setText("Failed to write tag"); 
     } 

     return false; 
    } 

Edit: La risposta ho accettato sopra di me ha fatto capire verso la giusta direzione, ma dal momento che stavo scrivendo a un tag, il codice nella risposta accettato non è esattamente la soluzione corretta . Se si sta scrivendo a un tag, questo è ciò che devi fare:

NdefRecord appRecord = new NdefRecord(
      NdefRecord.TNF_MIME_MEDIA , 
      "application/com.lgandroid.ddcnfc".getBytes(Charset.forName("US-ASCII")), 
      new byte[0], new byte[0]); 
    NdefMessage message = new NdefMessage(new NdefRecord[] { appRecord }); 

Se si desidera memorizzare un carico utile, basta sostituire l'ultimo parametro "new byte [0]" per un dato appropriati.

risposta

9

Il motivo per cui viene avviata l'app è perché si scrive un record di applicazione Android sul tag. Ciò causa l'avvio dell'applicazione che ha un nome di pacchetto corrispondente anziché l'attività filtrata.

perché si sta filtrando per un tipo MIME che si desidera creare un record Mime con tipo 'application/com.lgandroid.ddcnfc' così invece di

NdefRecord appRecord = NdefRecord.createApplicationRecord("com.lgandroid.ddcnfc"); 

Si dovrebbe usare:

NdefRecord appRecord = NdefRecord.createMimeRecord("application/com.lgandroid.ddcnfc", byteArray); 
+0

Questo è piuttosto strano, perché in base alla documentazione qui (http://developer.android.com/guide/topics/connectivity/nfc/nfc.html), si dice che Android tenterà di eseguire l'attività che ha l'intento-filtro corrispondente. Credo che la documentazione di Android potrebbe essere qui. Darò questa prova quando torno a casa stasera. – l46kok

+1

Sei fedele al filtro intent ma il tag che stai creando al momento è un record di applicazione Android anziché un Mime Record su cui stai attualmente filtrando. Fondamentalmente non hai un filtro intent per il tag che stai attualmente scrivendo. Ma poiché si tratta di un record di applicazioni Android, l'applicazione è ancora in esecuzione. –

0

Se sul tag è presente solo una AAR, l'applicazione verrà avviata con l'attività predefinita (o lo stack attività corrente, qualunque esso sia). Pertanto, l'AAR dovrebbe essere l'ultimo record memorizzato su un tag, utilizzato solo per identificare l'app.

Se si dispone di un record NDEF aggiuntivo corrisposto da una delle attività, è possibile che venga aperta la relativa attività per gestire il tag. Tuttavia, my experiments e another question here indicano che questo meccanismo non funziona come pubblicizzato.

Una soluzione alternativa potrebbe essere quella di memorizzare un URL come uno dei messaggi sul tag, aprendo una pagina Web su un server che controlli (o andando direttamente a Google Play).

+0

Quindi immagino che la funzionalità potrebbe non funzionare come pubblicizzato nella documentazione. È un peccato :( – l46kok

Problemi correlati