使用NFC从Android向IOS发送文本数据

使用NFC从Android向IOS发送文本数据,android,ios,nfc,hce,nfc-p2p,Android,Ios,Nfc,Hce,Nfc P2p,我知道目前IOS 11中没有API将数据写入NFC标签,但可以从NFC标签读取数据,并希望将文本从Android设备传递到iPhone。 我假设写NdefMessage是可能的,它会在IOS上被接收,但它对我来说不起作用。当我在IOS上启动NFC扫描(使用NfcActions应用程序)时,没有收到任何意图 我的主要活动的源代码: class MainActivity : AppCompatActivity() { var nfc: NfcAdapter? = null @SuppressLi

我知道目前IOS 11中没有API将数据写入NFC标签,但可以从NFC标签读取数据,并希望将文本从Android设备传递到iPhone。 我假设写NdefMessage是可能的,它会在IOS上被接收,但它对我来说不起作用。当我在IOS上启动NFC扫描(使用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
}
class MainActivity:AppCompatActivity(){
变量nfc:NfcAdapter?=null
@SuppressLint(“SetTextI18n”)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
设置支持操作栏(工具栏)
hintLabel.text=“正在初始化…”
nfc=NfcAdapter.getDefaultAdapter(此)
如果(nfc==null)hintLabel.text=“nfc在此设备上不可用”
else hintLabel.text=“NFC已初始化”
}
重写onResume(){
super.onResume()
nfc?.enablenFCInformeGround(这个,javaClass)
}
覆盖暂停(){
super.onPause()
nfc?.disableForegroundDispatch(本)
}
覆盖Wintent(意图:意图?){
super.onNewIntent(意图)
val path prefix=“/testuser:nfctest”
val issucess=createNFCMessage(路径前缀,“Hello World”,intent)
如果(isSuccess)
hintLabel.text=“成功写入数据”
其他的
hintLabel.text=“无法写入任何数据”
}
趣味createNFCMessage(路径前缀:字符串,负载:字符串,意图:意图?):布尔值{
val nfcRecord=NdefRecord(NdefRecord.TNF_外部_类型,路径前缀.toByteArray(),ByteArray(0),有效负载.toByteArray())
val nfcMessage=NdefMessage(数组(nfcRecord))
意图?,让我来{
val tag=it.getParcelableExtra(NfcAdapter.EXTRA_标记)
返回writeMessageToTag(nfcMessage,tag)
}
返回错误
}
fun NfcAdapter.enablenfcinformaleground(活动:活动,类类型:类){
val pendingent=pendingent.getActivity(活动,0,
Intent(活动,类类型).addFlags(Intent.FLAG\u activity\u SINGLE\u TOP),0
val filters=arrayOf(IntentFilter(NfcAdapter.ACTION\u NDEF\u DISCOVERED))
val techList=arrayOf(arrayOf(Ndef::class.java.name),arrayOf(ndefformable::class.java.name))
此.enableForegroundDispatch(活动、挂起内容、筛选器、技术列表)
}
private fun writeMessageToTag(nfcMessage:NdefMessage,tag:tag?):布尔值{
//如果可能,此函数将给定的NdefMessage写入标记
//并返回是否成功
}
我还向主清单添加了以下权限和意图过滤器

<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>


我做错了什么?如何使用NFC将数据从Android设备正确地传递到iPhone?

显然,从一部手机向另一部手机发送NDEF消息的常用对等方式只能在两台Android设备之间工作。 要从Android向iOS发送消息,您需要使用主机卡模拟。 基本上,Android手机需要模拟Tag 4类型(基于NDEF论坛规范),以便iPhone读取内容。
希望这能让你走上正轨……

对于任何坚持这个问题的人,我已经阅读了@Michael Roland提出的建议。整个想法是正确的。你所需要的只是模拟将字节数组转换为消息的发送和接收命令的过程。我创建了两个存储库,其中一个是关于转换字符串的整个包另一个是a,用于验证Android HCE是否正确

祝你好运


另请参阅to。

我尝试在Android上模拟Type 4标记,但iOS无法读取它。虽然它可以读取标准的Type 2标记,但我不知道如何在Android上模拟它,甚至不知道是否可能。