TwoVerificationActivity.kt 82 KB

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