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