Я разработал приложение Android, которое обнаруживает карту NFC, затем открывает соединение IsoDep с ним, чтобы отправить APDU и получить ответ.Когда приложение обнаруживает карту NFC, оно открывает рабочий сеанс, я создал thread
, чтобы каждый 500 ms
проверял соединение isoDep, если соединение было потеряно, приложение закрывало рабочий сеанс (прекращение объединения, удаление данных карты ...).
Мое приложение является владельцем устройства и заблокировано, и оно содержит только одно действие, которое запускает веб-просмотр, чтобы включить HTML-код для пользовательских интерфейсов.
В MainActivity я прекращаю пул в onPause () перед super.onPause () и я перезапускаю его в onResume () после super.onResume ().Также я всегда вызываю NfcAdapter.enableReaderMode()
в onResume () и NfcAdapter.disableReaderMode
в onPause ().
//enable nfc dispatch
Bundle options = new Bundle();
options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 50);
NfcManager manager = (NfcManager) activity.
getApplicationContext().getSystemService(Context.NFC_SERVICE);
if(manager == null) {
return;
}
NfcAdapter nfcAdapter = manager.getDefaultAdapter();
if(nfcAdapter == null) {
return;
}
try {
nfcAdapter.enableReaderMode(activity,
new NfcAdapter.ReaderCallback() {
@Override
public void onTagDiscovered(final Tag tag) {
cardDetected(tag);
}
},
NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK |
NfcAdapter.FLAG_READER_NO_PLATFORM_SOUNDS,
options);
} catch (Exception e) {
}
//disable nfc dispatch
NfcManager manager = (NfcManager)activity.getApplicationContext().getSystemService(Context.NFC_SERVICE);
if(manager == null) {
return;
}
NfcAdapter nfcAdapter = manager.getDefaultAdapter();
if(nfcAdapter == null) {
return;
}
try {
nfcAdapter.disableReaderMode(activity);
} catch (Exception e) {
}
Я использую Samsung Xcover4 Android 8 для тестирования приложения.И моя проблема в том, что когда-то вызывается onResume, я вижу в logcat DeadObjectException:
E/NFC: NFC service dead - attempting to recover
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:777)
at android.nfc.INfcAdapter$Stub$Proxy.setAppCallback(INfcAdapter.java:1026)
at android.nfc.NfcActivityManager.requestNfcServiceCallback(NfcActivityMan ager.java:494)
at android.nfc.NfcActivityManager.onActivityResumed(NfcActivityManager.java:674)
at android.app.Application.dispatchActivityResumed(Application.java:240)
at android.app.Activity.onResume(Activity.java:1369)
at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:514)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1363)
at android.app.Activity.performResume(Activity.java:7432)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3780)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3845)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1773)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:7000)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
Когда это происходит, карта никогда не обнаруживается, и мне нужно перезапустить NFC или приложение, чтобыв состоянии обнаружить карту.