2014-01-04 2 views
7

Я пытаюсь использовать NFC для отправки URL-адреса из приложения Android на телефон WP8.Отправка URL-адреса с Android на Windows Phone через NFC дает ссылку Play Store

При отображении на Android-устройство URL-адрес отправляется правильно. Однако при сиянии WP8 IE загружает ссылку на Play Store вместо той, которую я хочу отправить (например, «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); 
+0

Вы еще и прикрепляете AAR к сообщению? Казалось бы, это не так, учитывая ваш код, но это одно, что я знаю о том, что приводит приложения в Play Store из сообщения NFC. – CommonsWare

+0

Я не привязывал AAR, URL-адрес является единственной записью в сообщении. –

+1

можете ли вы показать ссылку, которую вы отправляете на WP8, и что именно появляется в WP8? –

ответ

4

Вы можете попробовать это:

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); 
+0

Обязательно замените 'NdefRecord.TNF_ABSOLUTE_URI' на' NdefRecord.TNF_WELL_KNOWN'. –

+0

@MichaelRoland, точно! Спасибо, я добавил RTD_URI ко второму параметру только для TNF_WELL_KNOWN, но я пропустил его. Хороший улов! –

+0

Просто попробовал это, к сожалению, похоже, все еще дает нам ту же проблему. WP8 открывает ссылку на Play Store вместо ссылки в строке. –

0

Eventhough Я до сих пор скучаю некоторые другие результаты отладки из ОП, я думал, что я дам ему выстрелили:

В ходе обсуждения в команды показали, что обратный вызов createNdefMessage не вызывается при взаимодействии с телефоном WP8, было бы интересно, почему это добавляет и как предотвратить это. К сожалению, у меня нет никаких подробностей о фактическом жизненном цикле активности, поэтому я могу только догадываться, что может пойти не так.

  1. Одна из причин, почему зарегистрированный createNdefMessage обратного вызова не может быть названа не в том, что деятельность, которая зарегистрирована обратного вызова больше не на переднем плане. Таким образом, может существовать разница между Android-устройством и устройством WP8, которое приводит к приостановке текущей активности.

  2. Другая причина заключается в том, что устройство WP8 прерывает связь до того, как стек Android NFC успел вызвать метод обратного вызова createNdefMessage. Однако это должно обнаруживаться, поскольку пользовательский интерфейс Beam обычно исчезает до того, как пользователь сможет его щелкнуть.

Одна из причин, по которым может быть причина 1, может заключаться в том, что сам устройство WP8 отправляет сообщение NDEF, которое вызывает обработку намерений на устройстве Android. Если это так, то метод преодоления этой проблемы может заключаться в регистрации для системы диспетчеризации переднего плана. Это предотвратило бы регулярную обработку намерений и напрямую отправило бы все входящие сообщения 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."); 
     } 
    } 
} 
+0

Эй, извините, у нас не было возможности вникать и получить другие детали, чтобы действительно решить эту проблему. Я ценю ваше терпение и усилия по устранению неполадок, так что щедрость ваша. –

+0

@RobertLevy Мне все равно хотелось бы знать, что на самом деле вызывает проблему ... –

+0

Yup, мы тоже :) Обязательно вернемся к этому, когда время позволит и опубликует результаты здесь –