8

NFC を使用して、Android アプリから WP8 電話に URL を送信しようとしています。

Android デバイスに送信すると、URL が正しく送信されます。ただし、WP8 に送信すると、IE は、送信したいリンクではなく、Play ストアへのリンクを読み込みます (例: " http://www.stackoverflow.com ")。

Play ストアのリンクは「https://play.google.com/store/apps/details?id=com.example.conductrnfc&feature=beam」です。「com.example.conductrnfc」はプロジェクト内のパッケージ名です。

NFC メッセージを生成するために使用したコードを以下に示します。ここで、WP8 との互換性を損なう何か間違ったことをしていますか?

NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this);
nfc.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
    @Override
    public NdefMessage createNdefMessage(NfcEvent event)
    {
        NdefRecord uriRecord = NdefRecord.createUri(urlString);
        return new NdefMessage(new NdefRecord[] { uriRecord });
    }
}, 
this);
4

2 に答える 2

3

これを試すことができますか:

NfcAdapter nfc = NfcAdapter.getDefaultAdapter(this);
nfc.setNdefPushMessageCallback(new NfcAdapter.CreateNdefMessageCallback() {
    @Override
    public NdefMessage createNdefMessage(NfcEvent event)
    {
        byte[] payload = urlString.getBytes();
        NdefRecord uriRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload); 
        return new NdefMessage(new NdefRecord[] { uriRecord });
    }
}, 
this);
于 2014-01-08T16:20:29.583 に答える
0

OPからのデバッグ結果をまだ見逃していますが、試してみると思いました:

コマンドの説明でcreateNdefMessage、WP8 電話とやり取りするときにコールバックが呼び出されないことが明らかになったので、これが追加される理由とこれを防ぐ方法は興味深いでしょう。残念ながら、アクティビティの実際のライフサイクルについては詳しくわかっていないため、何がうまくいかないのかを推測することしかできません。

  1. 登録されたコールバックが呼び出されない理由の 1 つcreateNdefMessageは、コールバックを登録したアクティビティがフォアグラウンドになくなったことです。そのため、Android デバイスと WP8 デバイスの間には、現在のアクティビティが一時停止される原因となる違いがある場合があります。

  2. createNdefMessageもう 1 つの理由は、Android NFC スタックがコールバック メソッドを呼び出す前に、WP8 デバイスが通信を中断したことです。ただし、ビーム UI は通常、ユーザーがクリックする前に消えるため、これは検出可能である必要があります。

理由 1 の原因の 1 つは、WP8 デバイス自体が Android デバイスでインテント処理を引き起こす NDEF メッセージを送信することです。その場合、この問題を解決する方法として、フォアグラウンド ディスパッチ システムに登録することが考えられます。これにより、通常のインテント処理が妨げられ、すべての着信 NDEF メッセージが現在のアクティビティに直接送信されます。

@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);
}

@Override
public void onNewIntent(Intent intent) {
    if (intent != null) {
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action) ||
            NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action) ||
            NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)) {
            Log.d("NdefTest", "This problem was actually caused by an incoming NDEF message.");
        }
    }
}
于 2014-01-14T22:25:26.000 に答える