android 13 getNdefMessage 在 writeMessage 后获取 null

问题描述 投票:0回答:1

通过在传感器中使用 NFC 技术,我们正在使用通过手机 NFC 通信检索水污染水平的技术。用现有的逻辑,通过GetNdefMessage读取数据,如果不正确,则通过WriteNdefMessage重新写入type的类型,然后再次读取。

这次Google告诉我将目标版本提升到33,所以我再次尝试在Android 33版本手机上使用NFC技术,但在Android 13上不起作用。

如果在 WriteNdefMessage 之后执行 GetNdefMessage,则会出现 null。 我不知道这是为什么。通过阅读Google的官方文档,我了解到从31到33时,与NFC相关的任何内容都没有改变。当您搜索相应的错误时,它是否已更改,以便您无法使用ndef写入和读取NFC?

public class TestSensor extends AppCompatActivity {
    private NfcAdapter nfcAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        }
        catch (Exception e){
            e.printStackTrace();
        }


    }

    @Override
    public void onResume(){
        super.onResume();
        try {
            if (nfcAdapter != null) {
                Bundle options = new Bundle();
                options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 250);
                nfcAdapter.enableReaderMode(this,new NfcReaderClass(), NfcAdapter.FLAG_READER_NFC_A |
                        NfcAdapter.FLAG_READER_NFC_B |
                        NfcAdapter.FLAG_READER_NFC_F |
                        NfcAdapter.FLAG_READER_NFC_V ,options);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);

    }

    @Override
    public void onPause(){
        super.onPause();
        try {
            if (nfcAdapter != null) {
                nfcAdapter.disableReaderMode(this);
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }

    }

    @Override
    public void onDestroy(){
        super.onDestroy();
    }
}

class NfcReaderClass implements NfcAdapter.ReaderCallback {
    private Tag mTag = null;
    private Ndef m_Ndef = null;
    @Override
    public void onTagDiscovered(Tag tag) {
        try {
            if (tag != null){
                this.mTag = tag;
                writeNfcNdef();
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
    }

    public void writeNfcNdef(){
        try {
            this.m_Ndef = Ndef.get(this.mTag);
            if (this.m_Ndef != null){
                byte[] info2 = hexStringToByteArray("AA00");
                NdefRecord record =  RecordUtil.makeMimeTypeRecord("app/x-sensor", null, info2);
                NdefMessage msg = new NdefMessage(new NdefRecord[]{record});

                this.m_Ndef.connect();

                this.m_Ndef.writeNdefMessage(msg);

                this.m_Ndef.close();
                this.m_Ndef = Ndef.get(this.mTag);
                this.m_Ndef.connect();

                NdefMessage msg1 = this.m_Ndef.getNdefMessage();
                Log.e("msg","!!! "+ msg1);
            }

        }
        catch (Exception e){
            e.printStackTrace();
        }
    }
}

我还参考了那篇文章和这篇文章来尝试解决问题。

看到一篇文章说不应该在onNewIntent中进行Write,我尝试在onResume中进行Write。我还尝试在 OnResume 中使用 OnReaderMode 并在 onNewIntent 中使用 ActivateForegroundDispatch 来处理此问题。

java android ndef android-13
1个回答
0
投票

我的应用程序也有同样的问题,该应用程序使用 NFC 从设备读取数据,进行多次连续读取和写入。 在安卓上<=12 works perfectly, but on Android 13 after the first read & write, the next read will trigger the following error on logcat:

libnfc_nci  E  [ERROR:nfa_dm_ndef.cc(423)] Received invalid NDEF message. NDEF status=0x9

一篇文章建议执行

ndef.close()
并再次连接以进行下一次阅读,但这对我来说没有任何改变。

目前我的解决方法是让标签连接关闭并等待手机再次拾取它并继续该过程。 为了在不不断移除和定位手机的情况下实现这一点,我使用以下方法初始化 NFC 接口:

final boolean ON_WRITE_CLOSE = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU); //if should loop read-write on same tag event
//... other stuff
final Bundle options = new Bundle();
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, (ON_WRITE_CLOSE ? 1 : 1000));
nfcAdapter.enableReaderMode(activity, tag -> {
    //... my code here
}, NfcFlags, options);

结果是与我的设备的交互速度慢得多,但总比没有好

© www.soinside.com 2019 - 2024. All rights reserved.