3

我开发了一个检测 NFC 卡的 Android 应用程序,然后它打开 IsoDep 连接以发送 APDU 并获得响应。当应用程序检测到它打开一个工作会话的 NFC 卡时,我创建了一个thread每次500 ms检查 isoDep 连接,如果连接丢失应用程序关闭工作会话(停止池,删除卡数据......)。

我的应用程序是设备所有者并被锁定,它只包含一个启动 web 视图以转换用户界面的 html 代码的活动。

在 MainActivity 中,我在 super.onPause() 之前的 onPause() 中停止池化,并在 super.onResume() 之后的 onResume() 中重新启动它。我也总是调用NfcAdapter.enableReaderMode()onResume() 和NfcAdapter.disableReaderModeonPause()。

    //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 或应用程序才能检测到卡。

4

0 回答 0