3

識別に NFC タグを使用するアプリを開発しています。ただし、私が見つけたすべての例は、特定のカードが読み取られたときにアプリを起動することに関するものです。別の方法についての例やドキュメントを探してみましたが、役に立ちませんでした。

私が欲しいのは:

  1. ユーザーが私のアプリを起動します
  2. ユーザーがNFCカードをスキャン
  3. アプリが次のステップを決定します

タグデータを取得できません。

onCreate

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

tech = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
try {
    tech.addDataType("*/*");
} catch (MalformedMimeTypeException e) {
   throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] { tech };

そしてでonResume

nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);

インテントはアプリがアクティブなときにのみ取得されIntentますが、受け取るのはPendingIntent自分で定義したものであり、必要なACTION_TECH_DISCOVEREDインテントではありません。

4

2 に答える 2

8

ここで答えの一部を見つけました:NFCブロードキャストレシーバーの問題

このソリューションでは、完全に機能する例が提供されていないため、少し余分に試してみました。将来の訪問者を支援するために、ソリューションを投稿します。this をサブクラス化する場合NfcActivityは、そのメソッドを実装するだけで済みます。ActivityNfcActivityNfcRead

public abstract class NfcActivity extends Activity  {
    // NFC handling stuff
    PendingIntent pendingIntent;
    NfcAdapter nfcAdapter;

    @Override
    public void onResume() {        
        super.onResume();

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

         nfcAdapter = NfcAdapter.getDefaultAdapter(this);
         nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
    }

    @Override
    protected void onPause() {
        super.onPause();
        nfcAdapter.disableForegroundDispatch(this);
    }

    // does nothing, has to be overridden in child classes
    public abstract void NfcRead(Intent intent);

    @Override
    public void onNewIntent(Intent intent) {
        String action = intent.getAction();

        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
            NfcRead(intent);            
        } 
    }
}
于 2013-05-06T15:06:47.217 に答える
2

ユーザーが最初にアプリを起動してから NFC カードをスキャンするようにしたい場合は、NFC フォアグラウンド ディスパッチを使用することをお勧めします。そうすれば、Activity はマニフェストにインテント フィルターを含める必要がありません (したがって、ユーザーが別の NFC カードをスキャンしたときに誤って呼び出されることはありません)。フォアグラウンド ディスパッチを有効にすると、アクティビティはすべての NFC インテントを (アプリ チューザーのポップアップなしで) 直接受信し、それをどうするか (たとえば、別のアクティビティに渡す) を決定できます。

于 2013-05-06T14:19:55.527 に答える