android 写入NFC标签(使用NTAG215)[重复]

ecbunoof  于 2023-01-11  发布在  Android
关注(0)|答案(1)|浏览(504)

此问题在此处已有答案

Ndef.get(tag) returns null(1个答案)
3天前关闭。
我目前正在使用使用NFC技术的Android应用程序。我是第一次使用此技术,因此希望获得帮助。我目前使用的是NTAG215。以下是我的主要活动公共类MainActivity扩展了AppCompatActivity {

NfcAdapter adapter;
PendingIntent pendingIntent;
IntentFilter writeTagFilters[];
boolean writeMode;
Tag myTag;
Context ctx;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ctx=this;
    Button btnWrite = (Button) findViewById(R.id.button);
    final TextView name = (TextView)findViewById(R.id.name);

    btnWrite.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v) {
            try {
                if(myTag==null){
                    Toast.makeText(ctx, ctx.getString(R.string.error_detected), Toast.LENGTH_LONG ).show();
                }else{
                    write(name.getText().toString(),myTag);
                    Toast.makeText(ctx, ctx.getString(R.string.ok_writing), Toast.LENGTH_LONG ).show();
                }
            } catch (IOException e) {
                Toast.makeText(ctx, ctx.getString(R.string.error_writing), Toast.LENGTH_LONG ).show();
                e.printStackTrace();
            } catch (FormatException e) {
                Toast.makeText(ctx, ctx.getString(R.string.error_writing) , Toast.LENGTH_LONG ).show();
                e.printStackTrace();
            }
        }
    });

    adapter = NfcAdapter.getDefaultAdapter(this);
    pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
    tagDetected.addCategory(Intent.CATEGORY_DEFAULT);
    writeTagFilters = new IntentFilter[] { tagDetected };

}


private void write(String text, Tag tag) throws IOException, FormatException {

    NdefRecord[] records = { createRecord(text) };
    NdefMessage message = new NdefMessage(records);
    Ndef ndef = Ndef.get(tag);
    ndef.connect();
    ndef.writeNdefMessage(message);
    ndef.close();
}


private NdefRecord createRecord(String text) throws UnsupportedEncodingException {
    String lang       = "en";
    byte[] textBytes  = text.getBytes();
    byte[] langBytes  = lang.getBytes("US-ASCII");
    int    langLength = langBytes.length;
    int    textLength = textBytes.length;
    byte[] payload    = new byte[1 + langLength + textLength];

    payload[0] = (byte) langLength;

    System.arraycopy(langBytes, 0, payload, 1,              langLength);
    System.arraycopy(textBytes, 0, payload, 1 + langLength, textLength);

    NdefRecord recordNFC = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,  NdefRecord.RTD_TEXT,  new byte[0], payload);

    return recordNFC;
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        myTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        Toast.makeText(this, this.getString(R.string.ok_detection) + myTag.toString(), Toast.LENGTH_LONG).show();
    }
}

@Override
public void onPause(){
    super.onPause();
    WriteModeOff();
}

@Override
public void onResume(){
    super.onResume();
    WriteModeOn();
}

private void WriteModeOn(){
    writeMode = true;
    adapter.enableForegroundDispatch(this, pendingIntent, writeTagFilters, null);
}

private void WriteModeOff(){
    writeMode = false;
    adapter.disableForegroundDispatch(this);
}

当我运行它的时候在我输入文本并点击按钮“写入”后,应用程序显示此error message如果写入错误,至少它会显示一个错误文本,我做了对吗?所以Idk这是什么了.我尝试阅读一些工作,并在这里问了问题,但有些要么没有回答或没有更新.他们中的大多数是写在Kotlin,我不知道很多.我也听说过enableforgrondDispatch我可以使用enableReaderMode不知道这是否正确。Idk如果代码从来没有一个工作的一个或如果我的标签技术有不同的格式,如果你有一个代码建议,你可以离开它。也如果你碰巧知道这些标签技术,将足以这个项目,让我知道。如果你知道这里发生了什么,请让我知道。谢谢请帮我这个家伙。

f1tvaqid

f1tvaqid1#

您看到的问题是,大多数标签没有设置为存储'' Ndef '数据,您需要先格式化它们。
代码还有很多其他问题,但是当你get一个标签时,你应该检查返回不是Null,这表明标签不是你试图得到的类型。
在您的情况下,类似代码应该可以解决这个问题:-

Ndef ndef = Ndef.get(tag);
if (ndef != null) {
    // It's a Ndef formatted Tag
    ndef.connect();
    ndef.writeNdefMessage(message);
    ndef.close();
} else {
    NdefFormatable ndefFormatable = NdefFormatable.get(tag);
    if (ndefFormatable != null) {
        // Format tag and write message
        ndefFormatable.connect();
        ndefFormatable.format(message);
        ndefFormatable.close();
    } else {
        // Throw an error message
        // Saying wrong type of Tag
    }
}

相关问题