我正在尝试在Android上编写一个可以使用phonegap读取和显示NFC标签信息的应用程序。 方案如下:
1.任务可以通过在manifest.xml文件中添加过滤器来完成。
在应用程序启动后,是否可以在不触摸NFC标签的情况下执行2.任务?
由于
答案 0 :(得分:1)
您需要写入NFC上的标签
在清单中为您的活动添加过滤器
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
并添加权限
<uses-permission android:name="android.permission.NFC" />
<uses-feature
android:name="android.hardware.nfc"
android:required="true" />
在NfcReader.java中
public String getNfcData(Intent intent) {
if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (parcelables != null && parcelables.length > 0) {
String data = readTextFromMessage((NdefMessage) parcelables[0]);
return data;
} else {
Toast.makeText(context, "Cannot Read From Tag.", Toast.LENGTH_LONG).show();
return "No NDEF messages found!";
}
}
return "";
String readTextFromMessage(NdefMessage ndefMessage) {
NdefRecord[] ndefRecords = ndefMessage.getRecords();
if (ndefRecords != null && ndefRecords.length > 0) {
NdefRecord ndefRecord = ndefRecords[0];
String tagContent = getTextFromNdefRecord(ndefRecord);
return tagContent;
} else {
return "No NDEF records found!";
}
public String getTextFromNdefRecord(NdefRecord ndefRecord) {
String tagContent = null;
try {
byte[] payload = ndefRecord.getPayload();
String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";
int languageSize = payload[0] & 0063;
tagContent = new String(payload, languageSize + 1,
payload.length - languageSize - 1, textEncoding);
} catch (UnsupportedEncodingException e) {
Log.e("getTextFromNdefRecord", e.getMessage(), e);
}
Log.e("log", "getTextFromNdefRecord");
return tagContent;
}
在您的主要活动中
protected void onResume() {
super.onResume();
if (getIntent().hasExtra(NfcAdapter.EXTRA_TAG)) {
String NfcID = nfcReader.getNfcID(getIntent());
String tagData = nfcReader.getNfcData(getIntent());
String nfcPackage = nfcReader.readNfcPackage(getIntent());
Log.d(Const.TAG, "NFCID: " + NfcID);
Log.d(Const.TAG, "Data: " + tagData);
Log.d(Const.TAG, "package Name: " + nfcPackage);
if (nfcPackage.equals(Const.packageName)) {
prefs.edit().putString(Const.VAN_NUMBER_PREF, tagData).commit();
vanNumberTxt.setText("Van #: " + tagData);
Tools.vibrator(this);
toggleButton.setChecked(true);
} else finish();
}
答案 1 :(得分:0)
感谢@Davit Avetisyan获取详细代码
因此,获取标记信息的关键是从意图中提取
Intent intent = getIntent();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String myTagId = bytesToHexString(tag.getId());
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
NdefRecord[] records = msgs[i].getRecords();
byte[] payload = records[j].getPayload();