所以我必须在高中毕业那年做一个关于计算机科学中的 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/