左晓为主开发手持机充值管理机
zuoxiao
1 天以前 4ceacd9e21e09989287e8dc4e526d182091af282
feat(nfc): 优化 NFC卡片处理流程

- 添加卡片读取和写入的错误处理
- 实现卡片初始化功能- 优化现有卡片处理逻辑- 添加自动打印功能
- 修改充值相关活动和片段
9个文件已修改
512 ■■■■ 已修改文件
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/BaseApplication.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
generallibrary/src/main/res/layout/activity_manager_read.xml 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -482,6 +482,8 @@
                        Log.i("NFCWreatActivity", "hex===" + hex);
                        return hex.toUpperCase();
                    }
                }else {
                    return BaseCommon.CARD_TYPE_ERROR2;
                }
            } catch (IOException e) {
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcWriteHelper.java
@@ -356,10 +356,35 @@
            }
            try {
                // 连接NFC
                if (isConnect) {
                    mfc.connect();
                // 连接NFC - 确保总是建立连接,增加重试机制
                int retryCount = 3;
                boolean connected = false;
                while (retryCount > 0 && !connected) {
                    try {
                        if (!mfc.isConnected()) {
                            mfc.connect();
                        }
                        connected = mfc.isConnected();
                        if (!connected) {
                            Thread.sleep(100); // 短暂等待后重试
                            retryCount--;
                        }
                    } catch (Exception e) {
                        retryCount--;
                        if (retryCount <= 0) {
                            throw e;
                        }
                        Thread.sleep(100);
                    }
                }
                if (!connected) {
                    if (callBack != null) {
                        callBack.isSusses(false, "NFC连接失败,请重新靠近卡片");
                    }
                    return false;
                }
                for (int i = 0; i < passWord.size(); i++) {
                    byte[] passWordItem = passWord.get(i);
                    // 验证扇区密码
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NfcWriteAdapter.java
@@ -79,7 +79,7 @@
    }
    @Override
    public boolean writeData(byte[] str, int a, int b, boolean isConnect, NFCCallBack callBack) {
    public boolean  writeData(byte[] str, int a, int b, boolean isConnect, NFCCallBack callBack) {
        switch (BaseNfcActivity.adapterType) {
            case ModelUtils.defaultType:
                return nativeNfcWriteHelper.writeData(str, a, b, isConnect, callBack);
generallibrary/src/main/java/com/dayu/general/BaseApplication.kt
@@ -35,6 +35,9 @@
        var projectDataDao: ProjectDataDao? = null
        @JvmStatic
        fun getInstance(application: Application): BaseApplication {
            if (myApplication == null) {
generallibrary/src/main/java/com/dayu/general/activity/CardWriteSuccessActivity.kt
@@ -1,7 +1,10 @@
package com.dayu.general.activity
import android.os.Bundle
import com.dayu.baselibrary.tools.print.PrintAdater
import com.dayu.baselibrary.utils.DateUtil
import com.dayu.baselibrary.utils.MornyUtil
import com.dayu.general.BaseApplication
import com.dayu.general.bean.card.UserCard
import com.dayu.general.databinding.ActivityCardWriteSuccessBinding
import com.dayu.general.tool.CardOperationType
@@ -15,8 +18,22 @@
    private lateinit var binding: ActivityCardWriteSuccessBinding
    private var cardNumber: String? = null
    private var cardAddr: String? = null
    private var operationTypeCode: Int = -1
    private var userCard: UserCard? = null
    private var orderNumber: String? = null
    // 充值相关参数
    private var rechargeAmount = 0.0
    private var bonusAmount = 0.0
    // 其他操作相关参数
    private var refundAmount = 0.0
    private var cardBalance = 0.0
    private var returnAmount = 0.0
    private var deductAmount = 0.0
    private var cardCost = 0.0
    private var reissueAmount = 0.0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
@@ -25,7 +42,22 @@
        // 获取传入的卡号和操作类型
        cardNumber = intent.getStringExtra("cardNumber")
        cardAddr = intent.getStringExtra("cardAddr")
        operationTypeCode = intent.getIntExtra("operationTypeCode", -1)
        orderNumber = intent.getStringExtra("orderNumber")
        // 获取充值相关参数
        rechargeAmount = intent.getDoubleExtra("rechargeAmount", 0.0)
        bonusAmount = intent.getDoubleExtra("bonusAmount", 0.0)
        // 获取其他操作相关参数
        refundAmount = intent.getDoubleExtra("refundAmount", 0.0)
        cardBalance = intent.getDoubleExtra("cardBalance", 0.0)
        returnAmount = intent.getDoubleExtra("returnAmount", 0.0)
        deductAmount = intent.getDoubleExtra("deductAmount", 0.0)
        cardCost = intent.getDoubleExtra("cardCost", 0.0)
        reissueAmount = intent.getDoubleExtra("reissueAmount", 0.0)
        if (intent.hasExtra("userCard")) {
            userCard = intent.getSerializableExtra("userCard") as UserCard
        }
@@ -52,6 +84,11 @@
                    "卡片已成功销卡并清除内容\n卡号:$cardNumber\n该卡片将无法再次使用"
                }
                binding.successMessage.text = message
                // 销卡成功后自动打印
                userCard?.let { card ->
                    doPrint(card)
                }
            }
            CardOperationType.SUPPLEMENT -> {
@@ -68,6 +105,11 @@
                    "卡片返还操作已成功完成\n卡号:$cardNumber\n卡内余额已更新"
                }
                binding.successMessage.text = message
                // 返还成功后自动打印
                userCard?.let { card ->
                    doPrint(card)
                }
            }
            CardOperationType.DeductCard -> {
@@ -84,6 +126,11 @@
                    "卡片补扣操作已成功完成\n卡号:$cardNumber\n卡内余额已更新"
                }
                binding.successMessage.text = message
                // 补扣成功后自动打印
                userCard?.let { card ->
                    doPrint(card)
                }
            }
            CardOperationType.ReplaceCard -> {
@@ -103,10 +150,28 @@
            }
            CardOperationType.Recharge -> {
                binding.titleBar.setCenterText("写卡成功")
                binding.successTitle.text = "写卡成功"
                binding.successMessage.text =
                    "卡内余额已更新为"+MornyUtil.changeF2Y(userCard?.balance?:0.toInt()) +"元"
                binding.titleBar.setCenterText("充值成功")
                binding.successTitle.text = "充值成功"
                val messageBuilder = StringBuilder()
                messageBuilder.append("充值操作已成功完成\n")
                if (rechargeAmount > 0) {
                    messageBuilder.append("充值金额:${String.format("%.2f", rechargeAmount)}元\n")
                }
                if (bonusAmount > 0) {
                    messageBuilder.append("赠送金额:${String.format("%.2f", bonusAmount)}元\n")
                }
                messageBuilder.append("卡内余额:${MornyUtil.changeF2Y(userCard?.balance ?: 0)}元")
                binding.successMessage.text = messageBuilder.toString()
                // 充值成功后自动打印
                userCard?.let { card ->
                    doPrint(card)
                }
            }
            else -> {
@@ -133,4 +198,224 @@
            finish()
        }
    }
    /**
     * 打印充值成功信息到打印机
     * @param userCard 用户卡片信息,包含余额等信息
     * 函数会构建打印数据并调用打印适配器进行打印
     */
    private fun doPrint(userCard: UserCard) {
        try {
            // 创建打印数据列表
            val data: MutableList<String> = ArrayList()
            // 根据操作类型设置不同的打印内容
            val operationType = CardOperationType.fromCode(operationTypeCode)
            when (operationType) {
                CardOperationType.Recharge -> {
                    // 充值打印内容
                    data.add("*****************************")
                    data.add("        充值凭证")
                    data.add("*****************************")
                    // 添加用户编号(从UserCard中获取)
                    if (!userCard.userCode.isNullOrEmpty()) {
                        data.add("用户编号:${userCard.userCode}")
                    }
                    // 添加卡地址
                    val cardAddress = cardNumber ?: cardAddr
                    if (!cardAddress.isNullOrEmpty()) {
                        data.add("卡 地 址:$cardAddress")
                    }
                    // 添加用户编号(从UserCard中获取)
                    if (!userCard.userCode.isNullOrEmpty()) {
                        data.add("用户编号:${userCard.getMyUserCode()}")
                    }
                    // 添加充值金额
                    if (rechargeAmount > 0) {
                        data.add("充值金额:${String.format("%.2f", rechargeAmount)} 元")
                    }
                    // 添加赠送金额
                    if (bonusAmount > 0) {
                        data.add("赠送金额:${String.format("%.2f", bonusAmount)} 元")
                    }
                    // 添加充值后余额
                    data.add("充值后余额:${MornyUtil.changeF2Y(userCard.balance)} 元")
                    // 添加日期信息
                    data.add("日   期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}")
                    // 添加订单号
                    if (!orderNumber.isNullOrEmpty()) {
                        data.add("订单号:$orderNumber")
                    }
                    // 添加设备操作员信息
                    data.add("设备操作员:${BaseApplication.userName}")
                    data.add("*****************************")
                }
                CardOperationType.ReplaceCard -> {
                    // 补卡打印内容
                    data.add("*****************************")
                    data.add("        补卡凭证")
                    data.add("*****************************")
                    val cardAddress = cardNumber ?: cardAddr
                    if (!cardAddress.isNullOrEmpty()) {
                        data.add("卡 地 址:$cardAddress")
                    }
                    if (!userCard.userCode.isNullOrEmpty()) {
                        data.add("用户编号:${userCard.getMyUserCode()}")
                    }
                    if (cardCost > 0) {
                        data.add("工 本 费:${String.format("%.2f", cardCost)} 元")
                    }
                    if (reissueAmount > 0) {
                        data.add("返还金额:${String.format("%.2f", reissueAmount)} 元")
                    }
                    data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元")
                    data.add("日   期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}")
                    if (!orderNumber.isNullOrEmpty()) {
                        data.add("订单号:$orderNumber")
                    }
                    data.add("设备操作员:${BaseApplication.userName}")
                    data.add("*****************************")
                }
                CardOperationType.CancelCard -> {
                    // 销卡打印内容
                    data.add("*****************************")
                    data.add("        销卡凭证")
                    data.add("*****************************")
                    val cardAddress = cardNumber ?: cardAddr
                    if (!cardAddress.isNullOrEmpty()) {
                        data.add("卡 地 址:$cardAddress")
                    }
                    if (!userCard.userCode.isNullOrEmpty()) {
                        data.add("用户编号:${userCard.getMyUserCode()}")
                    }
                    if (refundAmount > 0) {
                        data.add("退款金额:${String.format("%.2f", refundAmount)} 元")
                    }
                    data.add("原卡余额:${String.format("%.2f", cardBalance)} 元")
                    data.add("日   期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}")
                    if (!orderNumber.isNullOrEmpty()) {
                        data.add("订单号:$orderNumber")
                    }
                    data.add("设备操作员:${BaseApplication.userName}")
                    data.add("*****************************")
                }
                 CardOperationType.SUPPLEMENT -> {
                    // 返还打印内容
                    data.add("*****************************")
                    data.add("        返还凭证")
                    data.add("*****************************")
                    val cardAddress = cardNumber ?: cardAddr
                    if (!cardAddress.isNullOrEmpty()) {
                        data.add("卡 地 址:$cardAddress")
                    }
                    if (!userCard.userCode.isNullOrEmpty()) {
                        data.add("用户编号:${userCard.getMyUserCode()}")
                    }
                    if (returnAmount > 0) {
                        data.add("返还金额:${String.format("%.2f", returnAmount)} 元")
                    }
                    data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元")
                    data.add("日   期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}")
                    if (!orderNumber.isNullOrEmpty()) {
                        data.add("订单号:$orderNumber")
                    }
                    data.add("设备操作员:${BaseApplication.userName}")
                    data.add("*****************************")
                }
                CardOperationType.DeductCard -> {
                    // 补扣打印内容
                    data.add("*****************************")
                    data.add("        补扣凭证")
                    data.add("*****************************")
                    val cardAddress = cardNumber ?: cardAddr
                    if (!cardAddress.isNullOrEmpty()) {
                        data.add("卡 地 址:$cardAddress")
                    }
                    if (!userCard.userCode.isNullOrEmpty()) {
                        data.add("用户编号:${userCard.getMyUserCode()}")
                    }
                    if (deductAmount > 0) {
                        data.add("补扣金额:${String.format("%.2f", deductAmount)} 元")
                    }
                    data.add("卡内余额:${MornyUtil.changeF2Y(userCard.balance)} 元")
                    data.add("日   期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}")
                    if (!orderNumber.isNullOrEmpty()) {
                        data.add("订单号:$orderNumber")
                    }
                    data.add("设备操作员:${BaseApplication.userName}")
                    data.add("*****************************")
                }
                else -> {
                    // 其他操作的通用打印内容
                    data.add("*****************************")
                    data.add("        操作凭证")
                    data.add("*****************************")
                    val cardAddress = cardNumber ?: cardAddr
                    if (!cardAddress.isNullOrEmpty()) {
                        data.add("卡 地 址:$cardAddress")
                    }
                    data.add("操作类型:${operationType?.description ?: "未知操作"}")
                    data.add("日   期:${DateUtil.dateToStamp(System.currentTimeMillis(), DateUtil.type2)}")
                    data.add("设备操作员:${BaseApplication.userName}")
                    data.add("*****************************")
                }
            }
            // 设置打印字体大小
            val size = 26f
            // 执行打印操作
            PrintAdater.printText(data, size, true, false)
        } catch (e: Exception) {
            // 打印异常信息
            e.printStackTrace()
            // 可以添加Toast提示用户打印失败
            runOnUiThread {
                com.dayu.baselibrary.utils.ToastUtil.show("打印失败:${e.message}")
            }
        }
    }
generallibrary/src/main/java/com/dayu/general/activity/ManagerReadActivity.kt
@@ -5,6 +5,7 @@
import android.text.Editable
import android.text.TextWatcher
import android.view.View
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.utils.BaseCommon
@@ -18,6 +19,7 @@
import com.dayu.general.tool.BaseCommon.Companion.protocol
import com.dayu.general.tool.CardCommon
import com.dayu.general.tool.NfcReadHelper
import com.dayu.general.tool.NfcWreatHelper
class ManagerReadActivity : BaseNfcActivity() {
@@ -196,16 +198,42 @@
    fun getRemark(): String = viewModel.remark.get() ?: ""
    override fun onNfcBack(intent: Intent) {
        val cardNumber = NfcReadHelper.getInstance(intent, this).getCardNumberNoClose()
        if (cardNumber.isNotEmpty()) {
            val keyList = ArrayList(NfcReadHelper.getInstance(intent, this).getKeyList())
            val nfcHelper = NfcWreatHelper.getInstance(intent, this)
            nfcHelper.setLoadingView(binding.loadingContainer, binding.nfcProgressWheel)
            // 异步修改密码
            nfcHelper.changePSAsync(
                keyList,
                true,  // 修改为true,确保建立NFC连接
                true
            ) { success: Boolean, msg: String? ->
                if (success) {
                    // 隐藏NFC读卡界面
                    if (cardNumber.isNotEmpty() && !cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) {
                        binding.btnNext.visibility = View.VISIBLE
                        binding.dataLayout.visibility = View.VISIBLE
                        binding.scrollReadCard.visibility = View.GONE
                        setCardNumber(cardNumber)
                    } else if (cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) {
                        ToastUtil.show("当前卡密码错误,不是本公司卡")
                    }
                } else {
                    // 密码修改失败,处理错误情况
                    Toast.makeText(
                        this@ManagerReadActivity,
                        "卡片初始化失败:$msg",
                        Toast.LENGTH_LONG
                    ).show()
                }
            }
        }
        // 创建密钥列表的副本,避免ConcurrentModificationException
        // 处理NFC读取结果
        NfcReadHelper.getInstance(intent, this).getCardNumber().let { cardNumber ->
            if (cardNumber.isNotEmpty() && !cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) {
                binding.btnNext.visibility = View.VISIBLE
                binding.dataLayout.visibility = View.VISIBLE
                binding.scrollReadCard.visibility = View.GONE
                setCardNumber(cardNumber)
            } else if (cardNumber.contains(BaseCommon.CARD_TYPE_ERROR2)) {
                ToastUtil.show("当前卡密码错误,不是本公司卡")
            }
        }
    }
@@ -281,7 +309,7 @@
            map["projectNumber"] = projectNumber
        }
        map["protocol"] = protocol
        map["securityCode"]="A0B1C289"
        map["securityCode"] = "A0B1C289"
        // 使用正确的类型参数
        ApiManager.getInstance().requestPostLoading(
generallibrary/src/main/java/com/dayu/general/activity/RechargeDetailActivity.kt
@@ -529,14 +529,18 @@
        bonusAmount: Double
    ) {
        try {
            // 创建UserCard对象用于写卡
            val userCard = UserCard().apply {
                // 设置用户卡信息
                cardInfo?.let { info ->
                    balance = MornyUtil.changeY2F(rechargeResult.balance)
                }
            // 检查是否有传递过来的userCard对象
            val cardToWrite = this.userCard ?: run {
                ToastUtil.show("用户卡信息缺失")
                return
            }
                // 设置其他必要信息
            // 更新传递过来的UserCard对象数据
            cardToWrite.apply {
                // 更新充值后的余额
                balance = MornyUtil.changeY2F(rechargeResult.balance)
                // 更新其他充值相关信息
                projectCode = rechargeResult.projectNo
                waterPrice = MornyUtil.changeY2F(rechargeResult.waterPrice.toString())
                rechargeDate = java.util.Calendar.getInstance()
@@ -548,7 +552,7 @@
                putExtra("cardAddr", cardAddress)
                putExtra("operationTypeCode", CardOperationType.Recharge.code)
                putExtra("orderNumber", rechargeResult.orderNo)
                putExtra("userCard", userCard)
                putExtra("userCard", cardToWrite)
                putExtra("rechargeAmount", rechargeAmount) // 传递充值金额
                putExtra("bonusAmount", bonusAmount) // 传递赠送金额
            }
generallibrary/src/main/java/com/dayu/general/activity/RechargeFragment.kt
@@ -86,8 +86,14 @@
                    return
                }
                if (cardType != CardCommon.USER_CARD_TYPE_1) {
                    showConfirmDialog("该卡片不是用户卡,请使用正确的用户卡进行充值操作。") {
                    if(cardType == CardCommon.USER_CARD_TYPE_2){
                        showConfirmDialog("该卡片已开泵,请关泵后充值。") {
                        }
                    }else{
                        showConfirmDialog("该卡片不是用户卡,请使用正确的用户卡进行充值操作。") {
                        }
                    }
                    return
                }
generallibrary/src/main/res/layout/activity_manager_read.xml
@@ -156,78 +156,109 @@
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:padding="16dp">
                android:orientation="vertical">
                <LinearLayout
                    android:id="@+id/card_read_LL"
                <androidx.cardview.widget.CardView
                    android:id="@+id/nfcContainer"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="center"
                    android:orientation="vertical">
                    android:layout_marginStart="16dp"
                    android:layout_marginTop="24dp"
                    android:layout_marginEnd="16dp"
                    android:layout_marginBottom="24dp"
                    android:visibility="visible"
                    app:cardBackgroundColor="@android:color/white"
                    app:cardCornerRadius="12dp"
                    app:cardElevation="4dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@id/titleBar">
                    <androidx.cardview.widget.CardView
                    <FrameLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_marginBottom="16dp"
                        app:cardCornerRadius="8dp"
                        app:cardElevation="2dp">
                        android:layout_height="match_parent">
                        <RelativeLayout
                        <LinearLayout
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:gravity="center"
                            android:orientation="vertical"
                            android:padding="16dp">
                            <TextView
                                android:id="@+id/tv_title"
                                android:id="@+id/textView"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:layout_marginBottom="100dp"
                                android:gravity="center"
                                android:text="制作管理卡"
                                android:layout_marginTop="20dp"
                                android:textColor="@color/base_blue_bg"
                                android:textSize="@dimen/big_text_size"
                                android:text="请将新卡贴在设备上进行读卡"
                                android:textColor="#333333"
                                android:textSize="18sp"
                                android:textStyle="bold" />
                            <TextView
                                android:id="@+id/tv_subtitle"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/tv_title"
                                android:layout_marginBottom="20dp"
                                android:layout_marginTop="20dp"
                                android:gravity="center"
                                android:text="请将新卡贴在设备上进行读取"
                                android:textColor="#333333"
                                android:textSize="@dimen/text_size"
                                android:text="将进行初始化卡片\n耗时较长请不要移动卡片"
                                android:textColor="@color/base_blue_bg"
                                android:textSize="18sp"
                                android:textStyle="bold" />
                            <ImageView
                                android:id="@+id/iv_nfc"
                                android:layout_width="120dp"
                                android:layout_height="120dp"
                                android:layout_below="@+id/tv_subtitle"
                                android:layout_centerHorizontal="true"
                                android:layout_marginBottom="20dp"
                                android:id="@+id/nfcImageView"
                                android:layout_width="200dp"
                                android:layout_height="200dp"
                                android:layout_marginTop="24dp"
                                android:scaleType="fitCenter"
                                android:src="@mipmap/nfc_write" />
                            <TextView
                                android:id="@+id/tv_tip"
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:layout_below="@+id/iv_nfc"
                                android:layout_marginTop="16dp"
                                android:gravity="center"
                                android:text="读取新卡后将显示原卡信息进行制作管理卡"
                                android:text="请保持手持机和卡片不要移动"
                                android:textColor="#666666"
                                android:textSize="@dimen/new_card_size" />
                                android:textSize="14sp" />
                        </LinearLayout>
                        <RelativeLayout
                            android:id="@+id/loadingContainer"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:background="#80000000"
                            android:visibility="gone">
                            <com.pnikosis.materialishprogress.ProgressWheel
                                android:id="@+id/nfcProgressWheel"
                                android:layout_width="100dp"
                                android:layout_height="100dp"
                                android:layout_centerInParent="true"
                                app:matProg_barColor="@color/base_blue_bg"
                                app:matProg_barWidth="8dp"
                                app:matProg_progressIndeterminate="true"
                                app:matProg_rimColor="#33000000"
                                app:matProg_rimWidth="8dp"
                                app:matProg_spinSpeed="0.5" />
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_below="@id/nfcProgressWheel"
                                android:layout_centerHorizontal="true"
                                android:layout_marginTop="12dp"
                                android:text="正在处理NFC卡片..."
                                android:textColor="#FFFFFF"
                                android:textSize="16sp" />
                        </RelativeLayout>
                    </androidx.cardview.widget.CardView>
                </LinearLayout>
                    </FrameLayout>
                </androidx.cardview.widget.CardView>
            </LinearLayout>
        </ScrollView>
        <TextView
            android:id="@+id/btn_next"
            android:layout_width="match_parent"
@@ -238,10 +269,10 @@
            android:layout_marginBottom="16dp"
            android:background="#4285F4"
            android:gravity="center"
            android:visibility="gone"
            android:text="下一步"
            android:textColor="#FFFFFF"
            android:textSize="16sp" />
            android:textSize="16sp"
            android:visibility="gone" />
    </RelativeLayout>
</layout>