From 465c8abaa982fba6868a900d25316c70afc20fb7 Mon Sep 17 00:00:00 2001 From: zuoxiao <470321431@qq.com> Date: 星期三, 18 六月 2025 13:59:46 +0800 Subject: [PATCH] feat(card): 优化销卡功能并添加写卡操作 --- generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 254 insertions(+), 3 deletions(-) diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt index 7f2d7ab..2466055 100644 --- a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt +++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt @@ -2,8 +2,17 @@ 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.dayu.general.bean.card.UserCard +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 +20,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 +30,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 + } /** * 鑾峰彇鍗″彿 @@ -41,16 +129,88 @@ } } + 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 + } + /** * 鑾峰彇鍗$墖绫诲瀷鍜屽崱鍙� */ fun getCardTypeAndCardNumber(): String { return try { - adapter.cradTypeAndCardNumber + adapter.getCradTypeAndCardNumber(7,0,8) } catch (e: Exception) { e.printStackTrace() "" } + } + + /** + * 璇诲彇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) } /** @@ -62,6 +222,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 +260,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 +310,33 @@ } } + /** + * 娓呴櫎鎵�鏈夎闃咃紝闃叉鍐呭瓨娉勬紡 + */ + fun clearDisposables() { + compositeDisposable.clear() + } -} \ No newline at end of file + /** + * 璇诲彇鐢ㄦ埛鍗℃暟鎹� + * @return UserCard瀵硅薄锛屽鏋滆鍙栧け璐ュ垯杩斿洖null + */ + fun getUserCardData(): UserCard? { + return try { + // 鑾峰彇鍩虹鍗℃暟鎹� + val baseCard = adapter.getUserCardData(7,UserCard()) + // 濡傛灉鑾峰彇鎴愬姛涓旀槸UserCard绫诲瀷锛屽垯杩斿洖 + if (baseCard is UserCard) { + baseCard + } else { + null + } + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + +} + -- Gitblit v1.8.0