2015-12-17 1 views
2

У меня проблема с 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
+0

Для того, чтобы догадаться, что, вероятно, может пойти не так, Вы должны были бы показать нам, как вы пишете сообщение на тег и какой тип тега вы используете.Еще лучше сканируйте тег одним из доступных приложений для анализа тегов NFC (например, NFC TagInfo) и покажите нам, что он отображает о типе тега и сохраненном на нем NDEF-сообщении. –

+0

Я просто сделал. Тип тега - Mifare Classic 1k. Существует другая информация, такая как NUID [4] = dbc3f12d, ATQA = 0004, SAK = 08, Target technology = android.nfc.tech.NfcA –

ответ

1

Проблема, с которой вы столкнулись, является результатом того, что чипсет NFC на вашем устройстве несовместим с MIFARE Classic. Как правило, только устройства с набором микросхем NFC от NXP способны читать MIFARE Classic (NXP является владельцем технологии MIFARE).

MIFARE Classic использует механизм предотвращения столкновения и активации, определенный в стандарте ISO/IEC 14443 типа A (а также ISO/IEC 18092). Таким образом, эта часть соответствует тому, как работают другие бесконтактные смарт-карты и теги NFC. В результате все (большинство!) Android-устройства NFC обнаружат такие карты/теги. Однако протокол связи и обрамление отклоняются от того, что определено для других тегов NFC и бесконтактных смарт-карт. Этот нестандартный протокол недоступен на других наборах микросхем, чем NXP, и поэтому данные не могут считываться с карт MIFARE Classic на устройствах с контроллерами NFC NXP.

HTC One m8 содержит контроллер NXP PN544 NFC и поэтому может обнаружить ваш тег и прочитать данные с него. LG Nexus 5 содержит контроллер Broadcom BCM20793 NFC и поэтому может обнаружить ваш тег, но не может читать данные из него.

1

На вершине, что сказал Майкл, вы можете проверить, поддерживает ли ваше устройство Mifare Classic с

PackageManager.hasSystemFeature("com.nxp.mifare"); 
+0

Имейте в виду, что есть еще некоторые устройства там, где производители «забыли» объявить эта функция системы, хотя устройство поддерживает MIFARE Classic. –

Смежные вопросы