左晓为主开发手持机充值管理机
zuoxiao
2023-11-30 8e3719a37a6be0c9e244a0160b5f2f3331ca3122
支持虚拟卡读取
8个文件已修改
1个文件已添加
436 ■■■■■ 已修改文件
app/src/main/java/com/dayu/recharge/activity/BaseNfcActivity.java 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/LoyaltyCardReader.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/NFCUtil.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/NFCWriteHelper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/NfcReadHelper.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/dayu/recharge/tools/WriteCardUtils.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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());
        //一旦截获NFC消息,就会通过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();
        }
        //设置处理优于所有其他NFC的处理
        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);
//    }
    /**
     * 检测工作,判断设备的NFC支持情况
     *
     * @return
     */
    protected Boolean ifNFCUse(Activity context) {
        if (mNfcAdapter == null) {
            TipUtil.show(context, "设备不支持NFC!");
            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) {
    }
}
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;
    }
}
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("隶属信息不符");
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)) {
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);
        //普通M1卡
        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 的基于主机的卡仿真 (HCE) 功能实现了 ISO-DEP (ISO 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());
                }
            }
        }
    }
    /**
app/src/main/java/com/dayu/recharge/tools/NFCUtil.java
New file
@@ -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;
    }
    /**
     * 在onStart中检测是否支持nfc功能
     *
     * @param context 当前页面上下文
     */
    public void onStartNfcAdapter(Activity context) {
        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);//设备的NfcAdapter对象
        if (mNfcAdapter == null) {//判断设备是否支持NFC功能
            Toast.makeText(context, "设备不支持NFC功能!", 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");
    }
    /**
     * 在onResume中开启nfc功能
     *
     * @param activity
     */
    public void onResumeNfcAdapter(Activity activity) {
        if (mNfcAdapter != null && mNfcAdapter.isEnabled()) {
//            mNfcAdapter.enableForegroundDispatch(this,mPendingIntent,null,null);//打开前台发布系统,使页面优于其它nfc处理.当检测到一个Tag标签就会执行mPendingItent
            if (!isOpen)
                mNfcAdapter.enableReaderMode(activity, new LoyaltyCardReader(activity, accountCallback),
                        READER_FLAGS,
                        null);
            isOpen = true;
            Log.d(TAG, "Resume");
        }
    }
    /**
     * 在onPause中关闭nfc功能
     *
     * @param activity
     */
    public void onPauseNfcAdapter(Activity activity) {
        if (mNfcAdapter != null && mNfcAdapter.isEnabled()) {
            if (isOpen)
                mNfcAdapter.disableReaderMode(activity);
            isOpen = false;
        }
        Log.d("myNFC", "onPause");
    }
}
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);
        }
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();
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;