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