在nfc中读写数据的Android应用程序

在nfc中读写数据的Android应用程序,android,android-studio,tags,nfc,iso-15693,Android,Android Studio,Tags,Nfc,Iso 15693,我是NFC新手,我正在开发一个android应用程序来读取和写入NFC中的数据,但我遇到了一些问题 这是我正在使用的代码(编写): @覆盖 受保护的void onNewIntent(意图){ super.onNewIntent(意向); if(intent.hasExtra(NfcAdapter.EXTRA_标签)){ Toast.makeText(this,R.string.message_tag_检测到,Toast.LENGTH_SHORT.show(); } Tag currentTag=

我是NFC新手,我正在开发一个android应用程序来读取和写入NFC中的数据,但我遇到了一些问题

这是我正在使用的代码(编写):

@覆盖
受保护的void onNewIntent(意图){
super.onNewIntent(意向);
if(intent.hasExtra(NfcAdapter.EXTRA_标签)){
Toast.makeText(this,R.string.message_tag_检测到,Toast.LENGTH_SHORT.show();
}
Tag currentTag=intent.getParcelableExtra(NfcAdapter.EXTRA_标记);
字节[]id=currentTag.getId();
字符串myData=“ABCDEFGHIJKL”;
对于(字符串tech:currentTag.getTechList()){
if(tech.equals(NfcV.class.getName())){
NfcV tag5=NfcV.get(currentTag);
试一试{
tag5.connect();
整数偏移=0;
整数块=8;
byte[]data=myData.getBytes();
字节[]cmd=新字节[]{
(字节)0x20,
(字节)0x21,
(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00,
(字节)0x00,
(字节)0x00,(字节)0x00,(字节)0x00,(字节)0x00
};
数组复制(id,0,cmd,2,8);
对于(int i=0;i
当我在app TagInfo中读取标记时,输出为:

[00]。41 42 43 44[ABCD]

[01]。42 43 44 45[BCDE]

[02]。43 44 45 46[CDEF]

[03]。44 45 46 47[定义]

[04]。45 46 47 48[EFGH]

[05]。46474849[FGHI]

[06]。4748494A[GHIJ]

[07]。48 49 4A 4B[HIJK]

[08]。00 00[…]

这个输出正确吗


如果“不是”,我会错在哪里?

对我来说,这看起来是错误的,但不是NfcV专家只使用NDEF nfc卡

[00]。41 42 43 44[ABCD]

[01]。45 46 47 48[EFGH]

[02]。49 4A 4B 4C[IJKL]

作为一名专家,你到底想做什么

我认为问题在于
System.arraycopy(data,I,cmd,11,4)

您正在从源数据数组复制4个字节的数据,但仅将起始位置增加1个字节的数据,因此下一个块将在稍后开始

我认为
System.arraycopy(数据,I*4,cmd,11,4)将产生您想要的结果

这样,源数据中arraycopy的起始值将增加已存储的字节数

由于您需要12个字节的数据,并且每个块存储4个字节,因此只需要使用3个块,因此只需通过设置
int blocks=3来循环3次
否则,您将无法将数据复制到cmd,无法发送到生成
IndexOutOfBoundsException
from
arraycopy


如果您没有4字节的倍数数据,则必须用0填充数据,使其成为4字节的倍数,或者处理
IndexOutOfBoundsException
from
arraycopy
以正确复制剩余的字节。

您真的需要使用NfcV格式吗?因为Android对这种格式的支持非常差,甚至有些Android手机的一些硬件对这种格式的支持也很有限。如果你能使用更好的支持NDEF格式。是的,我需要使用NfcV!!我唯一能建议的是您查看并使用“命令的寻址版本”,因此,我使用了
System.arraycopy(data,I*4,cmd,11,4)
但它会导致一个
IndexOutOfBoundsException
。我不知道怎么解决!首先,我想在一个块中保存12字节的数据。这可能吗?或者块只能接受4字节吗?假设您的测试数据是12个字符,更改
int blocks=8
int块=3
应该可以工作,但从长远来看,您需要计算出数据的大小以及需要多少块,然后调整最后一个块以匹配块大小。至于块大小,您需要标签上芯片的数据表或购买V型卡的NFC规范()查看其他一些代码,这种类型的块是4字节,我认为这是这些卡的某个制造商芯片的规格,块大小可以是4或128字节,具体取决于芯片。我很难理解如何操作块。让我们假设,我想在单个块中写入4字节的数据。在块[04]上写上“abcd”,我该怎么做?我在哪里定义它?你能为我做一个示例代码吗?
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
        Toast.makeText(this, R.string.message_tag_detected, Toast.LENGTH_SHORT).show();
    }

    Tag currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    byte[] id = currentTag.getId();
    String myData = "ABCDEFGHIJKL";

    for (String tech : currentTag.getTechList()) {
        if (tech.equals(NfcV.class.getName())) {
            NfcV tag5 = NfcV.get(currentTag);
            try {
                tag5.connect();
                int offset = 0;  
                int blocks = 8;  
                byte[] data = myData.getBytes();
                byte[] cmd = new byte[] {
                        (byte)0x20,
                        (byte)0x21, 
                        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
                        (byte)0x00,
                        (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00     
                };
                System.arraycopy(id, 0, cmd, 2, 8);

                for (int i = 0; i < blocks; ++i) {
                    cmd[10] = (byte)((offset + i) & 0x0ff);
                    System.arraycopy(data,  i, cmd, 11, 4);

                    response = tag5.transceive(cmd);
                }

            }
            catch (IOException e) {
                Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                return;
            }
        }
    }
}