Отправка URL-адреса с Android на Windows Phone через NFC дает ссылку на Play Store

Я пытаюсь использовать NFC для отправки URL-адреса из приложения Android на телефон WP8.

При передаче на устройство 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);

person J Yang    schedule 04.01.2014    source источник
comment
Вы также прикрепляете AAR к сообщению? Судя по вашему коду, это не так, но я знаю, что это приводит приложения в Play Store из сообщения NFC.   -  person CommonsWare    schedule 05.01.2014
comment
Я не прикреплял AAR, URL-адрес — единственная запись в сообщении.   -  person J Yang    schedule 05.01.2014
comment
Можете ли вы показать ссылку, которую вы отправляете на WP8, и что именно появляется в WP8?   -  person 72DFBF5B A0DF5BE9    schedule 08.01.2014
comment
@M.C. - Фактический код NdefRecord uriRecord = NdefRecord.createUri(webView.getUrl()); с веб-представлением, указывающим на веб-сайт (а не в магазин игр) в onCreate активности. То, что видит WP8, это URL-адрес, упомянутый в вопросе.   -  person Robert Levy    schedule 08.01.2014
comment
@RobertLevy, так что любой URL-адрес, который вы отправляете в WP8, отправляет URL-адрес вашего приложения в магазине приложений?   -  person 72DFBF5B A0DF5BE9    schedule 08.01.2014
comment
Да, так оно и выглядит... за исключением того, что этого приложения на самом деле нет в магазине   -  person Robert Levy    schedule 08.01.2014
comment
Android Beam, отправляющий URL-адрес Play Store, является поведением по умолчанию, если приложение само не настраивает сообщение NDEF для Beam. Можете ли вы подтвердить, что обратный вызов createNdefMessage действительно вызывается (например, путем добавления ведения журнала)?   -  person Michael Roland    schedule 09.01.2014
comment
Он вызывается в отладчике, когда я пытаюсь отправить сообщение.   -  person J Yang    schedule 09.01.2014
comment
Можете ли вы попробовать, если вы получите тот же результат, если вы используете setNdefPushMessage для установки статического сообщения NDEF вместо создания его динамически с помощью обратного вызова? (Обратите внимание, что в этом случае вы не должны регистрировать обратный вызов с setNdefPushMessageCallback!)   -  person Michael Roland    schedule 09.01.2014
comment
Кстати. какую версию Android вы используете?   -  person Michael Roland    schedule 09.01.2014
comment
Вы же не регистрировались на setBeamPushUris или setBeamPushUrisCallback, верно?   -  person Michael Roland    schedule 09.01.2014
comment
@MichaelRoland, это 4.4.2, и OP не вызывает эти функции. должен ли он?   -  person Robert Levy    schedule 10.01.2014
comment
еще одна подсказка: я заметил, что не только наше приложение отправляет ссылки в Play Store ... кажется, что Android делает это по умолчанию для всех приложений, за исключением некоторых, которые отправляют пользовательские вещи (Chrome без проблем отправляет любой URL-адрес). сейчас показывает). Код, размещенный в вопросе, недостаточен?   -  person Robert Levy    schedule 10.01.2014
comment
Исправление @MichaelRoland: createNdefMessage вызывается при передаче на Android, но не вызывается при передаче на WP8. В чем может быть причина?   -  person J Yang    schedule 10.01.2014
comment
еще одна странность: setNdefPushMessageCallback работает android-to-android, но не WP8. Если мы делаем setNdefPushMessage, это работает для обоих (но мы вроде как хотим использовать подход обратного вызова для динамической генерации URL-адреса)   -  person Robert Levy    schedule 10.01.2014
comment
@RobertLevy Нет, функции setBeamPushUri* вызывать не нужно.   -  person Michael Roland    schedule 10.01.2014
comment
@RobertLevy отправляет ссылки на Play Store: это то, что я писал о поведении Android Beam по умолчанию выше.   -  person Michael Roland    schedule 10.01.2014
comment
Итак, это приближает нас к выявлению проблемы. Не могли бы вы добавить сообщения журнала в методы жизненного цикла действия (onCreate, onStart, onResume, onPause, onStop, onDestroy) и показать нам результат как для луча android-to-android, так и для луча android-to-wp8? Я бы предположил, что есть разница...   -  person Michael Roland    schedule 10.01.2014
comment
В дополнение к вышесказанному, если вы используете устройство Nexus, можете ли вы проверить, получаете ли вы какие-либо сообщения журнала с тегом журнала NfcP2pLinkManager (опять же для Android-to-android и android-to-wp8)?   -  person Michael Roland    schedule 10.01.2014


Ответы (2)


Можете ли вы попробовать это:

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);
person 72DFBF5B A0DF5BE9    schedule 08.01.2014
comment
Обязательно замените NdefRecord.TNF_ABSOLUTE_URI на NdefRecord.TNF_WELL_KNOWN. - person Michael Roland; 08.01.2014
comment
@MichaelRoland, точно! Спасибо, я добавил RTD_URI во второй параметр только для TNF_WELL_KNOWN, но пропустил. Хороший улов! - person 72DFBF5B A0DF5BE9; 08.01.2014
comment
Только что попробовал это, к сожалению, похоже, все еще вызывает ту же проблему. WP8 открывает ссылку на Play Маркет вместо ссылки в строке. - person J Yang; 08.01.2014

Несмотря на то, что я все еще скучаю по некоторым результатам отладки из OP, я решил попробовать:

Поскольку обсуждение в командах показало, что обратный вызов 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.");
        }
    }
}
person Michael Roland    schedule 14.01.2014
comment
Эй, извините, у нас не было возможности покопаться и получить другие детали, чтобы действительно решить эту проблему. Я ценю ваше терпение и усилия по устранению неполадок, так что награда за вас. - person Robert Levy; 15.01.2014
comment
Ага, мы тоже :) Обязательно вернемся к этому, когда будет время, и опубликую результаты здесь. - person Robert Levy; 15.01.2014