2012-06-17 25 views
8

NFC etiketleriyle etkileşimde bulunmak için basit bir uygulama yazmaya çalışıyorum ancak telefonumun hiçbir şey yapmasını istemiyorum ancak varsayılan NFC etiket uygulamasını tetikleyemiyorum. Gerçekten sadece taradığım herhangi bir etiketi yakalayabilmek, üzerinde bazı verileri olup olmadığını belirlemek ve buna göre harekete geçmek istiyorum.Android NFC Intents, aktivitemde başlamıyor

Şu anda benim bildirim dosyası bir NFC etiketi tarayarak Ancak

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

gibi, ben etkinlik başlangıç ​​görmek asla görünüyor. Burada bir şey mi eksik? Niyet süzgecini bir BroadcastReceiver içine yerleştirmeyi denedim ve hiç şansım yoktu ...

cevap

21

Uygulamanızı taradığınız tüm NFC etiketleriyle başlatamazsınız. Android, en uygun uygulamanın amaç filtresinin ne olduğuna bağlı olduğunu belirler. Ancak, uygulamanız ön planda çalışıyorsa, tüm NFC amaçlarını yakalamak için NFC foreground dispatch'u kullanabilirsiniz.

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

onResume() eklenti olarak:

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

onPause() eklenti olarak:

mAdapter.disableForegroundDispatch(this); 

onNewIntent yılında böyle NFC etiketi yükleyebilirsiniz: onCreate() eklenti olarak

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

Neden yeryüzünde tüm NFC olayları tek bir yerde alamazsınız ... – FlyingStreudel

+1

NFC fikri Telefonunuzda uygun işlemi otomatik olarak gerçekleştirme gibi şeyler yapabilir. Bazı örnekler: tarayıcınızda bir URL açın, Foursquare'e giriş yapın, otomatik olarak bir Wifi ağıyla bağlantı kurun. Android, NFC amacını, uygulamaların niyet filtrelerini temel alarak iletecek uygulamayı belirler. En belirgin filtre "kazanır". Birden fazla eşleşme bulunursa, kullanıcıya bir uygulama seçici sunulur. Bir istisna vardır: Ön planda çalışan uygulamanın belirli bir türdeki tüm NFC amaçlarını almasını isteyebilecek NFC ön plan gönderimi. –

+0

Niçin niyetin alınabildiği ve herhangi bir sayıda alıcı tarafından yeniden yayınlanabildiği SMS'den farklı olarak bunun neden seçili işlevsellik olduğunu anlamıyorum. NFC teknolojisiyle bir etkileşimde sadece bir eylem yapmakla sınırlı olmanız saçma görünüyor. – FlyingStreudel

6

SDK belgeleri bunu temel bir örnek olarak gösteriyor.

<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

Yukarıdaki örnekteki "category" öğesini not edin. Gerçekten gerekli ("VARSAYIM" ismi aksini gösteriyor olsa da). –

+0

Farklı NFC etiketlerine dayalı olarak farklı aktivitleri kimlerin başlatabileceğimi gösterebilir misiniz? tag1/prod/234 veya tag3/buyme/3422. Prod varsa, ben bir ProductionInfo aktivitesi ateş etmek istiyorum, ama buyme ile bir liste koymak istiyorum, – Karoly

0

Android otomatik olarak taranır NFC etiketini işlemek için en alakalı uygulama choses. intent-filter'unuzda daha spesifik olmanız gerekir, yani sadece TEXT Etiketleri, URL Etiketleri veya CONTACT Etiketlerini dinleyin. Bu, örnegin, TEXT-Tag'lar için örnegin <data android:mimeType="text/plain" /> kullanilarak filtreyi belirterek yapilabilir. Aksi takdirde, varsayılan NFC-Tag uygulaması tetiklenir.

1

Etiketlerin NDEF biçiminde tanımlanmasını bekliyorsunuz. Bu yüzden programınız okunan etiketler NDEF formatındaysa başlatılacaktır.

TAG_DISCOVERED veya TECH_DISCOVERED gibi daha genel amaçlı filtre kullanabilirsiniz.