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