| | |
| | | |
| | | 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实现 |
| | |
| | | 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 |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设置加载动画视图 |
| | | */ |
| | | 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 |
| | | } |
| | | |
| | | /** |
| | | * 获取卡号 |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 获取卡片类型和卡号(异步) |
| | | */ |
| | | 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 |
| | | } |
| | | |
| | | /** |
| | | * 获取卡片类型和卡号 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 读取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) { |
| | |
| | | } 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 |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | /** |
| | | * 读取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) { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 清除所有订阅,防止内存泄漏 |
| | | */ |
| | | fun clearDisposables() { |
| | | compositeDisposable.clear() |
| | | } |
| | | } |