[解決済み] AndroidでNFCタグを継続的に検出する
質問
私が読んだり実験したりしたところ、Android端末では、タグの二重読み取りを防ぐために何らかの方法を用いていることがわかりました( ここで説明されているように ). これは省電力化には有効ですが、この技術の応用には限界があります。
例えば、私が直面している問題は、コンテンツが継続的に更新されるパッシブタグを持っていることです。一度タグを読み取ると、取り外すまで携帯電話はタグの検出を停止します。この間、タグをフィールドから取り外して再タップしないと、タグの更新内容を読み続けることはできません。 さらに、タグが最初に読み取られた後は、電力を節約するために磁場が極端に弱くなるか、またはパワーダウンされます。そのため、パッシブデバイスに継続的に電力を供給することはできません。
Android端末に強制的に電源を供給し、更新中のパッシブタグを読み取る方法はありますか?
注:ハードウェアの直接制御を実現するために、Android端末のroot化を伴うものであっても構いません。
解決するには?
ご質問の内容は、Android NFCデバイスの場合、単純に正しくありません。タグが検出されると(=すべての必須コマンドに応答し、アプリに送信される可能性のある有効なタグ)、NFCリーダは継続的にタグに給電し(HFキャリアはオンに保たれます)、いくつかのコマンドをタグと交換します。そのキープアライブフェーズ(存在チェック)中に交換されるコマンドは、タグのタイプ、 AndroidバージョンおよびAndroid NFC スタック実装に依存します。これは通常、以下のいずれかです。
- 非アクティブ化と再アクティブ化の繰り返し。
- 特定のメモリ領域を繰り返し読み出す、または
- その他のピンポン・コマンド・シーケンス
は、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();
関連
-
[解決済み】Android Studio AVD - Emulator: 終了コード 1 でプロセスが終了
-
[解決済み】Android Studioでマニフェストのマージに失敗し、複数のエラーが発生した。
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] AndroidのListViewで画像を遅延ロードする方法
-
[解決済み] EclipseのAndroidプラグインで "Debug certificate expired "エラーが発生する。
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ArrayAdapterはリソースIDがTextViewであることが必要」XMLの問題点
-
[解決済み】Android Studio AVD - Emulator: 終了コード 1 でプロセスが終了
-
[解決済み】Android Studioの初回起動。Android SDKアドオンリストにアクセスできない
-
[解決済み] [Solved] Error "File google-services.json is missing from module root folder. これがないとGoogle Services Pluginは機能しません" [重複]。
-
[解決済み] [Solved] Unsupported method: ベースコンフィグ.getApplicationIdSuffix()
-
[解決済み】Android Studioです。「プロジェクトが C ドライブに作成されている場合、「タスク ':app:mergeDebugResources' の実行に失敗しました。
-
[解決済み】findViewByIDがnullを返す。
-
[解決済み】'dependencies' を '(groovy.lang.Closure)' に適用できない。)
-
[解決済み】アクティビティにない場所でのgetLayoutInflater()の呼び出し
-
[解決済み] Mockito lenient() を使用する場合