android - 从 Android 应用程序的 NFC 标签中读取 NDEF 消息

标签 android nfc android-pendingintent payload ndef

我正在尝试使用 NFC 创建一个应用程序,我只想尝试读取 NFC 标签并从标签中获取文本消息并将其放入 TextView 中。我已经有了它的代码,但是当我尝试将手机与 NFC 标签配对时没有任何反应。

这是我的代码,有人可以看看它,看看我做错了什么,需要做什么来解决这个问题:

Button measurementsDataButton;
NfcAdapter myNfcAdapter;
PendingIntent myPendingIntent;
IntentFilter ndef;
IntentFilter[] filters;
String[][] techLists;
int mCount;
TextView mText;
String payload;
byte payloadHeader;

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

    final ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);

    mText = (TextView) findViewById(R.id.flowTextView1);

    measurementsDataButton = (Button) findViewById(R.id.measurementsButton1);
    measurementsDataButton.setOnClickListener(this);

    myNfcAdapter = NfcAdapter.getDefaultAdapter(this);

    myPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

    ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    filters = new IntentFilter[] {ndef, };
    techLists = new String[][] {new String[] {Ndef.class.getName()}, new String[] {NdefFormatable.class.getName()}};
}

@Override
public void onPause() {
    super.onPause();
    myNfcAdapter.disableForegroundDispatch(this);
}

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

    if(myNfcAdapter != null) {

        myNfcAdapter.enableForegroundDispatch(this, myPendingIntent, filters, techLists);

    }

}

@Override
public void onNewIntent(Intent intent) {

    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent()))
    {
        NdefMessage [] messages = getNdefMessages(getIntent());
        for(int i = 0; i<messages.length; i++) 
        {
            for(int j = 0; j<messages[0].getRecords().length; j++)
            {
                NdefRecord record = messages[i].getRecords()[j];
                payload = new String(record.getPayload(), 1, record.getPayload().length-1, Charset.forName("UTF-8"));
                mText.setText(payload);
                payloadHeader = record.getPayload()[0];
            }
        }
    }
}

NdefMessage[] getNdefMessages(Intent intent) {
    // TODO Auto-generated method stub

    NdefMessage[] message = null;
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {

        Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);

        if(rawMessages != null) {

            message = new NdefMessage[rawMessages.length];
            for(int i = 0; i < rawMessages.length; i++) {

                message[i] = (NdefMessage) rawMessages[i];

            }
        }
            else {
                byte[] empty = new byte[] {};
                NdefRecord record = new NdefRecord (NdefRecord.TNF_UNKNOWN, empty, empty, empty);
                NdefMessage msg = new NdefMessage (new NdefRecord[] {record});
                message = new NdefMessage[] {msg};
            }

        }
            else {
                Log.d("", "Unknown intent.");
                finish();
                }


    return message;
}

最佳答案

发送-接收 NDEF TAG 的代码示例:

public class MainActivity extends AppCompatActivity implements NfcAdapter.CreateNdefMessageCallback {

private NfcAdapter mNfcAdapter;
TextView tv;
private PendingIntent mPendingIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tv = (TextView) findViewById(R.id.textViewReceivedMessage);

    NfcManager nfcManager = (NfcManager) getSystemService(NFC_SERVICE);
    mNfcAdapter = nfcManager.getDefaultAdapter();

    mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass())
            .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
}

private static NdefMessage getTestMessage() {
    byte[] mimeBytes = "application/com.android.cts.verifier.nfc"
            .getBytes(Charset.forName("US-ASCII"));
    byte[] id = new byte[] {1, 3, 3, 7};
    byte[] payload = "CTS Verifier NDEF Push Tag".getBytes(Charset.forName("US-ASCII"));
    return new NdefMessage(new NdefRecord[] {
            new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, id, payload)
    });
}


@Override
protected void onResume() {
    super.onResume();

    mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
    mNfcAdapter.setNdefPushMessageCallback(this, this);
}

// sending message
@Override
public NdefMessage createNdefMessage(NfcEvent event) {
    return getTestMessage();
}


private NdefMessage[] getNdefMessages(Intent intent) {
    Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
    if (rawMessages != null) {
        NdefMessage[] messages = new NdefMessage[rawMessages.length];
        for (int i = 0; i < messages.length; i++) {
            messages[i] = (NdefMessage) rawMessages[i];
        }
        return messages;
    } else {
        return null;
    }
}

static String displayByteArray(byte[] bytes) {
    String res="";
    StringBuilder builder = new StringBuilder().append("[");
    for (int i = 0; i < bytes.length; i++) {
        res+=(char)bytes[i];
    }
    return res;
}

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

    NdefMessage[] messages = getNdefMessages(intent);
    tv.setText(displayByteArray(messages[0].toByteArray()));
}

关于android - 从 Android 应用程序的 NFC 标签中读取 NDEF 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17587963/

相关文章:

android - 如何从 IsoDep 获取额外的卡数据?

android - 以编程方式检查设备是否具有 NFC 读取器

安卓小部件 :how to determine which button was clicked?

java - PendingIntent 的 getBroadcast 和 getService

android - 如何添加图标或更改日历 View 日期图标?

android - KSOAP2 : get http status code for a response of a web service

android - 防止在 NFC 读取时重新打开 Activity

android - 应用程序崩溃 : Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent

android - (Unity) Firebase 不适用于 Android 构建

android ScrollView 隐藏顶部内容