Я пытаюсь прочитать теги NFC в своем приложении для Android, теги NFC представляют собой простую карту с простым текстом на ней, после просмотра документации Android и просмотра некоторых других руководств я получил следующий код в своем AndroidManifest:
<uses-permission android:name="android.permission.NFC" />
<uses-feature android:name="android.hardware.nfc" android:required="true" />
<activity
android:name=".pterm" // activity where i would be able to read NFC
android:screenOrientation="portrait"
android:theme="@style/SplashScreen">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED" />
</intent-filter>
</activity>
И в моей деятельности я добавил следующий код:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (nfcRead) {
readFromIntent(intent);
}
}
private void readFromIntent(Intent intent) {
String action = intent.getAction();
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
|| NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
|| NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
NdefMessage[] messages = null;
if (rawMessages != null) {
messages = new NdefMessage[rawMessages.length];
for (int i = 0; i < rawMessages.length; i++) {
messages[i] = (NdefMessage) rawMessages[i];
NdefRecord[] records = messages[i].getRecords();
//if you are sure you have text then you don't need to test TNF
for(NdefRecord record: records){
processRecord(record);
}
}
}
}
}
public void processRecord(NdefRecord record) {
short tnf = record.getTnf();
switch (tnf) {
case NdefRecord.TNF_WELL_KNOWN: {
if (Arrays.equals(record.getType(), NdefRecord.RTD_TEXT)) {
String yourtext = processRtdTextRecord(record.getPayload());
Log.e("NFC:", yourtext);
} else if (Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
return;
} else if (Arrays.equals(record.getType(), NdefRecord.RTD_SMART_POSTER)) {
return;
} else {
return;
}
}
case NdefRecord.TNF_MIME_MEDIA: {
if (record.toMimeType().equals("MIME/Type")) {
// handle this as you want
} else {
//Record is not our MIME
}
}
// you can write more cases
default: {
//unsupported NDEF Record
}
}
}
private String processRtdTextRecord(byte[] payload) {
String textEncoding = ((payload[0] & 128) == 0) ? "UTF-8" : "UTF-16";
int languageCodeLength = payload[0] & 0063;
String text = "";
try {
text = new String(payload, languageCodeLength + 1, payload.length - languageCodeLength - 1, textEncoding);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Log.e("UnsupportedEncoding", e.toString());
}
return text;
}
Но когда я пытаюсь прочитать тег NFC, событие onNewIntent даже не запускается, но NFC читается, когда устройство издает звук уведомления NFC.
Целью приложения является чтение NFC только тогда, когда пользовательский AletDialog активирован, после того как NFC прочитает значение, оно должно быть помещено в EditText, а новое значение может быть прочитано снова только тогда, когда диалог снова активен.
Приложение использует LockTaskMode.