From 8e3719a37a6be0c9e244a0160b5f2f3331ca3122 Mon Sep 17 00:00:00 2001
From: zuoxiao <470321431@qq.com>
Date: 星期四, 30 十一月 2023 15:11:38 +0800
Subject: [PATCH] 支持虚拟卡读取
---
app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java | 6
app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java | 31 +++
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java | 28 ++-
app/src/main/java/com/dayu/recharge/tools/NFCUtil.java | 100 ++++++++++++
app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java | 3
app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java | 74 ++------
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java | 69 ++++---
app/src/main/java/com/dayu/recharge/tools/LoyaltyCardReader.java | 97 +++++++----
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java | 28 +++
9 files changed, 291 insertions(+), 145 deletions(-)
diff --git a/app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java b/app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java
index fd36401..84768de 100644
--- a/app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java
@@ -14,11 +14,13 @@
import android.nfc.NfcEvent;
import android.nfc.Tag;
import android.nfc.cardemulation.CardEmulation;
+import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import com.dayu.recharge.card.UserCard;
import com.dayu.recharge.tools.LoyaltyCardReader;
+import com.dayu.recharge.tools.NFCUtil;
import com.dayu.recharge.tools.NfcReadHelper;
import com.dayu.recharge.utils.LogUtil;
import com.dayu.recharge.utils.TipUtil;
@@ -53,35 +55,34 @@
public final static int ERROR = -1;
- protected NfcAdapter mNfcAdapter;
- private PendingIntent mPendingIntent;
+// protected NfcAdapter mNfcAdapter;
+// private PendingIntent mPendingIntent;
volatile UserCard userCard;
Handler handler;
public LoyaltyCardReader mLoyaltyCardReader;
+
+ NFCUtil nfcUtil;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ nfcUtil = NFCUtil.getInstance();
+ nfcUtil.setAccountCallback(this);
+ }
+
/**
* onCreat->onStart->onResume->onPause->onStop->onDestroy
* 鍚姩Activity锛岀晫闈㈠彲瑙佹椂.
*/
- public static int READER_FLAGS =
- NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK;
@Override
protected void onStart() {
super.onStart();
//姝ゅadapter闇�瑕侀噸鏂拌幏鍙栵紝鍚﹀垯鏃犳硶鑾峰彇message
- mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
- Intent intent = new Intent(this, getClass());
-
- //涓�鏃︽埅鑾種FC娑堟伅锛屽氨浼氶�氳繃PendingIntent璋冪敤绐楀彛
- mPendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
-
-// mLoyaltyCardReader = new LoyaltyCardReader(this);
-// if (mNfcAdapter != null) {
-// mNfcAdapter.enableReaderMode(this, mLoyaltyCardReader, READER_FLAGS, null);
-// }
+ nfcUtil.onStartNfcAdapter(this);
}
@@ -91,12 +92,7 @@
@Override
public void onResume() {
super.onResume();
- if (!ifNFCUse(this)) {
- this.finish();
- }
- //璁剧疆澶勭悊浼樹簬鎵�鏈夊叾浠朜FC鐨勫鐞�
- if (mNfcAdapter != null)
- mNfcAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);
+ nfcUtil.onResumeNfcAdapter(this);
}
/**
@@ -106,43 +102,17 @@
public void onPause() {
super.onPause();
//鎭㈠榛樿鐘舵��
- if (mNfcAdapter != null)
- mNfcAdapter.disableForegroundDispatch(this);
-// mNfcAdapter.disableReaderMode(this);
-
- }
-
-// @Override
-// protected void onDestroy() {
-// super.onDestroy();
-// if (mNfcAdapter != null)
-// mNfcAdapter.disableReaderMode(this);
-// }
-
- /**
- * 妫�娴嬪伐浣�,鍒ゆ柇璁惧鐨凬FC鏀寔鎯呭喌
- *
- * @return
- */
- protected Boolean ifNFCUse(Activity context) {
- if (mNfcAdapter == null) {
- TipUtil.show(context, "璁惧涓嶆敮鎸丯FC锛�");
- return false;
- }
- if (mNfcAdapter != null && !mNfcAdapter.isEnabled()) {
- TipUtil.show(context, "璇峰湪绯荤粺璁剧疆涓厛鍚敤NFC鍔熻兘锛�");
- return false;
- }
- return true;
+ nfcUtil.onPauseNfcAdapter(this);
}
@Override
- public void onAccountReceived(Tag tag) {
+ public void physicalCardDoing(Tag tag) {
- Intent intent = new Intent(this, getClass());
- intent.putExtra(NfcAdapter.EXTRA_TAG, tag);
- startActivity(intent);
+ }
+
+ @Override
+ public void virtualCardDoing(Tag tag) {
}
}
diff --git a/app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java b/app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
index 1a7ec6a..19c3021 100644
--- a/app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
@@ -1,6 +1,7 @@
package com.dayu.recharge.activity;
import android.content.Intent;
+import android.nfc.Tag;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -80,8 +81,8 @@
String userName;
AdminDataBean adminData;
RechargeBean rechargeBean;
- Intent intent;
-
+ // Intent intent;
+ Tag mTag;
RegisteredCard registeredCard;
CleanUserCard cleanUserCard;
@@ -192,7 +193,7 @@
*/
private void checkHasUser() {
- String cardType = NfcReadHelper.getInstence(intent).getCradType();
+ String cardType = NfcReadHelper.getInstence(mTag).getCradType();
Log.i("NFCWreatActivity", "cardType=" + cardType);
if (cardType.equals(MyCommon.USER_CARD_TYPE_1) ||
cardType.equals(MyCommon.USER_CARD_TYPE_2) ||
@@ -221,32 +222,32 @@
|| configurationPowerCard != null) {
if (userCard != null && TextUtils.isEmpty(morny)) {
- userFlag = WriteCardUtils.setUser(intent, userCard);
+ userFlag = WriteCardUtils.setUser(mTag, userCard);
}
if (cleanCard != null) {
- NFCWriteHelper.getInstence(intent).changePasword(1);
- setClean(intent, cleanCard);
+ NFCWriteHelper.getInstence(mTag).changePasword(1);
+ setClean(mTag, cleanCard);
}
if (manageCard != null) {
- setmanageCard(intent, manageCard);
+ setmanageCard(mTag, manageCard);
}
if (registeredCard != null) {
- setRegisteredCard(intent, registeredCard);
+ setRegisteredCard(mTag, registeredCard);
}
if (cleanUserCard != null) {
- setCleanUserCard(intent, cleanUserCard);
+ setCleanUserCard(mTag, cleanUserCard);
}
if (domainCard != null) {
- setDomainCard(intent, domainCard);
+ setDomainCard(mTag, domainCard);
}
if (testCard != null) {
- setTestCard(intent, testCard);
+ setTestCard(mTag, testCard);
}
if (configureDeviceRegistrationCrad != null) {
- setConfigDeviceRegiest(intent, configureDeviceRegistrationCrad);
+ setConfigDeviceRegiest(mTag, configureDeviceRegistrationCrad);
}
if (configurationPowerCard != null) {
- setConfigurationPower(intent, configurationPowerCard);
+ setConfigurationPower(mTag, configurationPowerCard);
}
if ((configPowerFlag || configDeviceRegiestFlag || testCardFlag || domainCrdFlag || userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag || cleanUserCardFlag)) {
try {
@@ -290,11 +291,12 @@
}
}
+
@Override
- public void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
+ public void physicalCardDoing(Tag tag) {
+ super.physicalCardDoing(tag);
+ mTag = tag;
try {
- this.intent = intent;
startAnim();
Log.i("NFCWreatActivity", "isUser:" + isUser);
if (isUser) {
@@ -313,6 +315,12 @@
e.printStackTrace();
CrashReport.postCatchedException(e);
}
+ }
+
+ @Override
+ public void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+
}
@@ -408,7 +416,7 @@
userCard.setRechargeTimes(userCard.getRechargeTimes() + 1);
} else if ("01".equalsIgnoreCase(state)) {
userCard.setState("01");
- userFlag = WriteCardUtils.setUser(intent, userCard);
+ userFlag = WriteCardUtils.setUser(mTag, userCard);
NFCWreatActivity.this.finish();
TipUtil.show("鍏呭�兼姤鏂囬敊璇�-绂佺敤");
} else if ("02".equalsIgnoreCase(state)) {
@@ -444,12 +452,12 @@
//寰�鍗″唴鍐欏厖鍊煎悗鐨勬暟鎹�
private void rechargeWrratCard() {
- UserCard userCardold = NfcReadHelper.getInstence(intent).getUserCardData();
+ UserCard userCardold = NfcReadHelper.getInstence(mTag).getUserCardData();
if (userCardold != null) {
//鍒ゆ柇鏄惁鍏呭�肩殑鏄竴涓崱
if (userCard.getInitPeasantCode().equals(userCardold.getInitPeasantCode())) {
userCard.setState("00");
- userFlag = WriteCardUtils.setUser(intent, userCard);
+ userFlag = WriteCardUtils.setUser(mTag, userCard);
// 鎵撳嵃鐩稿叧
if (userFlag) {
setPrinterData(rechargeBean);
@@ -465,7 +473,7 @@
}
}
- private void setmanageCard(Intent intent, final ManageCard manageCard) {
+ private void setmanageCard(Tag intent, final ManageCard manageCard) {
manageCardFlag = NFCWriteHelper.getInstence(intent).writeData(manageCard.toZeroByte(), 1, 0);
}
@@ -475,7 +483,7 @@
* @param intent
* @param clearOrInitCard
*/
- private void setClean(Intent intent, final CleanCard clearOrInitCard) {
+ private void setClean(Tag intent, final CleanCard clearOrInitCard) {
cleanFlag = NFCWriteHelper.getInstence(intent).writeData(clearOrInitCard.toByte(), 1, 0);
}
@@ -486,7 +494,7 @@
* @param intent
* @param registeredCard
*/
- private void setRegisteredCard(Intent intent, RegisteredCard registeredCard) {
+ private void setRegisteredCard(Tag intent, RegisteredCard registeredCard) {
registeredFlag = NFCWriteHelper.getInstence(intent).writeData(registeredCard.toByte(), 1, 0);
}
@@ -496,7 +504,7 @@
* @param intent
* @param cleanUserCard
*/
- private void setCleanUserCard(Intent intent, CleanUserCard cleanUserCard) {
+ private void setCleanUserCard(Tag intent, CleanUserCard cleanUserCard) {
cleanUserCardFlag = NFCWriteHelper.getInstence(intent).writeData(cleanUserCard.toByte(), 1, 0);
}
@@ -506,7 +514,7 @@
* @param intent
* @param domainCard
*/
- private void setDomainCard(Intent intent, DomainCard domainCard) {
+ private void setDomainCard(Tag intent, DomainCard domainCard) {
try {
domainCrdFlag = NFCWriteHelper.getInstence(intent).writeData(domainCard.getZeroByte(), 1, 0);
if (!domainCrdFlag) {
@@ -523,16 +531,16 @@
}
}
- private void setTestCard(Intent intent, TestCard testCard) {
+ private void setTestCard(Tag intent, TestCard testCard) {
testCardFlag = NFCWriteHelper.getInstence(intent).writeData(testCard.toByte(), 1, 0);
}
- private void setConfigDeviceRegiest(Intent intent, ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad) {
+ private void setConfigDeviceRegiest(Tag intent, ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad) {
configDeviceRegiestFlag = NFCWriteHelper.getInstence(intent).writeData(configureDeviceRegistrationCrad.toByte(), 1, 0);
}
- private void setConfigurationPower(Intent intent, ConfigurationPowerCard configurationPowerCard) {
+ private void setConfigurationPower(Tag intent, ConfigurationPowerCard configurationPowerCard) {
try {
configPowerFlag = NFCWriteHelper.getInstence(intent).writeData(configurationPowerCard.toByte(), 1, 0);
} catch (Exception e) {
@@ -611,7 +619,7 @@
userCard.setBalance(balance);
userCard.setState("00");
//琛ュ崱閫昏緫
- userFlag = WriteCardUtils.setUser(intent, userCard);
+ userFlag = WriteCardUtils.setUser(mTag, userCard);
if (userFlag) {
TipUtil.show(NFCWreatActivity.this, "琛ュ崱鎴愬姛", new TipUtil.TipListener() {
@Override
@@ -625,7 +633,7 @@
stateText.append("绂佺敤");
userCard.setState("01");
userCard.setBalance(balance);
- userFlag = WriteCardUtils.setUser(intent, userCard);
+ userFlag = WriteCardUtils.setUser(mTag, userCard);
startDetailActivity(name, stateText.toString());
} else if ("02".equals(state)) {
@@ -660,8 +668,9 @@
}
}
+
protected void onDestroy() {
super.onDestroy();
- nfcWreatActivity=null;
+ nfcWreatActivity = null;
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java b/app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
index 964df1c..b3db5ac 100644
--- a/app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
+++ b/app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
@@ -2,6 +2,7 @@
import android.content.Intent;
import android.nfc.NfcAdapter;
+import android.nfc.Tag;
import android.os.Bundle;
import android.os.Message;
import android.view.LayoutInflater;
@@ -57,7 +58,8 @@
volatile UserCard userCard;
ActivityRedCardBinding redCardBinding;
- Intent intent;
+ // Intent intent;
+ Tag mTag;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -73,7 +75,7 @@
redCardBinding.redRemainderBlance.setText("鍓╀綑閲戦锛�" + MornyUtil.changeF2Y(blance) + "鍏�");
redCardBinding.redStatu.setText("鍗$姸鎬侊細" + statu);
if (userCard != null) {
- redCardBinding.redInitCode.setText( userCard.getInitPeasantCode());
+ redCardBinding.redInitCode.setText(userCard.getInitPeasantCode());
Calendar calendar = userCard.getRechargeDate();
if (calendar != null) {
int year = calendar.get(Calendar.YEAR);
@@ -91,14 +93,20 @@
}
}
+ @Override
+ public void physicalCardDoing(Tag tag) {
+ super.physicalCardDoing(tag);
+ mTag = tag;
+ ProgressDialog.show(this);
+
+ readAllData(tag);
+
+ }
@Override
public void onNewIntent(Intent intent) {
- this.intent = intent;
- ProgressDialog.show(this);
- if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
- readAllData(intent);
- }
+// this.intent = intent;
+
super.onNewIntent(intent);
}
@@ -106,7 +114,7 @@
* 璇诲彇鍏ㄩ儴鏁版嵁
*/
- public void readAllData(Intent intent) {
+ public void readAllData(Tag intent) {
NfcReadHelper.getInstence(intent)
.getOneSectorData(new NfcReadHelper.NFCCallListback() {
@Override
@@ -252,12 +260,12 @@
userCard.setBalance(balance);
userCard.setState("00");
- WriteCardUtils.setUser(intent, userCard);
+ WriteCardUtils.setUser(mTag, userCard);
stateText.append("鍚敤");
} else if ("01".equals(state)) {
userCard.setBalance(balance);
userCard.setState("01");
- WriteCardUtils.setUser(intent, userCard);
+ WriteCardUtils.setUser(mTag, userCard);
stateText.append("绂佺敤");
} else if ("02".equals(state)) {
stateText.append("闅跺睘淇℃伅涓嶇");
diff --git a/app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java b/app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
index 5895e71..4e938ca 100644
--- a/app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
@@ -1,6 +1,7 @@
package com.dayu.recharge.activity;
import android.content.Intent;
+import android.nfc.Tag;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
@@ -37,7 +38,7 @@
*/
public class RechargeActivity extends BaseNfcActivity {
- Intent intent;
+// Intent intent;
boolean userFlag;
ActivityRechargeBinding binding;
@@ -46,6 +47,7 @@
AdminDataBean adminData;
String userName;
+ Tag mTag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -61,10 +63,30 @@
}
}
+
+ @Override
+ public void physicalCardDoing(Tag tag) {
+ super.physicalCardDoing(tag);
+ try {
+ mTag=tag;
+ userCard = NfcReadHelper.getInstence(tag).getUserCardData();
+ if (userCard != null) {
+ ProgressDialog.show(this);
+ selectBalance(userCard.getInitPeasantCode());
+ } else {
+ TipUtil.show(RechargeActivity.this, "鍗$墖璇诲彇澶辫触");
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ CrashReport.postCatchedException(e);
+ }
+ }
+
public void onNewIntent(Intent intent) {
try {
- this.intent = intent;
+// this.intent = intent;
userCard = NfcReadHelper.getInstence(intent).getUserCardData();
if (userCard != null) {
ProgressDialog.show(this);
@@ -213,7 +235,7 @@
stateText.append("璇ュ崱宸茶绂佺敤");
userCard.setState("01");
userCard.setBalance(balance);
- userFlag = WriteCardUtils.setUser(intent, userCard);
+ userFlag = WriteCardUtils.setUser(mTag, userCard);
} else if ("02".equals(state)) {
stateText.append("闅跺睘淇℃伅涓嶇");
} else if ("03".equals(state)) {
diff --git a/app/src/main/java/com/dayu/recharge/tools/LoyaltyCardReader.java b/app/src/main/java/com/dayu/recharge/tools/LoyaltyCardReader.java
index b80f6d7..8e8fedd 100644
--- a/app/src/main/java/com/dayu/recharge/tools/LoyaltyCardReader.java
+++ b/app/src/main/java/com/dayu/recharge/tools/LoyaltyCardReader.java
@@ -16,9 +16,11 @@
package com.dayu.recharge.tools;
import android.annotation.TargetApi;
+import android.app.Activity;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.IsoDep;
+import android.nfc.tech.MifareClassic;
import android.os.Build;
import android.util.Log;
@@ -45,14 +47,21 @@
// Weak reference to prevent retain loop. mAccountCallback is responsible for exiting
// foreground mode before it becomes invalid (e.g. during onPause() or onStop()).
- private WeakReference<AccountCallback> mAccountCallback;
+ private AccountCallback mAccountCallback;
+
+ Activity mActivity;
public interface AccountCallback {
- public void onAccountReceived(Tag tag);
+ //瀹炰綋鍗″洖璋�
+ public void physicalCardDoing(Tag tag);
+
+ //铏氭嫙鍗″洖璋�
+ public void virtualCardDoing(Tag tag);
}
- public LoyaltyCardReader(AccountCallback accountCallback) {
- mAccountCallback = new WeakReference<AccountCallback>(accountCallback);
+ public LoyaltyCardReader(Activity activity, AccountCallback accountCallback) {
+ mActivity = activity;
+ mAccountCallback = accountCallback;
}
/**
@@ -65,44 +74,54 @@
@Override
public void onTagDiscovered(Tag tag) {
Log.i(TAG, "New tag discovered");
- mAccountCallback.get().onAccountReceived(tag);
- // Android's Host-based Card Emulation (HCE) feature implements the ISO-DEP (ISO 14443-4)
- // protocol.
- //
- // In order to communicate with a device using HCE, the discovered tag should be processed
- // using the IsoDep class.
- IsoDep isoDep = IsoDep.get(tag);
- if (isoDep != null) {
- try {
- // Connect to the remote NFC device
- isoDep.connect();
- // Build SELECT AID command for our loyalty card service.
- // This command tells the remote device which service we wish to communicate with.
- Log.i(TAG, "Requesting remote AID: " + SAMPLE_LOYALTY_CARD_AID);
-// mAccountCallback.get().onAccountReceived();
- byte[] command = BuildSelectApdu(SAMPLE_LOYALTY_CARD_AID);
-
- // Send command to remote device
- Log.i(TAG, "Sending: " + ByteArrayToHexString(command));
-// mAccountCallback.get().onAccountReceived();
- byte[] result = isoDep.transceive(command);
- // If AID is successfully selected, 0x9000 is returned as the status word (last 2
- // bytes of the result) by convention. Everything before the status word is
- // optional payload, which is used here to hold the account number.
- int resultLength = result.length;
- byte[] statusWord = {result[resultLength - 2], result[resultLength - 1]};
- byte[] payload = Arrays.copyOf(result, resultLength - 2);
- if (Arrays.equals(SELECT_OK_SW, statusWord)) {
- // The remote NFC device will immediately respond with its stored account number
- String accountNumber = new String(payload, "UTF-8");
- Log.i(TAG, "Received: " + accountNumber);
- // Inform CardReaderFragment of received account number
-// mAccountCallback.get().onAccountReceived();
+ MifareClassic mifareClassic= MifareClassic.get(tag);
+ //鏅�歁1鍗�
+ if (mifareClassic!=null){
+ mActivity.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mAccountCallback.physicalCardDoing(tag);
}
- } catch (IOException e) {
- Log.e(TAG, "Error communicating with card: " + e.toString());
+ });
+ }else {
+ // Android 鐨勫熀浜庝富鏈虹殑鍗′豢鐪� 锛圚CE锛� 鍔熻兘瀹炵幇浜� ISO-DEP 锛圛SO 14443-4锛� 鍗忚銆備负浜嗕娇鐢� HCE 涓庤澶囬�氫俊锛屽簲浣跨敤 IsoDep 绫诲鐞嗗彂鐜扮殑鏍囪銆�
+ IsoDep isoDep = IsoDep.get(tag);
+ if (isoDep != null) {
+ try {
+ // Connect to the remote NFC device
+ isoDep.connect();
+ // Build SELECT AID command for our loyalty card service.
+ // This command tells the remote device which service we wish to communicate with.
+ Log.i(TAG, "Requesting remote AID: " + SAMPLE_LOYALTY_CARD_AID);
+// mAccountCallback.get().onAccountReceived();
+ byte[] command = BuildSelectApdu(SAMPLE_LOYALTY_CARD_AID);
+
+ // Send command to remote device
+ Log.i(TAG, "Sending: " + ByteArrayToHexString(command));
+// mAccountCallback.get().onAccountReceived();
+ byte[] result = isoDep.transceive(command);
+ // If AID is successfully selected, 0x9000 is returned as the status word (last 2
+ // bytes of the result) by convention. Everything before the status word is
+ // optional payload, which is used here to hold the account number.
+ int resultLength = result.length;
+ byte[] statusWord = {result[resultLength - 2], result[resultLength - 1]};
+ byte[] payload = Arrays.copyOf(result, resultLength - 2);
+ if (Arrays.equals(SELECT_OK_SW, statusWord)) {
+ // The remote NFC device will immediately respond with its stored account number
+ String accountNumber = new String(payload, "UTF-8");
+ Log.i(TAG, "Received: " + accountNumber);
+ // Inform CardReaderFragment of received account number
+// mAccountCallback.get().onAccountReceived();
+ }
+ } catch (IOException e) {
+ Log.e(TAG, "Error communicating with card: " + e.toString());
+ }
}
}
+
+
+
+
}
/**
diff --git a/app/src/main/java/com/dayu/recharge/tools/NFCUtil.java b/app/src/main/java/com/dayu/recharge/tools/NFCUtil.java
new file mode 100644
index 0000000..d859fa2
--- /dev/null
+++ b/app/src/main/java/com/dayu/recharge/tools/NFCUtil.java
@@ -0,0 +1,100 @@
+package com.dayu.recharge.tools;
+
+import android.app.Activity;
+import android.content.Context;
+import android.nfc.NfcAdapter;
+import android.nfc.Tag;
+import android.util.Log;
+import android.widget.Toast;
+
+/**
+ * Created by Android Studio.
+ * author: zuo
+ * Date: 2023-11-30
+ * Time: 10:27
+ * 澶囨敞锛�
+ */
+public class NFCUtil {
+ static String TAG = "NFCUtil";
+ static NFCUtil nfcUtil;
+ static NfcAdapter mNfcAdapter;
+ public static int READER_FLAGS =
+ NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK;
+ private static boolean isOpen = false;
+
+ LoyaltyCardReader.AccountCallback accountCallback;
+
+ public void setAccountCallback(LoyaltyCardReader.AccountCallback accountCallback) {
+ this.accountCallback = accountCallback;
+ }
+
+ /**
+ * 鑾峰彇NFC鐨勫崟渚�
+ *
+ * @return NfcUtils
+ */
+ public static NFCUtil getInstance() {
+ if (nfcUtil == null) {
+ synchronized (NFCUtil.class) {
+ if (nfcUtil == null) {
+ nfcUtil = new NFCUtil();
+ }
+ }
+ }
+ return nfcUtil;
+ }
+
+ /**
+ * 鍦╫nStart涓娴嬫槸鍚︽敮鎸乶fc鍔熻兘
+ *
+ * @param context 褰撳墠椤甸潰涓婁笅鏂�
+ */
+ public void onStartNfcAdapter(Activity context) {
+ mNfcAdapter = NfcAdapter.getDefaultAdapter(context);//璁惧鐨凬fcAdapter瀵硅薄
+ if (mNfcAdapter == null) {//鍒ゆ柇璁惧鏄惁鏀寔NFC鍔熻兘
+ Toast.makeText(context, "璁惧涓嶆敮鎸丯FC鍔熻兘!", Toast.LENGTH_SHORT).show();
+ context.finish();
+ return;
+ }
+ if (!mNfcAdapter.isEnabled()) {//鍒ゆ柇璁惧NFC鍔熻兘鏄惁鎵撳紑
+ Toast.makeText(context, "璇峰埌绯荤粺璁剧疆涓墦寮�NFC鍔熻兘!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+ Log.d(TAG, "NFC is start");
+ }
+
+ /**
+ * 鍦╫nResume涓紑鍚痭fc鍔熻兘
+ *
+ * @param activity
+ */
+ public void onResumeNfcAdapter(Activity activity) {
+ if (mNfcAdapter != null && mNfcAdapter.isEnabled()) {
+// mNfcAdapter.enableForegroundDispatch(this,mPendingIntent,null,null);//鎵撳紑鍓嶅彴鍙戝竷绯荤粺锛屼娇椤甸潰浼樹簬鍏跺畠nfc澶勭悊.褰撴娴嬪埌涓�涓猅ag鏍囩灏变細鎵цmPendingItent
+ if (!isOpen)
+ mNfcAdapter.enableReaderMode(activity, new LoyaltyCardReader(activity, accountCallback),
+ READER_FLAGS,
+ null);
+ isOpen = true;
+ Log.d(TAG, "Resume");
+ }
+ }
+
+ /**
+ * 鍦╫nPause涓叧闂璶fc鍔熻兘
+ *
+ * @param activity
+ */
+ public void onPauseNfcAdapter(Activity activity) {
+ if (mNfcAdapter != null && mNfcAdapter.isEnabled()) {
+ if (isOpen)
+ mNfcAdapter.disableReaderMode(activity);
+ isOpen = false;
+ }
+ Log.d("myNFC", "onPause");
+ }
+
+
+
+
+}
diff --git a/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java b/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
index 1dc2d29..8b6ef9f 100644
--- a/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
+++ b/app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java
@@ -32,8 +32,8 @@
private static NFCWriteHelper helper;
private static int PASSWORD_LENTH = 12;
- public NFCWriteHelper(Intent intent) {
- this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
+ public NFCWriteHelper(Tag intent) {
+ this.tag = intent;
}
/**
@@ -42,7 +42,7 @@
* @param intent
* @return
*/
- public static NFCWriteHelper getInstence(Intent intent) {
+ public static NFCWriteHelper getInstence(Tag intent) {
if (helper == null) {
helper = new NFCWriteHelper(intent);
}
diff --git a/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java b/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
index 650415d..5b9747f 100644
--- a/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
+++ b/app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java
@@ -24,13 +24,13 @@
*/
public class NfcReadHelper extends BaseNFCHelper {
- private Tag tag;
+ private Tag mTag;
// private NFCCallback callback;
private static NfcReadHelper helper;
public NfcReadHelper(Intent intent) {
- this.tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
+ this.mTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}
@@ -48,6 +48,23 @@
}
/**
+ * 鍗曚緥鍒濆鍖�
+ *
+ * @param intent
+ * @return
+ */
+ public static NfcReadHelper getInstence(Tag tag) {
+ if (helper == null) {
+ helper = new NfcReadHelper(tag);
+ }
+ return helper;
+ }
+
+ public NfcReadHelper(Tag tag) {
+ mTag = tag;
+ }
+
+ /**
* 鑾峰彇鐢ㄦ埛鍗′俊鎭�
*
* @return
@@ -55,7 +72,7 @@
public UserCard getUserCardData() {
UserCard userCard = null;
Map<String, List<byte[]>> map = new HashMap<>();
- MifareClassic mfc = MifareClassic.get(tag);
+ MifareClassic mfc = MifareClassic.get(mTag);
if (null != mfc) {
try {
//閾炬帴NFC
@@ -113,7 +130,7 @@
public String getCradType() {
- MifareClassic mfc = MifareClassic.get(tag);
+ MifareClassic mfc = MifareClassic.get(mTag);
if (null != mfc) {
try {
mfc.connect();
@@ -154,7 +171,7 @@
*/
public void getAllData(final NFCCallMapback callback) {
Map<String, List<byte[]>> map = new HashMap<>();
- MifareClassic mfc = MifareClassic.get(tag);
+ MifareClassic mfc = MifareClassic.get(mTag);
if (null != mfc) {
try {
//閾炬帴NFC
@@ -225,7 +242,7 @@
MifareClassic mfc = null;
try {
- mfc = MifareClassic.get(tag);
+ mfc = MifareClassic.get(mTag);
} catch (Exception e) {
e.printStackTrace();
}
@@ -295,7 +312,7 @@
@Override
public void run() {
Map<String, List<String>> map = new HashMap<>();
- MifareClassic mfc = MifareClassic.get(tag);
+ MifareClassic mfc = MifareClassic.get(mTag);
if (null != mfc) {
try {
mfc.connect();
diff --git a/app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java b/app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java
index 8409f34..a76e5c1 100644
--- a/app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java
+++ b/app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java
@@ -1,6 +1,7 @@
package com.dayu.recharge.tools;
import android.content.Intent;
+import android.nfc.Tag;
import com.dayu.recharge.card.UserCard;
@@ -15,7 +16,7 @@
static boolean userFlag = false;
//鍚戝崱鍐欏叆鐢ㄦ埛淇℃伅
- public static boolean setUser(Intent intent, UserCard userCard) {
+ public static boolean setUser(Tag intent, UserCard userCard) {
userFlag = NFCWriteHelper.getInstence(intent).writeData(userCard.getZeroBytes(), 1, 0);
if (!userFlag) {
return false;
--
Gitblit v1.8.0