1

NFC を使用して他のデバイスと対話する Android アプリを開発しています。このやり取りは、基本的に次の 2 つのステップで構成されます。

  1. デバイスが他のデバイスから NFC によって特定の URI を受信すると、アプリが起動されます。
  2. アプリが起動すると、NDEF メッセージが他のデバイスに送信されます。

最初のステップとして、次の行をAndroidManifest.xmlファイルに追加しました。そうMainActivityすれば、デバイスが type の URI を受信したときに が起動されますmyprotocol:something

<intent-filter>
     <action android:name="android.nfc.action.NDEF_DISCOVERED" />
     <category android:name="android.intent.category.DEFAULT" />
     <data android:scheme="myprotocol" />
 </intent-filter>

2 番目のステップでは、MainActivityクラスで and を実装CreateNdefMessageCallbackOnNdefPushCompleteCallbackます。コードは次のようになります。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
    adapter.setNdefPushMessageCallback(this, this);
    adapter.setOnNdefPushCompleteCallback(this, this);
}

@Override
public NdefMessage createNdefMessage(NfcEvent event) {
    NdefRecord uriRecord = NdefRecord.createUri("protocol:something");
    NdefMessage message = new NdefMessage(new NdefRecord[] { uriRecord });
    return message;
}

@Override
public void onNdefPushComplete(NfcEvent event) {

}

だから、今問題

これら 2 つの部分は独立して正常に動作しますが、両方をアプリに追加するとうまくいきません。

つまり、最初の部分を追加すると、NDEF メッセージを受信したときにアプリが正しく起動されます。また、2 番目の部分のみを追加すると、アプリの実行中に自分のデバイスを他のデバイスにタップすると、Touch to beamインターフェイスが表示され、NDEF メッセージが送信されます。

問題は、両方を追加すると、他のデバイスをタップするとアプリが起動しますが、Touch to beamインターフェイスが表示されないことです。デバイスを切り離してもう一度タップすると、MainActivityが再起動されますが、メッセージを送信するオプションが表示されません。

どうすれば目的のシナリオを達成できますか?

4

1 に答える 1

1

2 台の Android デバイスで Beam を使用してワンタップ アプローチを行うことはできません (他のデバイスでは、特に 1 つが Android で、もう 1 つが専用の NFC リーダーまたは低レベルまたはデバイスで NFC 機能を制御できるデバイスである場合に注意してください)。 NFC タグをエミュレートする)。

ただし、既存のシナリオを少し変更するだけで、2 つの Android デバイス間で 2 タップ アプローチが可能です。着信 NDEF メッセージをインターセプトするフォアグラウンド ディスパッチを追加するだけで、Android がアクティビティを再起動するのを防ぐことができます。

@Override
public void onResume() {
    super.onResume();
    NfcAdapter adapter = NfcAdapter.getDefaultAdapter(this);
    PendingIntent pi = PendingIntent.getActivity(
            this,
            0,
            new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
            0);
    adapter.enableForegroundDispatch(this, pi, null, null);
}

編集

2 タップ シナリオのより一般的なアプローチは、最初のタップでデバイス A からデバイス B に NDEF メッセージを送信することです。この NDEF メッセージは、デバイス B でアプリを起動します。NDEF メッセージを送信した直後に、デバイス A はメッセージの送信を停止します。デバイス B のアプリがアクティブな場合、Beam 用に独自の NDEF メッセージを登録します。次に、2 回目のタップで、ビーム UI がデバイス B に表示され、ビーム画面をクリックすると、応答 NDEF メッセージがデバイス A に送信されます。

デバイス A は、最初の NDEF メッセージの送信を停止する必要があることに注意してください。それ以外の場合、デバイス B のアプリは新しい NDEF メッセージを受信し、その結果、ビーム UI を開きません。

于 2013-10-09T14:52:33.603 に答える