Kotlin EMV android.nfc.Tag.setConnectedTechnology 错误

Kotlin EMV android.nfc.Tag.setConnectedTechnology Error

所以我必须在高中毕业那年做一个关于计算机科学中的 EMV 技术的演讲。 我想给 class 一个这项技术的实际应用,因为我在编程方面有一点经验。我使用了 GitHub 上开发的 EMV 库。我从我的代码中得到了这个错误,我试图在线查找但没有真正找到任何东西。如果有人能帮助我,我将不胜感激。

错误:

2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err: java.lang.IllegalStateException: Close other technology first!
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at android.nfc.Tag.setConnectedTechnology(Tag.java:458)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at android.nfc.tech.BasicTagTechnology.connect(BasicTagTechnology.java:78)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at android.nfc.tech.IsoDep.connect(IsoDep.java)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.example.projectz.PcscProvider.transceive(PcscProvider.java:44)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.github.devnied.emvnfccard.parser.impl.ProviderWrapper.transceive(ProviderWrapper.java:47)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.github.devnied.emvnfccard.parser.EmvTemplate.selectPaymentEnvironment(EmvTemplate.java:536)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.github.devnied.emvnfccard.parser.EmvTemplate.readWithPSE(EmvTemplate.java:390)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.github.devnied.emvnfccard.parser.EmvTemplate.readEmvCard(EmvTemplate.java:359)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.example.projectz.OverView.getCard(OverView.kt:68)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at com.example.projectz.OverView.onTagDiscovered(OverView.kt:43)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at android.nfc.NfcActivityManager.onTagDiscovered(NfcActivityManager.java:444)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at android.nfc.IAppCallback$Stub.onTransact(IAppCallback.java:83)
2019-11-12 19:22:55.450 8543-8556/com.example.projectz W/System.err:     at android.os.Binder.execTransact(Binder.java:570)

所以这是我的代码:

主要活动:

override fun onResume() {
        super.onResume()
        nfcAdapter?.enableReaderMode(this, this,
            NfcAdapter.FLAG_READER_NFC_A or
                    NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
            null)
    }
    public override fun onPause() {
        super.onPause()
        nfcAdapter?.disableReaderMode(this)
    }

    override fun onTagDiscovered(tag: Tag?) {
        isoDep = IsoDep.get(tag)
        isoDep!!.connect()
        getCard()
    }


    private fun getCard(){


        if (isoDep != null && status == "not connected"){
            status = "connected"
            val provider = PcscProvider()
            provider.setmTagCom(isoDep)

            val config = EmvTemplate.Config()
                .setContactLess(true)
                .setReadAllAids(true)
                .setReadTransactions(true)
                .setRemoveDefaultParsers(false)
                .setReadAt(true)

            val parser = EmvTemplate.Builder()
                .setProvider(provider)
                .setConfig(config)
                .build()

            val card = parser.readEmvCard()
            Basic().Snackbar(this, card.iban.toString())
        }else{
           // getCard()
        }

    }

提供商:

      package com.example.projectz;

import android.nfc.tech.IsoDep;
import android.util.Log;

import com.github.devnied.emvnfccard.enums.SwEnum;
import com.github.devnied.emvnfccard.exception.CommunicationException;
import com.github.devnied.emvnfccard.parser.IProvider;
import com.github.devnied.emvnfccard.utils.TlvUtil;


import java.io.IOException;
import java.security.Provider;

import fr.devnied.bitlib.BytesUtils;

public class PcscProvider implements IProvider{


    private static final String TAG = "Provider";


    private IsoDep mTagCom;

    public void setmTagCom(final IsoDep mTagCom) {
        this.mTagCom = mTagCom;
    }




    @Override
    public byte[] transceive(byte[] pCommand) throws CommunicationException {


        byte[] response = null;
        try {
            // send command to emv card
            mTagCom.getTag();
            mTagCom.connect();
            if (mTagCom.isConnected()){
                response = mTagCom.transceive(pCommand);
            }
        } catch (IOException e) {
            throw new CommunicationException(e.getMessage());
        }


        Log.d(TAG, "resp: " + BytesUtils.bytesToString(response));
        try {
            Log.d(TAG, "resp: " + TlvUtil.prettyPrintAPDUResponse(response));
            SwEnum val = SwEnum.getSW(response);
            if (val != null) {
                Log.d(TAG, "resp: " + val.getDetail());
            }
        } catch (Exception e) {
        }

        return response;
    }


    @Override
    public byte[] getAt() {
        return new byte[0];
    }
}

当您在 Tag 上第二次调用 connect 时没有关闭第一个连接时会出现此错误。

我不熟悉您正在使用的库,但我在 onTagDiscovered 中将您的代码读取为 connect,然后在 Provider 的 transceive 函数中再次读取 connect 时你首先没有关闭isoDep标签技术

错误日志显示at com.example.projectz.OverView.getCard(OverView.kt:68) 正在做另一个 connect - at android.nfc.tech.IsoDep.connect(IsoDep.java)