2

がアクティブ化されている場合にのみ、アプリが nfc タグをリッスンするようにします。このために、次のようにnfcリスナーを登録しようとしましたが、成功しませんでした。

IntentFilter filter = new IntentFilter("android.nfc.action.TECH_DISCOVERED"); 
registerReceiver(nfcTagListener, filter); 

BroadcastReceiver nfcTagListener = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) { 
            String action = intent.getAction(); 

            if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) { 
                Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  
                Log.d("nfc", "" + tag.getId());     
            }
        }
    };

apidemos に続いてマニフェストでインテントを宣言することも試みましたが、完全に機能し、アクティビティを起動して nfc タグ ID を取得します。しかし、これは私が望むものではありません。そのアクティビティの中にいるときにのみタグ ID を検出したいのです。APIデモに含まれる次の行に関連している可能性があると考えています。しかし、プログラムでそれを行う方法がわかりません

      <meta-data android:name="android.nfc.action.TECH_DISCOVERED"
            android:resource="@xml/filter_nfc"> 

ヒントはありますか?

ありがとう!

4

2 に答える 2

6

フォアグラウンド ディスパッチ システムを使用してみてください。

有効にするには、アクティビティの onCreate メソッドで、いくつかのものを準備する必要があります。

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

その後、IntentFilters を作成します (私の例では、すべてのアクションは Intent Filters を使用して処理されます)。

    IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndef.addDataType("*/*");
    } catch (MalformedMimeTypeException e) {
        throw new RuntimeException("fail", e);
    }

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

    IntentFilter[] intentFiltersArray = new IntentFilter[] { tag, ndef, tech };

その後、サポートされているテクノロジーを含む String 配列が必要になります。

    String[][] techList = new String[][] { new String[] { NfcA.class.getName(),
            NfcB.class.getName(), NfcF.class.getName(),
            NfcV.class.getName(), IsoDep.class.getName(),
            MifareClassic.class.getName(),
            MifareUltralight.class.getName(), Ndef.class.getName() } };

onResume メソッドでは、フォアグラウンド ディスパッチ メソッドを有効にする必要があります。

NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techList);

onPause で無効にします。

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

このようにして、必要なメカニズムが正常に初期化されました。受信した Intent を処理するには、 onNewIntent(Intent intent) メソッドをオーバーライドする必要があります。

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

    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {
        // reag TagTechnology object...
    } else if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
        // read NDEF message...
    } else if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {

    }
}

注: フォアグラウンド ディスパッチのみでインテントを処理する場合は、マニフェスト ファイルでインテント ディスパッチ システムを有効にせず、そこでアプリケーションに適切な権限を付与してください。

それが役立つことを願っています。

于 2011-04-19T08:14:56.680 に答える
0

フォアグラウンド モードを使用したくない場合は、いつでもプログラムでインテント フィルターを有効または無効にすることができます。

NDEF Tools for Androidプロジェクトには、フォアグラウンド モードを使用した作業サンプルがあり、検出も行います

  1. NFC デバイスのサポート
  2. アクティビティの起動時に NFC を有効または無効にするか、後で変更する
  3. アクティビティの起動時に NFC プッシュの有効化/無効化、または後で変更
于 2012-11-26T21:52:25.933 に答える