TwoVerificationActivity.kt 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927
  1. package com.example.chemical.ui.verify
  2. import android.content.IntentFilter
  3. import android.graphics.Bitmap
  4. import android.hardware.usb.UsbManager
  5. import android.os.Bundle
  6. import android.os.Handler
  7. import android.os.Looper
  8. import android.view.KeyEvent
  9. import android.view.LayoutInflater
  10. import android.view.MotionEvent
  11. import android.view.View
  12. import android.widget.ImageView
  13. import android.widget.TextView
  14. import androidx.core.view.isVisible
  15. import com.bumptech.glide.Glide
  16. import com.bumptech.glide.load.engine.DiskCacheStrategy
  17. import com.bumptech.glide.request.RequestOptions
  18. import com.example.chemical.ChemicalApp
  19. import com.example.chemical.R
  20. import com.example.chemical.comm.Constants
  21. import com.example.chemical.databinding.ActivityTwoVerificationBinding
  22. import com.example.chemical.receiver.OnSerialScanListener
  23. import com.example.chemical.receiver.PortScanHelper
  24. import com.example.chemical.receiver.UsbReceiver
  25. import com.example.chemical.ui.DoubleDialogBean
  26. import com.example.chemical.ui.common.BaseCountDownActivity
  27. import com.example.chemical.utils.*
  28. import com.example.chemical.weidith.CustomDialog
  29. import com.example.chemical.weidith.DoublePeopleDialog
  30. import com.google.zxing.BarcodeFormat
  31. import com.google.zxing.MultiFormatWriter
  32. import com.google.zxing.WriterException
  33. import com.google.zxing.common.BitMatrix
  34. import com.lztek.toolkit.Lztek
  35. import com.rc.core.log.RcLog
  36. import com.rc.httpcore.HttpClient
  37. import com.rc.httpcore.HttpConfig
  38. import com.rc.httpcore.bean.UserValidationBean
  39. import com.rc.httpcore.client.ApiRepository
  40. import com.rc.httpcore.exception.NetException
  41. import com.rc.httpcore.vo.request.FaceCompareReq
  42. import io.fotoapparat.Fotoapparat
  43. import io.fotoapparat.facedetector.processor.FaceDetectorProcessor
  44. import io.fotoapparat.log.fileLogger
  45. import io.fotoapparat.log.logcat
  46. import io.fotoapparat.log.loggers
  47. import io.fotoapparat.selector.back
  48. import io.fotoapparat.selector.front
  49. import org.greenrobot.eventbus.EventBus
  50. import org.greenrobot.eventbus.Subscribe
  51. import org.greenrobot.eventbus.ThreadMode
  52. import retrofit2.HttpException
  53. import java.io.File
  54. import java.net.ConnectException
  55. import java.net.SocketTimeoutException
  56. import java.text.SimpleDateFormat
  57. import java.util.*
  58. //双人认证 整合 可随意调整刷卡扫码人脸业务
  59. class TwoVerificationActivity : BaseCountDownActivity<ActivityTwoVerificationBinding>() {
  60. //扫码需要的
  61. private var mLztek: Lztek? = null
  62. private var mDeviceNum: String? = null //设备唯一标识
  63. private var currentDateTimeOne: String? = null
  64. private var currentDateTimeTwo: String? = null
  65. //人脸识别
  66. private lateinit var mFotoapparat: Fotoapparat
  67. //第二个人
  68. private lateinit var mFotoapparatTwo: Fotoapparat
  69. //刷卡
  70. private var mUsbReceiver: UsbReceiver? = null // 刷卡广播注册
  71. private var mHandleScanEvent = false //当前是否已经获取过 usb返回的参数
  72. private var count = 1 //认证次数
  73. private var mChemicalLevel: Int = 0 //管控类 ·型
  74. private var mTag = 0 //0 新增入库 1 归还废弃空瓶等 2 待入库 3 领用认证需要换api 需要判断不同权限 进行验证通过
  75. private var mVerTyps = 0 //认证方式
  76. private var mUserId: String? = null //第二个人
  77. private var mDoorId: String? = null
  78. private val mDoubleDialogBean = mutableListOf<DoubleDialogBean>() //双人认证 需要显示的
  79. private val handlerUtil = HandlerUtil.getInstance() //所有语音多次提示
  80. private val handlerBackTwo = Handler(Looper.getMainLooper()) //人脸识别认证
  81. private val mHandler = Handler(Looper.getMainLooper()) //扫码查询
  82. private var mCertificationType = 1 //1 人脸+刷卡 2 人脸+扫码 3 刷卡+扫码 4 人脸+刷卡+扫码
  83. private var mVerOne = 1 //第一位 1:人脸 2:刷卡 3:扫码
  84. private var mVerTwo = 1 //第二位 1:人脸 2:刷卡 3:扫码
  85. private var isLogin = false //是否是登陆人
  86. private lateinit var dialogsAut: DoublePeopleDialog
  87. private var timeLeftInSeconds = 2
  88. private var mTvView: TextView? = null
  89. private val handlerBack = Handler(Looper.getMainLooper())
  90. private var mVoiceCount = 1 //认证次数
  91. private lateinit var timeUpdater: TimeUpdater
  92. override fun createViewBinding() =
  93. ActivityTwoVerificationBinding.inflate(LayoutInflater.from(this))
  94. override fun initViews(savedInstanceState: Bundle?) {
  95. super.initViews(savedInstanceState)
  96. try {
  97. SharedPreferencesHelper.clearList(this)
  98. } catch (e: Exception) {
  99. }
  100. viewBinding.deptName.text = "${ChemicalApp.confs!!.deptName}-${ChemicalApp.confs!!.roomNum}"
  101. viewBinding.tvReturn.text = "返回${ChemicalApp.confs!!.backTime}s"
  102. Glide.with(this)
  103. .load("${HttpConfig.API_BASE_IMG_URL}${ChemicalApp.confs!!.circularLogo}")
  104. .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.AUTOMATIC))
  105. .into(viewBinding.image)
  106. val handler = Handler(Looper.getMainLooper())
  107. timeUpdater = TimeUpdater(handler) { currentTime ->
  108. viewBinding.nowTime.text = "$currentTime"
  109. }
  110. // 启动定时更新
  111. timeUpdater.startUpdating()
  112. mTag = intent.getIntExtra("mTag", 0)
  113. mVerTyps = intent.getIntExtra("mVerTyps", 0) //只有某一个认证方法 1:人脸 2:刷卡 3:扫码
  114. mDoorId = intent.getStringExtra("doorId") //柜子id
  115. mChemicalLevel = intent.getIntExtra("chemicalLevel", 0)
  116. mCertificationType = intent.getIntExtra("hides", 0) //组合类型
  117. //扫码数据初始化
  118. mLztek = Lztek.create(this)
  119. val toUpperCase = mLztek!!.ethMac.toUpperCase()
  120. mDeviceNum = toUpperCase.replace(":", "")
  121. currentDateTimeOne = TimesUils.getCurrentDateTime()
  122. Thread.sleep(10)
  123. currentDateTimeTwo = TimesUils.getCurrentDateTime()
  124. var cont =
  125. HttpConfig.API_BASE_QC_URL + "?doorId=${mDoorId}&subId=${ChemicalApp.subjectId!!}&type=12&macId=${mDeviceNum}&code=${currentDateTimeOne}" // 要生成二维码的文本内容
  126. loadQRCodeIntoImageView(cont, 100, 100, viewBinding.imgOne)
  127. var tow =
  128. HttpConfig.API_BASE_QC_URL + "?doorId=${mDoorId}&subId=${ChemicalApp.subjectId!!}&type=12&macId=${mDeviceNum}&code=${currentDateTimeTwo}" // 要生成二维码的文本内容
  129. loadQRCodeIntoImageView(tow, 100, 100, viewBinding.imgRoa)
  130. opCards()
  131. mHandleScanEvent = true
  132. if (mVerTyps == 0) {
  133. RcLog.info("======当前认证方式$mTag")
  134. //初始化UI
  135. when (mCertificationType) {
  136. 1 -> { //人脸+刷卡
  137. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_renlianshibie)
  138. viewBinding.scan.visibility = View.GONE
  139. viewBinding.scanTwo.visibility = View.GONE
  140. fotoapparatOpen()
  141. handlerBackTwo.post(countdownRunnableTwo)
  142. }
  143. 2 -> {//人脸+扫码
  144. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_renlianshibie)
  145. viewBinding.campus.visibility = View.GONE
  146. viewBinding.campusTwo.visibility = View.GONE
  147. fotoapparatOpen()
  148. handlerBackTwo.post(countdownRunnableTwo)
  149. }
  150. 3 -> {//刷卡+扫码
  151. MediaPlayerHelper.playRawMp3(this, R.raw.diyiwei_shua_ka_renzheng)
  152. mHandleScanEvent = false
  153. mVerOne = 2
  154. mVerTwo = 2
  155. viewBinding.viewFace.visibility = View.GONE
  156. viewBinding.tvMsgRob.visibility = View.GONE
  157. viewBinding.viewCard.visibility = View.VISIBLE
  158. viewBinding.viewFaceRoa.visibility = View.GONE
  159. viewBinding.tvMsgRod.visibility = View.GONE
  160. viewBinding.viewCardRoa.visibility = View.VISIBLE
  161. viewBinding.campus.visibility = View.GONE
  162. viewBinding.campusTwo.visibility = View.GONE
  163. viewBinding.tvMsg.text = "请 第 一 位 刷 卡 验 证"
  164. viewBinding.tvMsgRoe.text = "请 第 二 位 刷 卡 验 证"
  165. viewBinding.tvMsgRoa.text = "请在刷卡区域进行刷卡验证"
  166. viewBinding.tvMsgRoc.text = "请在刷卡区域进行刷卡验证"
  167. }
  168. 4 -> {
  169. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_renlianshibie)
  170. replaceOnes()
  171. replaceTwos()
  172. fotoapparatOpen()
  173. handlerBackTwo.post(countdownRunnableTwo)
  174. }
  175. }
  176. } else {
  177. RcLog.info("======当前认证方式$mTag")
  178. when (mVerTyps) {
  179. 1 -> {
  180. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_renlianshibie)
  181. //只有人脸
  182. viewGones()
  183. fotoapparatOpen()
  184. handlerBackTwo.post(countdownRunnableTwo)
  185. }
  186. 2 -> {
  187. MediaPlayerHelper.playRawMp3(this, R.raw.diyiwei_shua_ka_renzheng)
  188. mHandleScanEvent = false
  189. mVerOne = 2
  190. mVerTwo = 2
  191. //只有刷卡
  192. viewBinding.tvMsg.text = "请 第 一 位 刷 卡 验 证"
  193. viewBinding.tvMsgRoa.text = "请在刷卡区域进行刷卡验证"
  194. viewBinding.tvMsgRob.visibility = View.GONE //描述
  195. viewBinding.viewCard.visibility = View.VISIBLE
  196. viewBinding.tvMsgRoe.text = "请 第 二 位 刷 卡 验 证"
  197. viewBinding.tvMsgRoc.text = "请在刷卡区域进行刷卡验证"
  198. viewBinding.tvMsgRod.visibility = View.GONE
  199. viewBinding.viewCardRoa.visibility = View.VISIBLE
  200. viewGones()
  201. viewBinding.viewFace.visibility = View.GONE
  202. viewBinding.viewFaceRoa.visibility = View.GONE
  203. }
  204. 3 -> {
  205. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_saoma)
  206. mVerOne = 3
  207. mVerTwo = 3
  208. //只有扫码
  209. viewBinding.tvMsg.text = "请 第 一 位 扫 码 验 证"
  210. viewBinding.tvMsgRoa.text = "请打开微信扫描屏幕二维码"
  211. viewBinding.tvMsgRob.text = "进行扫码验证"
  212. viewBinding.viewScan.visibility = View.VISIBLE
  213. viewBinding.tvMsgRoe.text = "请 第 二 位 扫 码 验 证"
  214. viewBinding.tvMsgRoc.text = "请打开微信扫描屏幕二维码"
  215. viewBinding.tvMsgRod.text = "进行扫码验证"
  216. viewBinding.viewFace.visibility = View.GONE
  217. viewBinding.viewFaceRoa.visibility = View.GONE
  218. viewBinding.viewScanRoa.visibility = View.VISIBLE
  219. viewGones()
  220. // 在3秒后执行延迟任务
  221. mHandler.postDelayed(delayedTask, 4000)
  222. }
  223. }
  224. }
  225. replaceOnes()
  226. replaceTwos()
  227. viewBinding.tvReturn.setOnClickListener {
  228. finish()
  229. }
  230. handlerUtil.startTask(task, 10000)
  231. }
  232. override fun onBackPressed() {
  233. super.onBackPressed()
  234. finish()
  235. }
  236. //语音提示
  237. private val task = Runnable {
  238. if (mVoiceCount == 6) {
  239. finish()
  240. }
  241. if (count == 1) {
  242. if (mVerTyps == 0) {
  243. //第二个人的操作
  244. when (mVerOne) {
  245. 1 -> {
  246. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_renlianshibie)
  247. }
  248. 2 -> { //刷卡
  249. MediaPlayerHelper.playRawMp3(this, R.raw.diyiwei_shua_ka_renzheng)
  250. }
  251. 3 -> {//扫码
  252. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_saoma)
  253. }
  254. }
  255. } else {
  256. //只有一种认证方式
  257. RcLog.info("======当前认证方式$mTag")
  258. when (mVerTyps) {
  259. 1 -> {
  260. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_renlianshibie)
  261. }
  262. 2 -> {
  263. //只有刷卡
  264. MediaPlayerHelper.playRawMp3(this, R.raw.diyiwei_shua_ka_renzheng)
  265. }
  266. 3 -> {
  267. //只有扫码
  268. MediaPlayerHelper.playRawMp3(this, R.raw.diyiren_saoma)
  269. }
  270. }
  271. }
  272. } else {
  273. if (mVerTyps == 0) {
  274. //第二个人的操作
  275. when (mVerTwo) {
  276. 1 -> { //关闭人脸
  277. MediaPlayerHelper.playRawMp3(this, R.raw.dierwei_renlianshibie)
  278. }
  279. 2 -> { //刷卡
  280. MediaPlayerHelper.playRawMp3(this, R.raw.dierweishuakarenzheng)
  281. }
  282. 3 -> {//扫码
  283. MediaPlayerHelper.playRawMp3(this, R.raw.dierren_saoma)
  284. }
  285. }
  286. } else {
  287. //只有一种认证方式
  288. RcLog.info("======当前认证方式$mTag")
  289. when (mVerTyps) {
  290. 1 -> {
  291. MediaPlayerHelper.playRawMp3(this, R.raw.dierwei_renlianshibie)
  292. }
  293. 2 -> {
  294. //只有刷卡
  295. MediaPlayerHelper.playRawMp3(this, R.raw.dierweishuakarenzheng)
  296. }
  297. 3 -> {
  298. //只有扫码
  299. MediaPlayerHelper.playRawMp3(this, R.raw.shuangren_tongguo)
  300. }
  301. }
  302. }
  303. }
  304. mVoiceCount++
  305. }
  306. override fun onDestroy() {
  307. super.onDestroy()
  308. try {
  309. mPortScanHelper.onPause()
  310. } catch (e: Exception) {
  311. }
  312. try {
  313. timeUpdater.stopUpdating()
  314. } catch (e: Exception) {
  315. }
  316. //关闭语音播报
  317. try {
  318. handlerUtil.removeCallbacks(task)
  319. handlerUtil.stopAllTasks()
  320. } catch (e: Exception) {
  321. }
  322. // 停止定时更新
  323. try {
  324. mFotoapparat.stop()
  325. } catch (e: Exception) {
  326. }
  327. try {
  328. mFotoapparatTwo.stop()
  329. } catch (e: Exception) {
  330. }
  331. try {
  332. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  333. handlerBackTwo.removeCallbacksAndMessages(null)
  334. } catch (e: Exception) {
  335. }
  336. try {
  337. handlerBack.removeCallbacks(countdownRunnable)
  338. handlerBack.removeCallbacksAndMessages(null)
  339. } catch (e: Exception) {
  340. }
  341. try {
  342. EventBus.getDefault().unregister(this) //关闭广播
  343. unregisterReceiver(mUsbReceiver)
  344. } catch (e: Exception) {
  345. }
  346. try {
  347. mHandler.removeCallbacks(delayedTask)
  348. mHandler.removeCallbacksAndMessages(null)
  349. } catch (e: Exception) {
  350. }
  351. }
  352. private fun viewGones() {
  353. viewBinding.lint.visibility = View.GONE
  354. viewBinding.lintTwo.visibility = View.GONE
  355. }
  356. private val countdownRunnableTwo = object : Runnable {
  357. override fun run() {
  358. RcLog.info("=======双人人脸认证中")
  359. takePicture()
  360. handlerBackTwo.postDelayed(this, 4500)
  361. }
  362. }
  363. //验证通过
  364. private fun passThrough() {
  365. //关闭语音播报
  366. try {
  367. handlerUtil.removeCallbacks(task)
  368. handlerUtil.stopAllTasks()
  369. } catch (e: Exception) {
  370. }
  371. //
  372. try {
  373. mHandler.removeCallbacks(delayedTask)
  374. mHandler.removeCallbacksAndMessages(null)
  375. } catch (e: Exception) {
  376. }
  377. // 在需要时关闭定时器
  378. try {
  379. RcLog.info("=====清空双人认证3 人脸信息")
  380. mFotoapparatTwo.stop()
  381. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  382. RcLog.info("=====清空双人认证4 人脸信息")
  383. handlerBackTwo.removeCallbacksAndMessages(null)
  384. } catch (e: Exception) {
  385. }
  386. Constants.AUTHENTICATION = true
  387. // 存储集合到 SharedPreferences
  388. SharedPreferencesHelper.saveList(this, mDoubleDialogBean)
  389. dialogsAut =
  390. DoublePeopleDialog(this, mDoubleDialogBean, object : DoublePeopleDialog.IClickLit {
  391. override fun onUpView(tvView: TextView) {
  392. mTvView = tvView
  393. }
  394. })
  395. dialogsAut.show()
  396. // 开始倒计时
  397. handlerBack.post(countdownRunnable)
  398. // 获取对话框的 Window 对象
  399. dialogsAut?.window?.decorView?.setOnTouchListener { _, event ->
  400. // 判断是否点击了对话框外部空白区域
  401. if (event.action == MotionEvent.ACTION_DOWN) {
  402. val x = event.x
  403. val y = event.y
  404. val dialogView = dialogsAut?.window?.decorView
  405. if (dialogView != null && (x < 0 || x > dialogView.width || y < 0 || y > dialogView.height)) {
  406. // 在此处执行点击对话框外部空白区域时的操作
  407. // 例如关闭对话框
  408. dialogsAut.dismiss()
  409. finish()
  410. return@setOnTouchListener true
  411. }
  412. }
  413. return@setOnTouchListener false
  414. }
  415. MediaPlayerHelper.playRawMp3(this, R.raw.shuangren_tongguo)
  416. }
  417. private val countdownRunnable = object : Runnable {
  418. override fun run() {
  419. if (timeLeftInSeconds > 0) {
  420. mTvView!!.text = "${timeLeftInSeconds}秒后自动返回首页"
  421. timeLeftInSeconds--
  422. handlerBack.postDelayed(this, 1000)
  423. } else {
  424. dialogsAut!!.dismiss()
  425. finish()
  426. }
  427. }
  428. }
  429. private fun callFaceMatchingApi(
  430. featureData: File,
  431. ) {
  432. showLoading("认证中....")
  433. val param = FaceCompareReq().apply {
  434. data = null
  435. subId = ChemicalApp.subjectId
  436. doorId = mDoorId
  437. }
  438. val disposable = ApiRepository.checkUserFaceByPic(featureData, param)
  439. .subscribe({ data ->
  440. dismissLoading()
  441. if (count == 1) {
  442. mUserId = data.userId
  443. RcLog.info("第a一个人 $mUserId ${data.userId}")
  444. } else {
  445. if (mUserId.equals(data.userId) && count == 2) {
  446. customDialogView(0, "不能是同一个人")
  447. return@subscribe
  448. }
  449. }
  450. //0 新增入库 1 领用归还废弃空瓶等 2 待入库 需要判断不同权限 进行验证通过
  451. when (mTag) {
  452. 0 -> {
  453. //新增入库
  454. if (count == 1) {
  455. if (data.userId == ChemicalApp.userData!!.userId) {
  456. isLogin = true
  457. // faceTwo()
  458. customDialog()
  459. var bean =
  460. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  461. mDoubleDialogBean.add(bean)
  462. } else {
  463. if (mChemicalLevel == 1) {
  464. //管控 校级管理员或院级管理
  465. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  466. var bean = DoubleDialogBean(
  467. data.userName,
  468. data.faceImg,
  469. data.userId
  470. )
  471. mDoubleDialogBean.add(bean)
  472. customDialog()
  473. // faceTwo()
  474. } else {
  475. customDialogView(0, "无权限信息")
  476. }
  477. } else {
  478. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  479. // faceTwo()
  480. customDialog()
  481. var bean = DoubleDialogBean(
  482. data.userName,
  483. data.faceImg,
  484. data.userId
  485. )
  486. mDoubleDialogBean.add(bean)
  487. } else {
  488. customDialogView(0, "无权限信息")
  489. }
  490. }
  491. }
  492. } else {
  493. if (isLogin) {
  494. //已经有登陆人
  495. if (mChemicalLevel == 1) {
  496. //管控 校级管理员或院级管理
  497. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  498. var bean = DoubleDialogBean(
  499. data.userName,
  500. data.faceImg,
  501. data.userId
  502. )
  503. mDoubleDialogBean.add(bean)
  504. passThrough()
  505. } else {
  506. customDialogView(0, "无权限信息")
  507. }
  508. } else {
  509. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  510. var bean = DoubleDialogBean(
  511. data.userName,
  512. data.faceImg,
  513. data.userId
  514. )
  515. mDoubleDialogBean.add(bean)
  516. passThrough()
  517. } else {
  518. customDialogView(0, "无权限信息")
  519. }
  520. }
  521. } else {
  522. if (data.userId == ChemicalApp.userData!!.userId) {
  523. var bean =
  524. DoubleDialogBean(
  525. data.userName,
  526. data.faceImg,
  527. data.userId
  528. )
  529. mDoubleDialogBean.add(bean)
  530. passThrough()
  531. } else {
  532. customDialogView(0, "无权限信息")
  533. }
  534. }
  535. }
  536. }
  537. 1 -> { //归还业务 标签管理
  538. if (count == 1) {
  539. if (data.userId == ChemicalApp.userData!!.userId) {
  540. isLogin = true
  541. // faceTwo()
  542. customDialog()
  543. var bean =
  544. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  545. mDoubleDialogBean.add(bean)
  546. } else {
  547. obtainCertification(data)
  548. }
  549. } else {
  550. if (isLogin) {
  551. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  552. var bean =
  553. DoubleDialogBean(
  554. data.userName,
  555. data.faceImg,
  556. data.userId
  557. )
  558. mDoubleDialogBean.add(bean)
  559. passThrough()
  560. } else {
  561. customDialogView(0, "认证失败")
  562. }
  563. } else {
  564. if (data.userId == ChemicalApp.userData!!.userId) {
  565. var bean =
  566. DoubleDialogBean(
  567. data.userName,
  568. data.faceImg,
  569. data.userId
  570. )
  571. mDoubleDialogBean.add(bean)
  572. passThrough()
  573. } else {
  574. customDialogView(0, "认证失败")
  575. }
  576. }
  577. }
  578. }
  579. 2 -> {//待入库
  580. if (count == 1) {
  581. if (data.userId == ChemicalApp.userData!!.userId) {
  582. isLogin = true
  583. // faceTwo()
  584. customDialog()
  585. var bean =
  586. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  587. mDoubleDialogBean.add(bean)
  588. } else {
  589. toBeStored(data)
  590. }
  591. } else {
  592. if (isLogin) {
  593. if (mChemicalLevel == 1) {
  594. //管控
  595. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  596. var bean = DoubleDialogBean(
  597. data.userName,
  598. data.faceImg,
  599. data.userId
  600. )
  601. mDoubleDialogBean.add(bean)
  602. passThrough()
  603. } else {
  604. customDialogView(0, "认证失败")
  605. }
  606. } else {
  607. //非管控 实验室负责人or安全负责人or柜锁管理员
  608. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  609. var bean = DoubleDialogBean(
  610. data.userName,
  611. data.faceImg,
  612. data.userId
  613. )
  614. mDoubleDialogBean.add(bean)
  615. passThrough()
  616. } else {
  617. customDialogView(0, "认证失败")
  618. }
  619. }
  620. } else {
  621. if (data.userId == ChemicalApp.userData!!.userId) {
  622. var bean =
  623. DoubleDialogBean(
  624. data.userName,
  625. data.faceImg,
  626. data.userId
  627. )
  628. mDoubleDialogBean.add(bean)
  629. passThrough()
  630. } else {
  631. customDialogView(0, "认证失败")
  632. }
  633. }
  634. }
  635. }
  636. }
  637. },
  638. { throwable ->
  639. dismissLoading()
  640. // mFotoapparat.stop()
  641. // handlerBack.removeCallbacks(countdownRunnable)
  642. // handlerBack.removeCallbacksAndMessages(null)
  643. throwableView(throwable)
  644. })
  645. addDisposable(disposable)
  646. }
  647. private fun obtainCertification(data: UserValidationBean) {
  648. //校级管理员 schoolLevelAdmin
  649. //院级管理员 collegeAdmin
  650. //实验室负责人 adminUser
  651. //安全负责人 safeUser
  652. //柜锁管理员 cabinetAdmin
  653. //是否化学品归属人 belongUser
  654. //是否化学品归属课题组下成员 toipcUser
  655. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  656. // faceTwo()
  657. customDialog()
  658. var bean = DoubleDialogBean(data.userName, data.faceImg, data.userId)
  659. mDoubleDialogBean.add(bean)
  660. } else {
  661. customDialogView(0, "认证失败")
  662. }
  663. }
  664. private fun toBeStored(data: UserValidationBean) {
  665. //校级管理员 schoolLevelAdmin
  666. //院级管理员 collegeAdmin
  667. //实验室负责人 adminUser
  668. //安全负责人 safeUser
  669. //柜锁管理员 cabinetAdmin
  670. //是否化学品归属人 belongUser
  671. //是否化学品归属课题组下成员 toipcUser
  672. if (mChemicalLevel == 1) {
  673. //管控
  674. if (data.belongUser == true || data.toipcUser == true || data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  675. customDialog()
  676. var bean = DoubleDialogBean(data.userName, data.faceImg, data.userId)
  677. mDoubleDialogBean.add(bean)
  678. } else {
  679. customDialogView(0, "认证失败")
  680. }
  681. } else {
  682. //非管控 实验室负责人or安全负责人or柜锁管理员
  683. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  684. customDialog()
  685. var bean = DoubleDialogBean(data.userName, data.faceImg, data.userId)
  686. mDoubleDialogBean.add(bean)
  687. } else {
  688. customDialogView(0, "认证失败")
  689. }
  690. }
  691. }
  692. // 1 人脸验证通过的 2 刷卡认证通过的 3扫码认证通过的
  693. private fun customDialog() {
  694. count++
  695. //第二个人的操作a
  696. viewBinding.rlView.visibility = View.GONE
  697. viewBinding.rlResult.visibility = View.VISIBLE
  698. if (mVerTyps == 0) {
  699. //当前组合认证 第二个人
  700. RcLog.info("======当前认证方式$mTag")
  701. //第二个人的操作
  702. when (mVerTwo) {
  703. 1 -> { //关闭人脸
  704. MediaPlayerHelper.playRawMp3(this, R.raw.dierwei_renlianshibie)
  705. viewBinding.imgFace.visibility = View.GONE
  706. try {
  707. mFotoapparat.stop()
  708. } catch (e: Exception) {
  709. }
  710. if (::mFotoapparatTwo.isInitialized) {
  711. mFotoapparatTwo.stop()
  712. mFotoapparatTwo.start()
  713. } else {
  714. mFotoapparatTwo = Fotoapparat.with(this)
  715. .into(viewBinding.cameraViewTwo)
  716. .lensPosition(
  717. if (Constants.FACE_TAG == 0) {
  718. front()
  719. } else {
  720. back()
  721. }
  722. )//front()前置 back 后置
  723. .frameProcessor(
  724. FaceDetectorProcessor.with(this)
  725. .listener { faces ->
  726. viewBinding.rectanglesViewTwo.setRectangles(faces)
  727. }.build()
  728. )
  729. .logger(loggers(logcat(), fileLogger(this)))
  730. .build()
  731. mFotoapparatTwo.stop()
  732. mFotoapparatTwo.start()
  733. }
  734. //人脸
  735. when (mVerOne) {
  736. 2 -> {
  737. //关闭刷卡 打开第二个人脸线程
  738. mHandleScanEvent = true
  739. handlerBackTwo.post(countdownRunnableTwo)
  740. }
  741. 3 -> {
  742. //关闭扫码 打开第二个人脸线程
  743. try {
  744. mHandler.removeCallbacks(delayedTask)
  745. mHandler.removeCallbacksAndMessages(null)
  746. } catch (e: Exception) {
  747. }
  748. handlerBackTwo.post(countdownRunnableTwo)
  749. }
  750. }
  751. }
  752. 2 -> { //刷卡
  753. MediaPlayerHelper.playRawMp3(this, R.raw.dierweishuakarenzheng)
  754. mHandleScanEvent = false
  755. when (mVerOne) {
  756. 1 -> {
  757. //关闭人脸
  758. try {
  759. mFotoapparat.stop()
  760. } catch (e: Exception) {
  761. }
  762. try {
  763. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  764. } catch (e: Exception) {
  765. }
  766. try {
  767. handlerBackTwo.removeCallbacksAndMessages(null)
  768. } catch (e: Exception) {
  769. }
  770. // opCards()
  771. }
  772. 2 -> {
  773. RcLog.info("======第一位是刷卡 $mHandleScanEvent")
  774. }
  775. 3 -> {
  776. //关闭扫码
  777. try {
  778. mHandler.removeCallbacks(delayedTask)
  779. mHandler.removeCallbacksAndMessages(null)
  780. } catch (e: Exception) {
  781. }
  782. }
  783. }
  784. }
  785. 3 -> {//扫码
  786. viewBinding.viewScanRoa.visibility = View.VISIBLE
  787. viewBinding.imgRoa.visibility = View.VISIBLE
  788. MediaPlayerHelper.playRawMp3(this, R.raw.dierren_saoma)
  789. mHandleScanEvent = true
  790. when (mVerOne) {
  791. 1 -> {
  792. //关闭人脸
  793. if (::mFotoapparatTwo.isInitialized) {
  794. // mFotoapparat 已经被初始化
  795. mFotoapparatTwo.stop()
  796. try {
  797. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  798. handlerBackTwo.removeCallbacksAndMessages(null)
  799. } catch (e: Exception) {
  800. }
  801. }
  802. try {
  803. mHandler.removeCallbacks(delayedTask)
  804. mHandler.removeCallbacksAndMessages(null)
  805. } catch (e: Exception) {
  806. }
  807. mHandler.postDelayed(delayedTask, 4000)
  808. }
  809. 2 -> {//刷卡
  810. try {
  811. mHandler.removeCallbacks(delayedTask)
  812. mHandler.removeCallbacksAndMessages(null)
  813. } catch (e: Exception) {
  814. }
  815. mHandler.postDelayed(delayedTask, 4000)
  816. }
  817. 3 -> {
  818. //扫码 不需要操作
  819. //关闭人脸
  820. if (::mFotoapparatTwo.isInitialized) {
  821. // mFotoapparat 已经被初始化
  822. mFotoapparatTwo.stop()
  823. try {
  824. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  825. handlerBackTwo.removeCallbacksAndMessages(null)
  826. } catch (e: Exception) {
  827. }
  828. }
  829. }
  830. }
  831. }
  832. }
  833. } else {
  834. //只有一种认证方式
  835. RcLog.info("======当前认证方式$mTag")
  836. when (mVerTyps) {
  837. 1 -> {
  838. MediaPlayerHelper.playRawMp3(this, R.raw.dierwei_renlianshibie)
  839. viewBinding.imgFace.visibility = View.GONE
  840. //只有人脸
  841. try {
  842. mFotoapparat.stop()
  843. } catch (e: Exception) {
  844. }
  845. if (::mFotoapparatTwo.isInitialized) {
  846. mFotoapparatTwo.stop()
  847. mFotoapparatTwo.start()
  848. } else {
  849. mFotoapparatTwo = Fotoapparat.with(this)
  850. .into(viewBinding.cameraViewTwo)
  851. .lensPosition(
  852. if (Constants.FACE_TAG == 0) {
  853. front()
  854. } else {
  855. back()
  856. }
  857. )//front()前置 back 后置
  858. .frameProcessor(
  859. FaceDetectorProcessor.with(this)
  860. .listener { faces ->
  861. viewBinding.rectanglesViewTwo.setRectangles(faces)
  862. }.build()
  863. )
  864. .logger(loggers(logcat(), fileLogger(this)))
  865. .build()
  866. mFotoapparatTwo.stop()
  867. mFotoapparatTwo.start()
  868. }
  869. handlerBackTwo.post(countdownRunnableTwo)
  870. }
  871. 2 -> {
  872. //只有刷卡
  873. MediaPlayerHelper.playRawMp3(this, R.raw.dierweishuakarenzheng)
  874. mHandleScanEvent = false
  875. }
  876. 3 -> {
  877. //只有扫码
  878. MediaPlayerHelper.playRawMp3(this, R.raw.shuangren_tongguo)
  879. }
  880. }
  881. }
  882. }
  883. private fun takePicture() {
  884. val format = SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault())
  885. val fileName = "${format.format(Calendar.getInstance().time)}.jpg"
  886. val photoFile = File(this.getExternalFilesDir("photos"), fileName)
  887. RcLog.info("==========当前认证数 $count")
  888. if (count == 1) {
  889. mFotoapparat.takePicture()
  890. .saveToFile(photoFile)
  891. .whenAvailable {
  892. RcLog.info("=====人脸识别D=${HttpClient.token} $it $photoFile")
  893. callFaceMatchingApi(photoFile)
  894. }
  895. } else {
  896. if (::mFotoapparatTwo.isInitialized) {
  897. mFotoapparatTwo.takePicture()
  898. .saveToFile(photoFile)
  899. .whenAvailable {
  900. RcLog.info("=====人脸识别B=${HttpClient.token}")
  901. callFaceMatchingApi(photoFile)
  902. }
  903. } else {
  904. showToast("第二个人脸初始化失败")
  905. }
  906. }
  907. }
  908. private fun fotoapparatOpen() {
  909. mFotoapparat = Fotoapparat.with(this)
  910. .into(viewBinding.cameraView)
  911. .lensPosition(
  912. if (Constants.FACE_TAG == 0) {
  913. front()
  914. } else {
  915. back()
  916. }
  917. )//front()前置 back 后置
  918. .frameProcessor(
  919. FaceDetectorProcessor.with(this)
  920. .listener { faces ->
  921. RcLog.info("=========认证中")
  922. viewBinding.rectanglesView.setRectangles(faces)
  923. }.build()
  924. )
  925. .logger(loggers(logcat(), fileLogger(this)))
  926. .build()
  927. mFotoapparat.stop()
  928. mFotoapparat.start()
  929. }
  930. //关闭人脸,扫码,线程
  931. private fun closeOneMission() {
  932. try {
  933. mHandler.removeCallbacks(delayedTask)
  934. mHandler.removeCallbacksAndMessages(null)
  935. } catch (e: Exception) {
  936. }
  937. try {
  938. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  939. handlerBackTwo.removeCallbacksAndMessages(null)
  940. mFotoapparat.stop()
  941. } catch (e: Exception) {
  942. }
  943. }
  944. private fun replaceOnes() {
  945. //第一个人 人脸
  946. TextViewDebouncer.setDebouncedOnClickListener(viewBinding.face, 1000L) {
  947. mVerOne = 1
  948. closeOneMission()
  949. mFotoapparat.stop()
  950. mFotoapparat.start()
  951. handlerBackTwo.post(countdownRunnableTwo)
  952. viewBinding.tvMsg.text = "请 第 一 位 人 脸 验 证"
  953. viewBinding.tvMsgRoa.text = "请正对屏幕并使脸位于取景框内"
  954. viewBinding.tvMsgRob.visibility = View.VISIBLE
  955. viewBinding.tvMsgRob.text = "请保持光线充足,避免光照过强或过弱"
  956. viewBinding.viewFace.visibility = View.VISIBLE
  957. viewBinding.face.visibility = View.GONE
  958. if (viewBinding.viewCard.visibility == View.VISIBLE) {
  959. viewBinding.viewCard.visibility = View.GONE
  960. viewBinding.campus.visibility = View.VISIBLE
  961. }
  962. if (viewBinding.viewScan.visibility == View.VISIBLE) {
  963. viewBinding.viewScan.visibility = View.GONE
  964. viewBinding.scan.visibility = View.VISIBLE
  965. }
  966. }
  967. //刷卡
  968. TextViewDebouncer.setDebouncedOnClickListener(viewBinding.campus, 1000L) {
  969. mVerOne = 2
  970. closeOneMission()
  971. mHandleScanEvent = false
  972. viewBinding.tvMsg.text = "请 第 一 位 刷 卡 验 证"
  973. viewBinding.tvMsgRoa.text = "请在刷卡区域进行刷卡验证"
  974. viewBinding.tvMsgRob.visibility = View.GONE //描述
  975. viewBinding.viewCard.visibility = View.VISIBLE
  976. viewBinding.campus.visibility = View.GONE
  977. if (viewBinding.viewFace.visibility == View.VISIBLE) {
  978. viewBinding.viewFace.visibility = View.GONE
  979. viewBinding.face.visibility = View.VISIBLE
  980. }
  981. if (viewBinding.viewScan.visibility == View.VISIBLE) {
  982. viewBinding.viewScan.visibility = View.GONE
  983. viewBinding.scan.visibility = View.VISIBLE
  984. }
  985. }
  986. //扫码
  987. TextViewDebouncer.setDebouncedOnClickListener(viewBinding.scan, 1000L) {
  988. closeOneMission()
  989. mHandleScanEvent = true
  990. mVerOne = 3
  991. viewBinding.tvMsg.text = "请 第 一 位 扫 码 验 证"
  992. viewBinding.tvMsgRoa.text = "请打开微信扫描屏幕二维码"
  993. viewBinding.tvMsgRob.text = "进行扫码验证"
  994. viewBinding.viewScan.visibility = View.VISIBLE
  995. viewBinding.scan.visibility = View.GONE
  996. if (viewBinding.viewFace.visibility == View.VISIBLE) {
  997. viewBinding.viewFace.visibility = View.GONE
  998. viewBinding.face.visibility = View.VISIBLE
  999. }
  1000. if (viewBinding.viewCard.visibility == View.VISIBLE) {
  1001. viewBinding.viewCard.visibility = View.GONE
  1002. viewBinding.campus.visibility = View.VISIBLE
  1003. }
  1004. mHandler.postDelayed(delayedTask, 4000)
  1005. }
  1006. }
  1007. private fun replaceTwos() {
  1008. //第二个人 人脸
  1009. TextViewDebouncer.setDebouncedOnClickListener(viewBinding.faceRoa, 1000L) {
  1010. mHandleScanEvent = true
  1011. mVerTwo = 1
  1012. viewBinding.tvMsgRoe.text = "请 第 二 位 人 脸 验 证"
  1013. viewBinding.tvMsgRoc.text = "请正对屏幕并使脸位于取景框内"
  1014. viewBinding.tvMsgRod.visibility = View.VISIBLE
  1015. viewBinding.tvMsgRod.text = "请保持光线充足,避免光照过强或过弱"
  1016. viewBinding.viewFaceRoa.visibility = View.VISIBLE
  1017. viewBinding.faceRoa.visibility = View.GONE
  1018. if (viewBinding.viewCardRoa.visibility == View.VISIBLE) {
  1019. viewBinding.viewCardRoa.visibility = View.GONE
  1020. viewBinding.campusTwo.visibility = View.VISIBLE
  1021. }
  1022. if (viewBinding.viewScanRoa.visibility == View.VISIBLE) {
  1023. viewBinding.viewScanRoa.visibility = View.GONE
  1024. viewBinding.scanTwo.visibility = View.VISIBLE
  1025. }
  1026. if (count == 2) {
  1027. try {
  1028. mHandler.removeCallbacks(delayedTask)
  1029. mHandler.removeCallbacksAndMessages(null)
  1030. } catch (e: Exception) {
  1031. }
  1032. viewBinding.imgFace.visibility = View.GONE
  1033. //正在进行第二个人 认证
  1034. if (::mFotoapparatTwo.isInitialized) {
  1035. // mFotoapparat 已经被初始化
  1036. mFotoapparatTwo.stop()
  1037. mFotoapparatTwo.start()
  1038. handlerBackTwo.post(countdownRunnableTwo)
  1039. } else {
  1040. // mFotoapparat 还没有被初始化
  1041. mFotoapparatTwo = Fotoapparat.with(this)
  1042. .into(viewBinding.cameraViewTwo)
  1043. .lensPosition(
  1044. if (Constants.FACE_TAG == 0) {
  1045. front()
  1046. } else {
  1047. back()
  1048. }
  1049. )//front()前置 back 后置
  1050. .frameProcessor(
  1051. FaceDetectorProcessor.with(this)
  1052. .listener { faces ->
  1053. viewBinding.rectanglesViewTwo.setRectangles(faces)
  1054. }.build()
  1055. )
  1056. .logger(loggers(logcat(), fileLogger(this)))
  1057. .build()
  1058. mFotoapparatTwo.stop()
  1059. mFotoapparatTwo.start()
  1060. handlerBackTwo.post(countdownRunnableTwo)
  1061. }
  1062. } else {
  1063. if (mVerOne == 2) {
  1064. mHandleScanEvent = false
  1065. } else {
  1066. mHandleScanEvent = true
  1067. }
  1068. }
  1069. }
  1070. //刷卡
  1071. TextViewDebouncer.setDebouncedOnClickListener(viewBinding.campusTwo, 1000L) {
  1072. mVerTwo = 2
  1073. RcLog.info("=======当前刷卡====$count")
  1074. if (count == 2) {
  1075. if (::mFotoapparatTwo.isInitialized) {
  1076. RcLog.info("=======当前刷卡A====$count")
  1077. try {
  1078. mFotoapparatTwo.stop()
  1079. } catch (e: Exception) {
  1080. }
  1081. try {
  1082. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  1083. handlerBackTwo.removeCallbacksAndMessages(null)
  1084. } catch (e: Exception) {
  1085. }
  1086. } else {
  1087. RcLog.info("=======当前刷卡B====$count")
  1088. }
  1089. try {
  1090. mHandler.removeCallbacks(delayedTask)
  1091. mHandler.removeCallbacksAndMessages(null)
  1092. } catch (e: Exception) {
  1093. }
  1094. mHandleScanEvent = false
  1095. } else {
  1096. if (mVerOne == 2) {
  1097. mHandleScanEvent = false
  1098. } else {
  1099. mHandleScanEvent = true
  1100. }
  1101. }
  1102. viewBinding.tvMsgRoe.text = "请 第 二 位 刷 卡 验 证"
  1103. viewBinding.tvMsgRoc.text = "请在刷卡区域进行刷卡验证"
  1104. viewBinding.tvMsgRod.visibility = View.GONE //描述
  1105. viewBinding.viewCardRoa.visibility = View.VISIBLE
  1106. viewBinding.campusTwo.visibility = View.GONE
  1107. if (viewBinding.viewFaceRoa.visibility == View.VISIBLE) {
  1108. viewBinding.viewFaceRoa.visibility = View.GONE
  1109. viewBinding.faceRoa.visibility = View.VISIBLE
  1110. }
  1111. if (viewBinding.viewScanRoa.visibility == View.VISIBLE) {
  1112. viewBinding.viewScanRoa.visibility = View.GONE
  1113. viewBinding.scanTwo.visibility = View.VISIBLE
  1114. }
  1115. }
  1116. //扫码
  1117. TextViewDebouncer.setDebouncedOnClickListener(viewBinding.scanTwo, 1000L) {
  1118. // closeFace(4)
  1119. mVerTwo = 3
  1120. viewBinding.tvMsgRoe.text = "请 第 二 位 扫 码 验 证"
  1121. viewBinding.tvMsgRoc.text = "请打开微信扫描屏幕二维码"
  1122. viewBinding.tvMsgRod.text = "进行扫码验证"
  1123. if (count == 2) {
  1124. viewBinding.viewScanRoa.visibility = View.VISIBLE
  1125. viewBinding.imgRoa.visibility = View.VISIBLE
  1126. viewBinding.scanTwo.visibility = View.GONE
  1127. if (viewBinding.viewFaceRoa.visibility == View.VISIBLE) {
  1128. viewBinding.viewFaceRoa.visibility = View.GONE
  1129. viewBinding.faceRoa.visibility = View.VISIBLE
  1130. }
  1131. if (::mFotoapparatTwo.isInitialized) {
  1132. try {
  1133. mFotoapparatTwo.stop()
  1134. } catch (e: Exception) {
  1135. }
  1136. try {
  1137. handlerBackTwo.removeCallbacks(countdownRunnableTwo)
  1138. handlerBackTwo.removeCallbacksAndMessages(null)
  1139. } catch (e: Exception) {
  1140. }
  1141. }
  1142. try {
  1143. mHandler.removeCallbacks(delayedTask)
  1144. mHandler.removeCallbacksAndMessages(null)
  1145. } catch (e: Exception) {
  1146. }
  1147. mHandler.postDelayed(delayedTask, 4000)
  1148. } else {
  1149. if (mVerOne == 2) {
  1150. mHandleScanEvent = false
  1151. } else {
  1152. mHandleScanEvent = true
  1153. }
  1154. viewBinding.viewScanRoa.visibility = View.VISIBLE
  1155. viewBinding.scanTwo.visibility = View.GONE
  1156. if (viewBinding.viewFaceRoa.visibility == View.VISIBLE) {
  1157. viewBinding.viewFaceRoa.visibility = View.GONE
  1158. viewBinding.faceRoa.visibility = View.VISIBLE
  1159. }
  1160. }
  1161. if (viewBinding.viewCardRoa.visibility == View.VISIBLE) {
  1162. viewBinding.viewCardRoa.visibility = View.GONE
  1163. viewBinding.campusTwo.visibility = View.VISIBLE
  1164. }
  1165. }
  1166. }
  1167. //========================刷卡认证=================================
  1168. //调用刷卡信息
  1169. private fun handleScanEvent(cont: String) {
  1170. //只有 0 1 1代表 已经需要第二次进行验证
  1171. showLoading("验证中...")
  1172. val mutableMap = mutableMapOf<String, String>()
  1173. mutableMap["cardNum"] = "$cont"
  1174. mutableMap["subId"] = "${ChemicalApp.subjectId}"
  1175. mutableMap["doorId"] = "$mDoorId"
  1176. val disposable = ApiRepository.useCardVerify(mutableMap)
  1177. .subscribe({ data ->
  1178. dismissLoading()
  1179. if (count == 1) {
  1180. mUserId = data.userId
  1181. RcLog.info("第a一个人 $mUserId ${data.userId}")
  1182. } else {
  1183. RcLog.info("第b一个人 $mUserId ${data.userId}")
  1184. if (mUserId.equals(data.userId) && count == 2) {
  1185. customDialogView(0, "不能是同一人")
  1186. mHandleScanEvent = false
  1187. return@subscribe
  1188. }
  1189. }
  1190. //0 新增入库 1 领用归还废弃空瓶等 2 待入库 需要判断不同权限 进行验证通过
  1191. when (mTag) {
  1192. 0 -> {
  1193. if (count == 1) {
  1194. if (data.userId == ChemicalApp.userData!!.userId) {
  1195. mHandleScanEvent = false
  1196. isLogin = true
  1197. customDialog()
  1198. var bean =
  1199. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1200. mDoubleDialogBean.add(bean)
  1201. } else {
  1202. if (mChemicalLevel == 1) {
  1203. //管控 校级管理员或院级管理
  1204. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1205. mHandleScanEvent = false
  1206. customDialog()
  1207. var bean = DoubleDialogBean(
  1208. data.userName,
  1209. data.faceImg,
  1210. data.userId
  1211. )
  1212. mDoubleDialogBean.add(bean)
  1213. } else {
  1214. mHandleScanEvent = false
  1215. customDialogView(0, "无权限信息")
  1216. }
  1217. } else {
  1218. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1219. mHandleScanEvent = false
  1220. customDialog()
  1221. var bean = DoubleDialogBean(
  1222. data.userName,
  1223. data.faceImg,
  1224. data.userId
  1225. )
  1226. mDoubleDialogBean.add(bean)
  1227. } else {
  1228. mHandleScanEvent = false
  1229. customDialogView(0, "无权限信息")
  1230. }
  1231. }
  1232. }
  1233. } else if (count == 2) {
  1234. if (isLogin) {
  1235. //已经有登陆人
  1236. if (mChemicalLevel == 1) {
  1237. //管控 校级管理员或院级管理
  1238. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1239. var bean = DoubleDialogBean(
  1240. data.userName,
  1241. data.faceImg,
  1242. data.userId
  1243. )
  1244. mDoubleDialogBean.add(bean)
  1245. passThrough()
  1246. } else {
  1247. mHandleScanEvent = false
  1248. customDialogView(0, "无权限信息")
  1249. }
  1250. } else {
  1251. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1252. var bean = DoubleDialogBean(
  1253. data.userName,
  1254. data.faceImg,
  1255. data.userId
  1256. )
  1257. mDoubleDialogBean.add(bean)
  1258. passThrough()
  1259. } else {
  1260. mHandleScanEvent = false
  1261. customDialogView(0, "无权限信息")
  1262. }
  1263. }
  1264. } else {
  1265. if (data.userId == ChemicalApp.userData!!.userId) {
  1266. var bean =
  1267. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1268. mDoubleDialogBean.add(bean)
  1269. passThrough()
  1270. } else {
  1271. mHandleScanEvent = false
  1272. customDialogView(0, "无权限信息")
  1273. }
  1274. }
  1275. }
  1276. }
  1277. 1 -> { //归还业务 标签管理
  1278. if (count == 1) {
  1279. if (data.userId == ChemicalApp.userData!!.userId) {
  1280. mHandleScanEvent = false
  1281. isLogin = true
  1282. customDialog()
  1283. var bean =
  1284. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1285. mDoubleDialogBean.add(bean)
  1286. } else {
  1287. obtainCertification(data)
  1288. }
  1289. } else if (count == 2) {
  1290. if (isLogin) {
  1291. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1292. var bean =
  1293. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1294. mDoubleDialogBean.add(bean)
  1295. passThrough()
  1296. } else {
  1297. mHandleScanEvent = false
  1298. customDialogView(0, "认证失败")
  1299. }
  1300. } else {
  1301. if (data.userId == ChemicalApp.userData!!.userId) {
  1302. var bean =
  1303. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1304. mDoubleDialogBean.add(bean)
  1305. passThrough()
  1306. } else {
  1307. mHandleScanEvent = false
  1308. customDialogView(0, "认证失败")
  1309. }
  1310. }
  1311. }
  1312. }
  1313. 2 -> {//待入库
  1314. if (count == 1) {
  1315. if (data.userId == ChemicalApp.userData!!.userId) {
  1316. mHandleScanEvent = false
  1317. isLogin = true
  1318. customDialog()
  1319. var bean =
  1320. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1321. mDoubleDialogBean.add(bean)
  1322. } else {
  1323. toBeStored(data)
  1324. }
  1325. } else if (count == 2) {
  1326. if (isLogin) {
  1327. if (mChemicalLevel == 1) {
  1328. //管控
  1329. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  1330. var bean = DoubleDialogBean(
  1331. data.userName,
  1332. data.faceImg,
  1333. data.userId
  1334. )
  1335. mDoubleDialogBean.add(bean)
  1336. passThrough()
  1337. } else {
  1338. mHandleScanEvent = false
  1339. customDialogView(0, "认证失败")
  1340. }
  1341. } else {
  1342. //非管控 实验室负责人or安全负责人or柜锁管理员
  1343. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  1344. var bean = DoubleDialogBean(
  1345. data.userName,
  1346. data.faceImg,
  1347. data.userId
  1348. )
  1349. mDoubleDialogBean.add(bean)
  1350. passThrough()
  1351. } else {
  1352. mHandleScanEvent = false
  1353. customDialogView(0, "认证失败")
  1354. }
  1355. }
  1356. } else {
  1357. if (data.userId == ChemicalApp.userData!!.userId) {
  1358. var bean =
  1359. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1360. mDoubleDialogBean.add(bean)
  1361. passThrough()
  1362. } else {
  1363. mHandleScanEvent = false
  1364. customDialogView(0, "认证失败")
  1365. }
  1366. }
  1367. }
  1368. }
  1369. }
  1370. }, { throwable ->
  1371. dismissLoading()
  1372. // showNetError(throwable)
  1373. mHandleScanEvent = false
  1374. throwableView(throwable)
  1375. })
  1376. addDisposable(disposable)
  1377. }
  1378. //停止 销毁广播传递
  1379. override fun onPause() {
  1380. mPortScanHelper.onPause()
  1381. super.onPause()
  1382. }
  1383. //必须写这个方法 防止注册失败
  1384. @Subscribe(threadMode = ThreadMode.MAIN)
  1385. fun onUpdateEventEvent(event: KeyEvent) {
  1386. }
  1387. //获取刷卡信息
  1388. override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
  1389. mPortScanHelper.dispatchKeyEvent(event)
  1390. return super.dispatchKeyEvent(event)
  1391. }
  1392. private fun opCards() {
  1393. EventBus.getDefault().register(this)
  1394. mPortScanHelper.onResume()
  1395. registerUsbBroadcast()
  1396. }
  1397. //刷卡usb链接
  1398. private fun registerUsbBroadcast() {
  1399. if (null == mUsbReceiver) {
  1400. val filter = IntentFilter().apply {
  1401. addAction(UsbReceiver.ACTION_USB_PERMISSION)
  1402. addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED)
  1403. addAction(UsbManager.ACTION_USB_DEVICE_DETACHED)
  1404. addAction(UsbReceiver.ACTION_USB_STATE) // usb连接状态广播
  1405. }
  1406. mUsbReceiver = UsbReceiver()
  1407. registerReceiver(mUsbReceiver, filter)
  1408. }
  1409. }
  1410. private val mPortScanHelper by lazy {
  1411. PortScanHelper(this, object : OnSerialScanListener {
  1412. override fun dispatchScanEvent(type: OnSerialScanListener.ScanType, content: String) {
  1413. if (!mHandleScanEvent) {
  1414. if (content.isNotBlank()) {
  1415. mHandleScanEvent = true
  1416. handleScanEvent(content)
  1417. }
  1418. }
  1419. }
  1420. })
  1421. }
  1422. //========================扫码认证=================================
  1423. private fun obtainCertification(data: UserValidationBean, macId: String) {
  1424. //校级管理员 schoolLevelAdmin
  1425. //院级管理员 collegeAdmin
  1426. //实验室负责人 adminUser
  1427. //安全负责人 safeUser
  1428. //柜锁管理员 cabinetAdmin
  1429. //是否化学品归属人 belongUser
  1430. //是否化学品归属课题组下成员 toipcUser
  1431. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1432. scanLogin(macId)
  1433. customDialog()
  1434. var bean = DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1435. mDoubleDialogBean.add(bean)
  1436. } else {
  1437. customDialogView(0, "认证失败")
  1438. }
  1439. }
  1440. private fun toBeStored(data: UserValidationBean, macId: String) {
  1441. //校级管理员 schoolLevelAdmin
  1442. //院级管理员 collegeAdmin
  1443. //实验室负责人 adminUser
  1444. //安全负责人 safeUser
  1445. //柜锁管理员 cabinetAdmin
  1446. //是否化学品归属人 belongUser
  1447. //是否化学品归属课题组下成员 toipcUser
  1448. if (mChemicalLevel == 1) {
  1449. //管控
  1450. // if (data.belongUser == true || data.toipcUser == true || data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1451. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1452. scanLogin(macId)
  1453. customDialog()
  1454. var bean = DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1455. mDoubleDialogBean.add(bean)
  1456. } else {
  1457. customDialogView(0, "认证失败")
  1458. }
  1459. } else {
  1460. //非管控 实验室负责人or安全负责人or柜锁管理员
  1461. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  1462. scanLogin(macId)
  1463. customDialog()
  1464. var bean = DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1465. mDoubleDialogBean.add(bean)
  1466. } else {
  1467. customDialogView(0, "认证失败")
  1468. }
  1469. }
  1470. }
  1471. private fun scanLogin(macId: String) {
  1472. if (count == 2) {
  1473. currentDateTimeOne = currentDateTimeTwo
  1474. }
  1475. showLoading("查询中...")
  1476. val disposable =
  1477. ApiRepository.aioScanLogin(ChemicalApp.subjectId!!, mDoorId!!, currentDateTimeOne!!)
  1478. .subscribe({ data ->
  1479. dismissLoading()
  1480. if (count == 1) {
  1481. mUserId = data.userId
  1482. RcLog.info("第a一个人 $mUserId ${data.userId}")
  1483. } else {
  1484. if (mUserId.equals(data.userId) && count == 2) {
  1485. customDialogView(0, "不能是同一个人")
  1486. return@subscribe
  1487. }
  1488. }
  1489. //0 新增入库 1 领用归还废弃空瓶等 2 待入库 需要判断不同权限 进行验证通过
  1490. when (mTag) {
  1491. 0 -> {
  1492. //新增入库
  1493. if (count == 1) {
  1494. if (data.userId == ChemicalApp.userData!!.userId) {
  1495. isLogin = true
  1496. scanLogin(macId)
  1497. customDialog()
  1498. var bean =
  1499. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1500. mDoubleDialogBean.add(bean)
  1501. } else {
  1502. if (mChemicalLevel == 1) {
  1503. //管控 校级管理员或院级管理
  1504. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1505. scanLogin(macId)
  1506. customDialog()
  1507. var bean = DoubleDialogBean(
  1508. data.userName,
  1509. data.faceImg,
  1510. data.userId
  1511. )
  1512. mDoubleDialogBean.add(bean)
  1513. } else {
  1514. customDialogView(0, "无权限信息")
  1515. }
  1516. } else {
  1517. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1518. scanLogin(macId)
  1519. customDialog()
  1520. var bean = DoubleDialogBean(
  1521. data.userName,
  1522. data.faceImg,
  1523. data.userId
  1524. )
  1525. mDoubleDialogBean.add(bean)
  1526. } else {
  1527. customDialogView(0, "无权限信息")
  1528. }
  1529. }
  1530. }
  1531. } else {
  1532. if (isLogin) {
  1533. //已经有登陆人
  1534. if (mChemicalLevel == 1) {
  1535. //管控 校级管理员或院级管理
  1536. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1537. var bean = DoubleDialogBean(
  1538. data.userName,
  1539. data.faceImg,
  1540. data.userId
  1541. )
  1542. mDoubleDialogBean.add(bean)
  1543. passThrough()
  1544. } else {
  1545. customDialogView(2, "无权限信息")
  1546. }
  1547. } else {
  1548. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1549. var bean = DoubleDialogBean(
  1550. data.userName,
  1551. data.faceImg,
  1552. data.userId
  1553. )
  1554. mDoubleDialogBean.add(bean)
  1555. passThrough()
  1556. } else {
  1557. customDialogView(0, "无权限信息")
  1558. }
  1559. }
  1560. } else {
  1561. if (data.userId == ChemicalApp.userData!!.userId) {
  1562. var bean = DoubleDialogBean(
  1563. data.userName,
  1564. data.faceImg,
  1565. data.userId
  1566. )
  1567. mDoubleDialogBean.add(bean)
  1568. passThrough()
  1569. } else {
  1570. customDialogView(0, "无权限信息")
  1571. }
  1572. }
  1573. }
  1574. }
  1575. 1 -> { //归还业务 领用 标签管理
  1576. if (count == 1) {
  1577. if (data.userId == ChemicalApp.userData!!.userId) {
  1578. isLogin = true
  1579. scanLogin(macId)
  1580. customDialog()
  1581. var bean =
  1582. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1583. mDoubleDialogBean.add(bean)
  1584. } else {
  1585. obtainCertification(data, macId)
  1586. }
  1587. } else {
  1588. if (isLogin) {
  1589. if (data.adminUser == true || data.safeUser == true || data.cabinetAdmin == true) {
  1590. var bean = DoubleDialogBean(
  1591. data.userName,
  1592. data.faceImg,
  1593. data.userId
  1594. )
  1595. mDoubleDialogBean.add(bean)
  1596. passThrough()
  1597. } else {
  1598. customDialogView(0, "认证失败")
  1599. }
  1600. } else {
  1601. if (data.userId == ChemicalApp.userData!!.userId) {
  1602. var bean = DoubleDialogBean(
  1603. data.userName,
  1604. data.faceImg,
  1605. data.userId
  1606. )
  1607. mDoubleDialogBean.add(bean)
  1608. passThrough()
  1609. } else {
  1610. customDialogView(0, "认证失败")
  1611. }
  1612. }
  1613. }
  1614. }
  1615. 2 -> {//待入库
  1616. if (count == 1) {
  1617. if (data.userId == ChemicalApp.userData!!.userId) {
  1618. isLogin = true
  1619. scanLogin(macId)
  1620. customDialog()
  1621. var bean =
  1622. DoubleDialogBean(data.userName, data.faceImg, data.userId)
  1623. mDoubleDialogBean.add(bean)
  1624. } else {
  1625. toBeStored(data, macId)
  1626. }
  1627. } else {
  1628. if (isLogin) {
  1629. if (mChemicalLevel == 1) {
  1630. //管控
  1631. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  1632. var bean = DoubleDialogBean(
  1633. data.userName,
  1634. data.faceImg,
  1635. data.userId
  1636. )
  1637. mDoubleDialogBean.add(bean)
  1638. passThrough()
  1639. } else {
  1640. customDialogView(0, "认证失败")
  1641. }
  1642. } else {
  1643. //非管控 实验室负责人or安全负责人or柜锁管理员
  1644. if (data.safeUser == true || data.adminUser == true || data.cabinetAdmin == true) {
  1645. var bean = DoubleDialogBean(
  1646. data.userName,
  1647. data.faceImg,
  1648. data.userId
  1649. )
  1650. mDoubleDialogBean.add(bean)
  1651. passThrough()
  1652. } else {
  1653. customDialogView(0, "认证失败")
  1654. }
  1655. }
  1656. } else {
  1657. if (data.userId == ChemicalApp.userData!!.userId) {
  1658. var bean = DoubleDialogBean(
  1659. data.userName,
  1660. data.faceImg,
  1661. data.userId
  1662. )
  1663. mDoubleDialogBean.add(bean)
  1664. passThrough()
  1665. } else {
  1666. customDialogView(0, "认证失败")
  1667. }
  1668. }
  1669. }
  1670. }
  1671. }
  1672. }, { throwable ->
  1673. dismissLoading()
  1674. throwableView(throwable)
  1675. })
  1676. addDisposable(disposable)
  1677. }
  1678. private val delayedTask = object : Runnable {
  1679. override fun run() {
  1680. // 在这里编写需要延迟执行的代码
  1681. scanLogin(mDeviceNum!!)
  1682. // 调度下一次延迟任务,确保在执行完后再延迟3.5秒
  1683. mHandler.postDelayed(this, 4000)
  1684. }
  1685. }
  1686. // 使用 Glide 加载二维码到 ImageView
  1687. private fun loadQRCodeIntoImageView(
  1688. text: String,
  1689. width: Int,
  1690. height: Int,
  1691. imageView: ImageView
  1692. ) {
  1693. val bitmap = generateQRCode(text, width, height)
  1694. bitmap?.let {
  1695. Glide.with(this)
  1696. .load(it)
  1697. .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
  1698. .into(imageView)
  1699. }
  1700. }
  1701. // 生成二维码的函数
  1702. private fun generateQRCode(text: String, width: Int, height: Int): Bitmap? {
  1703. try {
  1704. val bitMatrix: BitMatrix =
  1705. MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height)
  1706. val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
  1707. for (x in 0 until width) {
  1708. for (y in 0 until height) {
  1709. bitmap.setPixel(
  1710. x,
  1711. y,
  1712. if (bitMatrix[x, y]) 0xFF000000.toInt() else 0xFFFFFFFF.toInt()
  1713. )
  1714. }
  1715. }
  1716. return bitmap
  1717. } catch (e: WriterException) {
  1718. e.printStackTrace()
  1719. }
  1720. return null
  1721. }
  1722. /**
  1723. * 0 没有图标 1 绿色(成功) 2红色(失败)
  1724. * 失败或者成功的弹框
  1725. */
  1726. private fun customDialogView(types: Int, msg: String) {
  1727. val customDialog = CustomDialog(this, types, msg)
  1728. if (!this.isFinishing && !this.isDestroyed) {
  1729. customDialog.show()
  1730. }
  1731. }
  1732. /**
  1733. * 异常处理
  1734. */
  1735. private fun throwableView(throwable: Throwable) {
  1736. when (throwable) {
  1737. is NetException -> {
  1738. if (throwable.message.isNullOrEmpty()) {
  1739. "接口请求失败(${throwable.code})"
  1740. } else {
  1741. throwable.message!!
  1742. }
  1743. }
  1744. is SocketTimeoutException -> "请求超时,请稍后重试"
  1745. is ConnectException -> "无法连接服务器,请检查网络"
  1746. is HttpException -> "服务器繁忙,请稍后重试"
  1747. else -> null
  1748. }?.let { customDialogView(2, "$it") }
  1749. }
  1750. }