1. ホーム
  2. android

[解決済み] AndroidでNFCタグを継続的に検出する

2022-03-08 14:02:41

質問

私が読んだり実験したりしたところ、Android端末では、タグの二重読み取りを防ぐために何らかの方法を用いていることがわかりました( ここで説明されているように ). これは省電力化には有効ですが、この技術の応用には限界があります。

例えば、私が直面している問題は、コンテンツが継続的に更新されるパッシブタグを持っていることです。一度タグを読み取ると、取り外すまで携帯電話はタグの検出を停止します。この間、タグをフィールドから取り外して再タップしないと、タグの更新内容を読み続けることはできません。 さらに、タグが最初に読み取られた後は、電力を節約するために磁場が極端に弱くなるか、またはパワーダウンされます。そのため、パッシブデバイスに継続的に電力を供給することはできません。

Android端末に強制的に電源を供給し、更新中のパッシブタグを読み取る方法はありますか?

注:ハードウェアの直接制御を実現するために、Android端末のroot化を伴うものであっても構いません。

解決するには?

ご質問の内容は、Android NFCデバイスの場合、単純に正しくありません。タグが検出されると(=すべての必須コマンドに応答し、アプリに送信される可能性のある有効なタグ)、NFCリーダは継続的にタグに給電し(HFキャリアはオンに保たれます)、いくつかのコマンドをタグと交換します。そのキープアライブフェーズ(存在チェック)中に交換されるコマンドは、タグのタイプ、 AndroidバージョンおよびAndroid NFC スタック実装に依存します。これは通常、以下のいずれかです。

  1. 非アクティブ化と再アクティブ化の繰り返し。
  2. 特定のメモリ領域を繰り返し読み出す、または
  3. その他のピンポン・コマンド・シーケンス

は、NFC スタックがタグがまだ応答しているかどうかを確認するためのものです。存在チェックが失敗した場合のみ、Android はNFC リーダーの高周波キャリアをオフにし、完全なポー リング・シーケンス(サポートされるあらゆる種類のタグ技術をテスト)または感知段階(タグの潜在的 な存在を示す離調を検出する短い高周波キャリアパルス)で再スタートさせます。

このように、タグが適切に動作し、ユーザーがタグをAndroid端末に長期間装着し続けることができれば、同じタグから(装着し続けたまま)新しいデータを複数回読み取ることを妨げるものはありません。ただ、タグのハンドル( Tag オブジェクト、あるいはそのタグハンドルからインスタンス化された特定のタグ技術オブジェクト)にアクセスし、アプリのタグ読み取りアクティビティが常にフォアグラウンドにある必要がある限りです。

例えば、継続的に更新されるNDEFメッセージをタグから読み取るには、このようにすることができます。 AsyncTask (また、スレッドを中断するメカニズムも実装した方がよいでしょう)。

new Thread(new Runnable() {
    public void run() {
        Ndef ndef = Ndef.get(tag);

        try {
            while (true) {
                try {
                    Thread.sleep(30000);

                    ndef.connect();
                    NdefMessage msg = ndef.getNdefMessage();

                    // TODO: do something

                } catch (IOException e) {
                    // if the tag is gone we might want to end the thread:
                    break;
                } finally {
                    try {
                        ndef.close();
                    } catch (Exception e) {}
                }
            }
        } catch (InterruptedException e) {
        }
    }
}).start();