2012-06-17 15 views
8

Próbuję napisać prostą aplikację do interakcji z tagami NFC, ale nie mogę zmusić telefonu do zrobienia czegokolwiek, ale wywołać domyślną aplikację tag NFC. Naprawdę chcę tylko móc przechwycić każdy skanowany znacznik, określić, czy ma on jakieś dane i podjąć odpowiednie działania.Android NFC Intencje nie zaczynają mojej działalności

Teraz mój plik manifestu wygląda

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

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name=".NfcActivity" 
     android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
     </intent-filter> 
    </activity> 
</application> 

Jednak podczas skanowania tag NFC, nie widzę rozpocząć działalność. Czy coś mi umyka? Próbowałem umieścić filtr intent wewnątrz BroadcastReceiver i nie miałem szczęścia ...

Odpowiedz

21

Nie możesz uruchomić aplikacji przez wszystkie skanowane znaczniki NFC. Android określi, która z najbardziej odpowiednich aplikacji jest oparta na szczegółowości filtra intencji. Jeśli jednak aplikacja działa na pierwszym planie, możesz użyć NFC foreground dispatch, aby przechwycić wszystkie intencje NFC.

W onCreate() dodają:

mAdapter = NfcAdapter.getDefaultAdapter(this); 
PendingIntent pendingIntent = PendingIntent.getActivity(
    this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0); 

W onResume() dodają:

mAdapter.enableForegroundDispatch(this, pendingIntent, null, null); 

W onPause() dodają:

mAdapter.disableForegroundDispatch(this); 

W onNewIntent można uzyskać w tagu NFC tak:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
+0

Dlaczego na Ziemi nie można odbierać wszystkich zdarzeń NFC w jednym miejscu ... – FlyingStreudel

+1

Ideą NFC jest to, że może wykonywać takie czynności, jak automatyczne wykonywanie odpowiednich działań w telefonie. Oto kilka przykładów: otwórz adres URL w przeglądarce, zamelduj się w Foursquare, automatycznie połącz się z siecią Wi-Fi. Android określa, która aplikacja ma przesyłać zamiar NFC na podstawie filtrów intencji aplikacji. Najbardziej szczegółowy filtr "wygrywa". Jeśli zostanie znalezione więcej niż jedno dopasowanie, użytkownikowi zostanie przedstawiony selektor aplikacji. Istnieje jeden wyjątek: wysłanie nowej wiedzy NFC, gdzie aplikacja działająca na pierwszym planie może zażądać wszystkich zamiarów NFC określonego typu. –

+0

Domyślam się, że po prostu nie rozumiem, dlaczego to była wybrana funkcja, w przeciwieństwie do SMS, gdzie intencję można odebrać i ponownie rozesłać za pomocą dowolnej liczby odbiorników. Wydaje się głupie, że jesteś ograniczony do podjęcia tylko jednej akcji interakcji z technologią NFC. – FlyingStreudel

6

Dokumenty SDK pokazują to jako podstawowy przykład.

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="text/plain" /> 
</intent-filter> 
+0

Zwróć uwagę na element 'category' w powyższym przykładzie. Jest to naprawdę konieczne (chociaż nazwa "DEFAULT" sugeruje inaczej). –

+0

czy możesz pokazać mi, od kogo mogę uruchomić różne aktywności na podstawie różnych tagów NFC? tag1/prod/234 lub tag3/buyme/3422. Jeśli jest prod, chcę wystrzelić działanie ProductionInfo, ale z buasem chciałbym umieścić na liście, – Karoly

0

Android automatycznie wybiera ten najbardziej odpowiedni wniosek do obsługi zeskanowanego tag NFC. Musisz być bardziej konkretny w swoim numerze intent-filter, tzn. Przesłuchać tylko dla tagów TEXT, tagów URL lub CONTACT-Tags. Można to zrobić, określając dodatkowo filtr, używając, na przykład, <data android:mimeType="text/plain" /> dla TEKST-znaczników. W przeciwnym razie zostanie uruchomiona domyślna aplikacja Tag NFC.

1

Oczekuje się, że znaczniki zostaną zdefiniowane w formacie NDEF. Twój program zostanie uruchomiony tylko wtedy, gdy odczytywane znaczniki będą miały format NDEF.

Możesz użyć bardziej ogólnych filtrów zamiany, takich jak TAG_DISCOVERED lub TECH_DISCOVERED.

Powiązane problemy