2017-10-09 127 views
1

我创建了一个NFC读取URI时读我的应用程序代码,其中/写部分:丢失数据从NFC标签

READ负责处理数据和触发网络浏览器:

ndef.connect() 
val ndefMessage = ndef.ndefMessage 
if (ndefMessage.records != null && ndefMessage.records.isNotEmpty()) { 
    message = String(it.records[0].payload) 
} 
ndef.close() 

WRITE写入一个URL到NFC标签:

ndef.connect() 
val mimeRecord = NdefRecord.createUri(url) 
ndef.writeNdefMessage(NdefMessage(mimeRecord)) 
ndef.close() 

对于某些神秘的原因,当我写的URL“http://www.google.com”,我对我message变量(读取标签与后网址)只包含“google.com”。我不知道为什么网址的其余部分(“http://www。”)被删除/忽略。你能告诉我发生了什么事吗?我的错误在哪里?

+0

为了澄清,你正在写的变量'url'的标签,其中有价值'http:// www.google.com',当你阅读它时,返回只是'google.com'?你有没有尝试过其他的网址?查看URL的创建位置可能会有所帮助。 – WoogieNoogie

+0

是的,现在它在你写作的时候非常有效。是的,我尝试了不同的URL - 没有区别tho:CI从'EditText'小部件读取URL并将其传递给我的'TagManager' – JakubW

+0

我不能把它作为答案,因为它更多的是理论,但NFC信息必须简洁明了。 Ndef库很有可能会故意缩短网址,如果它以'http:// www'开头,那么这是一种“默认”URI。 – WoogieNoogie

回答

1

您正试图将NDEF记录为简单的文本(UTF-8编码字符串)的有效载荷进行解码:

message = String(it.records[0].payload) 

但是,你写的URL作为NFC论坛URI记录:

NdefRecord.createUri(url) 

因此,您需要根据NFC论坛URI记录类型定义规范(来自NFC论坛的avaibale)解释URI记录。这样一个URI记录的有效载荷由一个缩写字节组成(你可以用它来查找明确定义的前缀表中的URI前缀)和URI后缀(UTF-8编码)。

你既可以解析记录的有效载荷是自己或让Android的魔你使用类似:

uriString = it.records[0].toUri()