Поскольку чтение NFC обрабатывается ОС Android, при чтении карты всегда будет звучать звук.
В зависимости от того, что NDEF записывает на карту и что пытается сделать ваше приложение, определяет, чтоОперационная система работает с данными NFC.
Вы можете загрузить стандартное приложение NFC, например https://play.google.com/store/apps/details?id=com.wakdev.wdnfc&hl=en_US, чтобы проверить, что находится на карте, и записать примеры данных для вашего приложения для чтения.
Похоже, что вы пытаетесь запустить это приложение на 2 телефонах и заставить их говорить, используя устаревшую функциональность Android Beam https://developer.android.com/reference/android/nfc/NfcAdapter.CreateNdefMessageCallback (что, как я обнаружил, никогда не было надежным - именно поэтому они его удаляют)
Но вы говорите
Почему я получаю эту ошибку вместо текстового просмотра, отображающего информацию карты nfc, которую я сканирую
Что говорит о том, что вы пытаетесь прочитатьNFC-карта и используемые методы не для этого.
Вопрос в том, хотите ли вы делать с NFC?
1) Есть ли карта NFC, из-за которой приложение запускаетсяОС Android?
Затем как-нибудь используйте данные на NFC.
Если да, то вам просто нужно вставить правильные фильтры намерений в манифест и обрабатывать их в своей MainActivity, как если бысделать для любого другого намерения, и анализ сообщения NDEF из данных намерения.
См. https://developer.android.com/guide/components/intents-filters#ExampleFilters для некоторых примеров не NFC о том, как ваше приложение может зарегистрировать в ОС, какие типы намерений оно может обработать.
2) В вашем приложении обрабатывать чтение с карты NFC в определенное время
Кажется, это больше того, что вы пытаетесь сделать (и что делают мои приложения)
Длясделать это, вы используете включить диспетчер NFC Foreground https://developer.android.com/reference/android/nfc/NfcAdapter.html#enableForegroundDispatch(android.app.Activity,%20android.app.PendingIntent,%20android.content.IntentFilter%5B%5D,%20java.lang.String%5B%5D%5B%5D)
Я использую следующий тип кода, чтобы сделать это в моей деятельности
public class ViewNFCCardsActivity extends AppCompatActivity {
private NfcAdapter mNfcAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_nfccards);
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
}
@Override
protected void onResume() {
super.onResume();
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter ndefDetected = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
IntentFilter techDetected = new IntentFilter(NfcAdapter.ACTION_TECH_DISCOVERED);
IntentFilter[] nfcIntentFilter = new IntentFilter[]{techDetected,tagDetected,ndefDetected};
try {
ndefDetected.addDataType("*/*");
} catch (IntentFilter.MalformedMimeTypeException e) {}
PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
if(mNfcAdapter!= null)
mNfcAdapter.enableForegroundDispatch(this, pendingIntent, nfcIntentFilter, null);
}
@Override
protected void onPause() {
super.onPause();
if(mNfcAdapter!= null)
mNfcAdapter.disableForegroundDispatch(this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
TextView textView = (TextView) findViewById(R.id.MessageText);
// High level way to get Ndef records from what is already been read from the tag
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMessages != null) {
// Only need the first message
NdefMessage msg = (NdefMessage) rawMessages[0];
// Only need the first record in message
String message = new String(msg.getRecords()[0].getPayload());
textView.setText(message);
}
}
}
Материал onResume
говорит ОС Android для отправкивсе сообщения типа карты NFC в мое приложение, а метод onNewIntent
получает намерение, переданное ему операционной системой, и обрабатывает сообщение, если оно является сообщением NDEF.
Вы также можете при создании диспетчера переднего планав onResume
добавьте дополнительные фильтры, такие как
try {
ndefDetected.addDataType("custom/text");
} catch (IntentFilter.MalformedMimeTypeException e) {}
или удалите фильтры для карт не NDEF (обычно добавляйте все типы, потому что я не хочу, чтобы другие типы карт, такие как бесконтактные банковские карты, запускали другие приложения, пока мое приложение находится вна переднем плане)