Отправка текстовых данных из Android в IOS с помощью NFC

Я знаю, что в настоящее время в IOS 11 нет API для записи данных в теги NFC, но можно читать данные из тегов NFC и хотеть передавать текст с устройства Android на iPhone. Я предполагал, что можно написать NdefMessage, и он будет получен на IOS, но у меня это просто не работает. Когда я запускаю сканирование NFC в IOS (с помощью приложения NfcActions), не получено намерений.

Исходный код моей основной деятельности:

class MainActivity : AppCompatActivity() {

var nfc: NfcAdapter? = null

@SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(toolbar)


    hintLabel.text = "Initializing..."
    nfc = NfcAdapter.getDefaultAdapter(this)

    if (nfc == null) hintLabel.text = "NFC is not available on this device"
    else hintLabel.text = "NFC initialized"
}

override fun onResume() {
    super.onResume()

    nfc?.enableNFCInForeground(this, javaClass)
}

override fun onPause() {
    super.onPause()
    nfc?.disableForegroundDispatch(this)
}

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    val pathPrefix = "/testuser:nfctest"
    val isSuccess = createNFCMessage(pathPrefix, "Hello World", intent)
    if(isSuccess)
        hintLabel.text = "Successfully wrote data"
    else
        hintLabel.text = "Couldnt write any data"

}

fun createNFCMessage(pathPrefix: String, payload: String, intent: Intent?) : Boolean {

    val nfcRecord = NdefRecord(NdefRecord.TNF_EXTERNAL_TYPE, pathPrefix.toByteArray(), ByteArray(0), payload.toByteArray())
    val nfcMessage = NdefMessage(arrayOf(nfcRecord))
    intent?.let {
        val tag = it.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)
        return writeMessageToTag(nfcMessage, tag)
    }
    return false
}


fun <T>NfcAdapter.enableNFCInForeground(activity: Activity, classType: Class<T>) {

    val pendingIntent = PendingIntent.getActivity(activity, 0,
            Intent(activity,classType).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0)

    val filters = arrayOf(IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED))
    val techList = arrayOf(arrayOf(Ndef::class.java.name), arrayOf(NdefFormatable::class.java.name))

    this.enableForegroundDispatch(activity, pendingIntent, filters, techList)
}

private fun writeMessageToTag(nfcMessage: NdefMessage, tag: Tag?): Boolean {

    // This functions writes given NdefMessage to the tag, if it's possible
    // and returns whether it was successful or not
}

И я также добавил следующие разрешения и фильтр намерений в основной манифест

<uses-permission android:name="android.permission.NFC" />
<uses-feature
    android:name="android.hardware.nfc"
    android:required="false" />
<application ...>
    <activity ...>     
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:host="ext"
                android:pathPrefix="/testuser:nfctest"
                android:scheme="vnd.android.nfc"
                android:mimeType="text/plain"/>
        </intent-filter>
    </activity>
</application>

Что я делаю не так и как правильно передавать данные с устройства Android на iPhone с помощью NFC?

1 ответ

По-видимому, обычный одноранговый способ отправки сообщений NDEF с одного телефона на другой работает только между двумя устройствами Android. Для отправки сообщения с Android на iOS необходимо использовать эмуляцию хост-карты. По сути, телефон Android должен эмулировать тип тега 4 (на основе спецификации NDEF Forum), чтобы iPhone мог читать содержимое. Надеюсь, что вы попадете на правильный путь...

Для тех, кто застрял в этой проблеме, я прочитал NFCForum-TS-Type-4-Tag, предложенный @Michael Roland. Вся идея верна. Все, что вам нужно, это смоделировать команды процесса SEND и RECEIVED для преобразования байтового массива в сообщение NDEF. Я создал два репозитория, один завершает весь пакет о преобразовании строки в сообщение NDEF, а другой - тег NDEF iOS Reader для проверки правильности Android HCE или нет.

Удачи!

Также см. Ответ Майкла Роланда на сообщение NDEF с помощью HCE Android.

Другие вопросы по тегам