android - Kotlin EMV android.nfc.Tag.setConnectedTechnology 错误

标签 android kotlin nfc

所以我必须在高中毕业那年做一个关于计算机科学中的 EMV 技术的演示。 我想让全类同学在现实生活中应用这项技术,因为我有一些编程经验。我使用了 GitHub 上 devnied 的 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)

这是我的代码:

主要 Activity :

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 中再次 connect第一次未关闭isoDep标签技术时的transceive功能

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

关于android - Kotlin EMV android.nfc.Tag.setConnectedTechnology 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58825020/

相关文章:

kotlin - 从 InputStream 读取的挂起函数

java - 自己的SDK架构——Kotlin中的异步方法API

android - 我的 AlarmService 只关闭了 3 秒

带抽屉导航的工具栏上的 Android 'back' 操作

android - 无法从蓝牙 socket 读取输入

android - 应用程序行为取决于 NFC 支持

tags - 有没有可以更改NFC Tag序列号的软件?

android - 即使包含 Ndef 数据,也不会为 ACTION_NDEF_DISCOVERED 操作发现 NFC 标签

java - 第二个 AsyncTask 没有执行

java - 如何在空游戏中计算 FPS?