2012-12-08 10 views
12

Próbuję uruchomić określone działanie, gdy mój telefon skanuje znacznik NFC. To właśnie mój manifest wygląda następująco:Uruchamianie określonej czynności podczas skanowania tagu 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> 

Ilekroć skanuj mój tag, moje główne uruchamia działalności, ale chciałbym mój BluePrintActivity uruchomić. Nie jestem pewien, dlaczego tak się dzieje. Oto mój kod do pisania do tagu:

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: Odpowiedź przyjąłem powyżej zasugerował mi w kierunku właściwym kierunku, ale ponieważ pisałem do znacznika, kod w przyjętym odpowiedź nie jest do końca prawidłowe rozwiązanie . Jeśli piszesz do znacznika, to co trzeba zrobić:

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 }); 

Jeśli chcesz przechowywać ładunek, wystarczy zastąpić ostatni parametr „nowy bajt [0]” do odpowiednich danych.

Odpowiedz

9

Powodem rozpoczęcia aplikacji jest wpisanie rekordu aplikacji Android do tagu. To powoduje, że aplikacja, która ma pasującą nazwę pakietu, uruchamia się zamiast filtrowanej aktywności.

Ponieważ jesteś filtrowanie typu MIME chcesz utworzyć rekord Mime z typu 'application/com.lgandroid.ddcnfc', więc zamiast

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

Należy użyć:

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

To jest dość dziwne, ponieważ zgodnie z dokumentacją tutaj (http://developer.android.com/guide/topics/connectivity/nfc/nfc.html), mówi, że Android spróbuje uruchomić działanie, które ma pasujący filtr intencji. Domyślam się, że dokumentacja Androida może być wyłączona. Dam to spróbować, kiedy wrócę do domu dziś wieczorem. – l46kok

+1

Masz rację, jeśli chodzi o filtr intencji, ale tag, który obecnie tworzysz, jest rekordem aplikacji Android zamiast rekordem Mime, w którym aktualnie filtrujesz. Zasadniczo nie masz filtra intencji dla tagu, który właśnie piszesz. Ponieważ jednak jest to rekord aplikacji Android, aplikacja jest nadal uruchomiona. –

0

Dopóki w tagu znajduje się tylko AAR, aplikacja zostanie uruchomiona z domyślną aktywnością (lub bieżącym stosem działań, czymkolwiek on jest). Dlatego też roczne sprawozdanie z działalności powinno być ostatnim rekordem przechowywanym w tagu, używanym wyłącznie do identyfikacji aplikacji.

Jeśli masz dodatkowy rekord NDEF, który jest powiązany z jednym z twoich działań, istnieje szansa, że ​​odpowiednie działanie zostanie otwarte, aby obsłużyć tag. Jednak my experiments i another question here wskazują, że ten mechanizm nie działa tak jak w reklamie.

Alternatywnym rozwiązaniem może być przechowywanie adresu URL jako jednej z wiadomości na etykiecie, otwarcie strony internetowej na serwerze, który kontrolujesz (lub przejście bezpośrednio do Google Play).

+0

Sądzę więc, że funkcjonalność może nie działać tak, jak jest to opisane w dokumentacji. To jest bummer :( – l46kok

Powiązane problemy