У меня проблема с NFC в проекте, который я сейчас делаю для школы. Это первый случай, когда я пытаюсь использовать NFC в приложении и поэтому не могу правильно понять, как это работает.Запуск приложения NFC на разных устройствах приводит к анализу несогласованности EXTRA_NDEF_MESSAGE
Проблема в том, что мы тестировали приложение на HTC One M8 на прошлой неделе, где наше приложение не испытывало проблем с чтением строки на нашем чипе.
Однако, когда я сейчас пытаюсь использовать LG Nexus 5 члена семьи, строка не передается в приложение.
Вот код:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app);
//NFC Adapter
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
}
@Override
protected void onResume() {
super.onResume();
enableForegroundDispatchSystem();
}
@Override
protected void onPause() {
super.onPause();
disableForegroundDispatchSystem();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent.hasExtra(NfcAdapter.EXTRA_TAG)) {
Toast.makeText(this, "NfcIntent!", Toast.LENGTH_SHORT).show();
Parcelable[] parcelables = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (parcelables != null && parcelables.length > 0) {
// this part gets executed on the HTC Once m8
readTextFromMessage((NdefMessage) parcelables[0]);
} else {
// this part gets executed on the LG Nexus 5
Toast.makeText(this, "No NDEF messages found!", Toast.LENGTH_SHORT).show();
}
}
}
private void readTextFromMessage(NdefMessage ndefMessage) {
NdefRecord[] ndefRecords = ndefMessage.getRecords();
if (ndefRecords != null && ndefRecords.length>0) {
NdefRecord ndefRecord = ndefRecords[0];
String tagContent = getTextFromNdefRecord(ndefRecord);
if (tagContent.toString().equals("Kasse")) {
//scanBtn.setVisibility(View.VISIBLE);
} else {
//addItem(tagContent);
//cartArrayDisplay.addView(nameList.get(cartAmount));
//priceArrayDisplay.addView(priceList.get(cartAmount));
//cartAmount++;
}
} else {
Toast.makeText(this, "No NDEF records found!", Toast.LENGTH_SHORT).show();
}
}
private void enableForegroundDispatchSystem() {
Intent intent = new Intent(this, AppActivity.class).addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
IntentFilter[] intentFilters = new IntentFilter[]{};
nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, null);
}
private void disableForegroundDispatchSystem() {
nfcAdapter.disableForegroundDispatch(this);
}
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);
}
return tagContent;
}
При запуске приложения на HTC One m8 он всегда будет работать в этой части:
if (parcelables != null && parcelables.length > 0) {
readTextFromMessage((NdefMessage) parcelables[0]);
Однако при запуске приложения на LG Nexus 5 он выполняет эту часть:
} else {
Toast.makeText(this, "No NDEF messages found!", Toast.LENGTH_SHORT).show();
Мне сказали, что это, скорее всего, связано с тегами, которые мы используем, для всех устройств. Тем не менее, я думал, что это также может быть что-то программным, так как я не имею опыта работы с Android и NFC.
Теги - идентификаторы студентов. Приложение для чтения тегов определил один из них, как
- Тип Tag: Mifare Classic 1k
- NUID [4]: dbc3f12d
- ATQA: 0004
- SAK: 08
- технологии Цель: андроида. nfc.tech.NfcA
Для того, чтобы догадаться, что, вероятно, может пойти не так, Вы должны были бы показать нам, как вы пишете сообщение на тег и какой тип тега вы используете.Еще лучше сканируйте тег одним из доступных приложений для анализа тегов NFC (например, NFC TagInfo) и покажите нам, что он отображает о типе тега и сохраненном на нем NDEF-сообщении. –
Я просто сделал. Тип тега - Mifare Classic 1k. Существует другая информация, такая как NUID [4] = dbc3f12d, ATQA = 0004, SAK = 08, Target technology = android.nfc.tech.NfcA –