左晓为主开发手持机充值管理机
zuoxiao
4 天以前 8b566e47b67d74d1915bc9f2c07204dd1a222197
generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
@@ -2,8 +2,16 @@
import android.app.Activity
import android.content.Intent
import android.view.View
import android.widget.RelativeLayout
import com.dayu.baselibrary.tools.nfc.BaseNfcReadHelper
import com.dayu.baselibrary.tools.nfc.NfcReadAdapter
import com.pnikosis.materialishprogress.ProgressWheel
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.CompositeDisposable
import io.reactivex.rxjava3.disposables.Disposable
import io.reactivex.rxjava3.schedulers.Schedulers
/**
 * NFC读取工具类的Kotlin实现
@@ -11,6 +19,9 @@
class NfcReadHelper private constructor(intent: Intent, activity: Activity) : GeBaseHelper(activity) {
    
    private val adapter: NfcReadAdapter = NfcReadAdapter(intent, activity)
    private val compositeDisposable = CompositeDisposable()
    private var loadingContainer: RelativeLayout? = null
    private var progressWheel: ProgressWheel? = null
    companion object {
        private var helper: NfcReadHelper? = null
@@ -18,16 +29,92 @@
        /**
         * 单例初始化
         */
        @JvmStatic
        fun getInstance(intent: Intent, activity: Activity): NfcReadHelper {
            if (helper == null) {
                helper = NfcReadHelper(intent, activity)
            }
            helper!!.adapter.setIntent(intent)
            return helper!!
        }
    }
    /**
     * 设置加载动画视图
     */
    fun setLoadingView(loadingContainer: RelativeLayout, progressWheel: ProgressWheel) {
        this.loadingContainer = loadingContainer
        this.progressWheel = progressWheel
    }
    /**
     * 显示加载动画
     */
    private fun showLoading() {
        loadingContainer?.let {
            it.visibility = View.VISIBLE
        }
        progressWheel?.let {
            it.spin()
        }
    }
    /**
     * 隐藏加载动画
     */
    private fun hideLoading() {
        loadingContainer?.let {
            it.visibility = View.GONE
        }
        progressWheel?.let {
            it.stopSpinning()
        }
    }
    /**
     * 获取卡号(异步)
     */
    fun getCardNumberAsync(callback: (String) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable {
            getCardNumber()
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback("")
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    /**
     * 获取卡号(不关闭连接,异步)
     */
    fun getCardNumberNoCloseAsync(callback: (String) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable {
            getCardNumberNoClose()
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback("")
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    /**
     * 获取卡号
@@ -39,6 +126,38 @@
            e.printStackTrace()
            ""
        }
    }
    fun getCardNumberNoClose():String{
        return try {
            adapter.cardNumberNoClose
        } catch (e: Exception) {
            e.printStackTrace()
            ""
        }
    }
    /**
     * 获取卡片类型和卡号(异步)
     */
    fun getCardTypeAndCardNumberAsync(callback: (String) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable {
            getCardTypeAndCardNumber()
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback("")
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    /**
@@ -54,6 +173,46 @@
    }
    /**
     * 读取NFC卡的全部信息(异步)
     */
    fun getAllDataAsync(callback: BaseNfcReadHelper.NFCCallMapback) {
        showLoading()
        val disposable = Observable.fromCallable {
            try {
                adapter.getAllData(object : BaseNfcReadHelper.NFCCallMapback {
                    override fun callBack(data: Map<String, List<ByteArray>>) {
                        hideLoading()
                        callback.callBack(data)
                    }
                    override fun error(code: Int) {
                        hideLoading()
                        callback.error(code)
                    }
                })
                true
            } catch (e: Exception) {
                e.printStackTrace()
                false
            }
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ success ->
            if (!success) {
                hideLoading()
                callback.error(-1)
            }
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback.error(-1)
        })
        compositeDisposable.add(disposable)
    }
    /**
     * 读取NFC卡的全部信息
     */
    fun getAllData(callback: BaseNfcReadHelper.NFCCallMapback) {
@@ -62,6 +221,29 @@
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    /**
     * 获取一个扇区的数据(异步)
     */
    fun getOneSectorDataAsync(callback: (List<ByteArray>?) -> Unit): Disposable {
        showLoading()
        val disposable = Observable.fromCallable<Any> {
            getOneSectorData() as Any
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result ->
            hideLoading()
            callback(result as? List<ByteArray>)
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback(null)
        })
        compositeDisposable.add(disposable)
        return disposable
    }
    /**
@@ -77,6 +259,46 @@
    }
    /**
     * 读取NFC卡的特定扇区信息(异步)
     */
    fun getDataAsync(a: Int, b: Int, callback: BaseNfcReadHelper.NFCCallByteback) {
        showLoading()
        val disposable = Observable.fromCallable {
            try {
                adapter.getData(a, b, object : BaseNfcReadHelper.NFCCallByteback {
                    override fun callBack(data: ByteArray) {
                        hideLoading()
                        callback.callBack(data)
                    }
                    override fun error(code: Int) {
                        hideLoading()
                        callback.error(code)
                    }
                })
                true
            } catch (e: Exception) {
                e.printStackTrace()
                false
            }
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ success ->
            if (!success) {
                hideLoading()
                callback.error(-1)
            }
        }, { error ->
            hideLoading()
            error.printStackTrace()
            callback.error(-1)
        })
        compositeDisposable.add(disposable)
    }
    /**
     * 读取NFC卡的特定扇区信息
     */
    fun getData(a: Int, b: Int, callback: BaseNfcReadHelper.NFCCallByteback) {
@@ -87,5 +309,10 @@
        }
    }
    /**
     * 清除所有订阅,防止内存泄漏
     */
    fun clearDisposables() {
        compositeDisposable.clear()
    }
}