尝试使用此功能读取NFC卡
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
if ("text/plain".equals(type)) {
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
NdefMessage[] msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; i++) {
msgs[i] = (NdefMessage) rawMsgs[i];
}
NdefMessage msg = msgs[0];
try {
byte[] payload = msg.getRecords()[0].getPayload();
String textEncoding = ((payload[0] & 0200) == 0) ? String.valueOf(R.string.utf_8) : String.valueOf(R.string.utf_16);
int languageCodeLength = payload[0] & 0077;
String languageCode = new String(payload, 1, languageCodeLength, "US-ASCII");
Log.d("reader", "Language code:" + languageCode);
//Get the Text
String text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
textViewLastResult.setText(text);
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
//textViewLastResult.setText("Wrong mime type: " + type);
}
}
我收到了错误 -
String text = new String(payload,languageCodeLength + 1,payload.length - languageCodeLength - 1,textEncoding);
W / System.err:java.io.UnsupportedEncodingException:2131099684 10-27 21:41:52.606 7804-7804 / com.geniuslead.attendance W / System.err:at java.nio.charset.Charset.forNameUEE(Charset.java:316) 10-27 21:41:52.606 7804-7804 / com.geniuslead.attendance W / System.err:at java.lang.String。(String.java:223) 10-27 21:41:52.606 7804-7804 / com.geniuslead.attendance W / System.err:at com.geniuslead.attendance.ui.ReadCardActivity.resolveIntent(ReadCardActivity.java:198)
答案 0 :(得分:1)
如果我理解得很好,你可以从字符串资源中获取编码。相反,尝试使用这样的东西(取决于版本):
String text = "";
if ((payload[0] & 0200) == 0) text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, StandardCharsets.UTF_8);
else text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, StandardCharsets.UTF_16);
答案 1 :(得分:1)
我的错误是String.valueOf(R.string.utf_8)
给了一些不。可能是字符串ID。我硬编码“UTF-8”现在它正在工作..