kotlin 编写 nfc 标签未能写入超过 4 页或任何数字

问题描述

我的代码中存在以下问题 我不能在我的 nfc 标签上写超过 4 页,而且唯一可以写的数据是只有字母且长度不超过 4 的字符串。该标签一个可写的大小为 888 字节。

类 HomeActivity : AppCompatActivity() {

lateinit var adapter: NfcAdapter
lateinit var mifareTester: MymifareUltralightTagTester
lateinit var mytag: Tag
lateinit var intentFiltersArray: Array<IntentFilter>
lateinit var pendingIntent: PendingIntent
val techListsArray = arrayOf(arrayOf<String>(NfcF::class.java.name))
lateinit var resultText: TextView

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)

    mifareTester = MymifareUltralightTagTester()
    adapter = NfcAdapter.getDefaultAdapter(this)
    resultText = findViewById<TextView>(R.id.textView)

    val intent = Intent(this,javaClass).apply {
        addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
    }
    pendingIntent = PendingIntent.getActivity(this,intent,0)

    val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_disCOVERED).apply {
        try {
            addDataType("*/*")
        } catch (e: IntentFilter.MalformedMimeTypeException) {
            throw RuntimeException("fail",e)
        }
    }

    intentFiltersArray = arrayOf(ndef)
}

public override fun onPause() {
    super.onPause()
    adapter.disableForegrounddispatch(this)
}

public override fun onResume() {
    super.onResume()
    adapter.enableForegrounddispatch(this,pendingIntent,intentFiltersArray,techListsArray)
}

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    val tagFromIntent: Tag? = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
    if (tagFromIntent != null) {
        mifareTester.writeTag(tagFromIntent,"RaumDaumHausLaus")
    }
    mifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
    resultText.text = mifareTester.readTag(tagFromIntent)
}

}

class MymifareUltralightTagTester {

fun writeTag(tag: Tag,tagText: String) {
    var splittedString = splitStringEvery(tagText,4)
    var pageOffset = 4
    mifareUltralight.get(tag)?.use { ultralight ->
        ultralight.connect()
        Charset.forName("US-ASCII").also { usAscii ->
            for(str in splittedString){
                ultralight.writePage(pageOffset++,str?.toByteArray(Charsets.US_ASCII))
            }
        }
    }
}

fun readTag(tag: Tag?): String? {
    return mifareUltralight.get(tag)?.use { mifare ->
        mifare.connect()
        val payload = mifare.readPages(4)
        String(payload,Charset.forName("US-ASCII"))
    }
}

fun splitStringEvery(s: String,interval: Int): Array<String?> {
    val arrayLength = ceil(s.length / interval.todouble()).toInt()
    val result = arrayOfNulls<String>(arrayLength)
    var j = 0
    val lastIndex = result.size - 1
    for (i in 0 until lastIndex) {
        result[i] = s.substring(j,j + interval)
        j += interval
    }
    result[lastIndex] = s.substring(j)
    return result
}

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)