Pu Zhibing
2025-12-11 ab0c19e49fabdb8cc6eea454ea455bce2efbb718
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.igo.user.ui.trip
 
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.View
import cn.bingoogolapple.qrcode.core.BarcodeType
import cn.bingoogolapple.qrcode.core.QRCodeView
import cn.bingoogolapple.qrcode.zxing.ZXingView
import cn.sinata.xldutils.activity.BaseActivity
import cn.sinata.xldutils.utils.getUrlPath
import cn.sinata.xldutils.utils.myToast
import cn.sinata.xldutils.view.TitleBar
import com.github.zackratos.ultimatebar.UltimateBar
import com.igo.user.R
import com.igo.user.network.HttpManager
import com.igo.user.network.request
import com.tbruyelle.rxpermissions2.RxPermissions
import org.jetbrains.anko.find
import org.jetbrains.anko.startActivityForResult
import org.jetbrains.anko.textColorResource
import org.jetbrains.anko.toast
import java.util.Locale
 
class ScanActivity : BaseActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sacn)
        UltimateBar.with(this)
            .create().immersionBar() //沉浸状态栏
        val titleBar = find<TitleBar>(R.id.titleBar)
        titleBar.titleView.text = getString(R.string.扫一扫)
        titleBar.titleView.textColorResource = R.color.white
        titleBar.leftView.setCompoundDrawablesWithIntrinsicBounds(R.mipmap.back_white,0,0,0)
        titleBar.addRightButton(getString(R.string.photo),onClickListener = View.OnClickListener {
            RxPermissions(this).request(
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE).subscribe {
                if (it) {
                    val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)// 调用android的图库
                    intent.type = "image/*"
                    startActivityForResult(intent, 1)
                }else{
                    toast(getString(R.string.没有权限))
                }
            }
        })
        titleBar.getRightButton(0)?.textColorResource = R.color.white
        initQRCode()
    }
 
    private val zxingview by lazy { find<ZXingView>(R.id.zxingview) }
 
    private fun initQRCode() {
        zxingview.startCamera()
        zxingview.startSpotAndShowRect()
        zxingview.changeToScanQRCodeStyle() // 切换成扫描二维码样式
        zxingview.setType(BarcodeType.TWO_DIMENSION, null) // 只识别二维条码
        zxingview.setDelegate(object : QRCodeView.Delegate{
            override fun onScanQRCodeSuccess(result: String?) {
                zxingview.stopCamera()
                if (result.isNullOrEmpty()){
                    myToast(getString(R.string.识别失败请重新扫描))
                    initQRCode()
                }else{
                    Log.e("二维码扫描结果",result)
                    if(result.startsWith("driverId:")){
                        try {
                            val id = result.substring(9, result.length).toInt()
                            showDialog()
                            HttpManager.queryDriverInfo(id).request(this@ScanActivity,false,{_,data->
                                data?.let {
                                    startActivityForResult<ChooseOrderTypeActivity>(2,"driver" to it,"startName" to intent.getStringExtra("startName"),
                                        "startLat" to intent.getDoubleExtra("startLat",0.0), "startLon" to intent.getDoubleExtra("startLon",0.0))
                                    finish()
                                }
                            },{_,_->
                                myToast(getString(R.string.司机信息查询失败))
                                initQRCode()
                            })
                        }catch (e:Exception){
                            myToast(getString(R.string.二维码错误))
                            initQRCode()
                        }
                    }else{
                        myToast(getString(R.string.二维码错误))
                        initQRCode()
                    }
                }
            }
 
            override fun onCameraAmbientBrightnessChanged(isDark: Boolean) {
//                var tipText = zxingview.scanBoxView.tipText
//                val ambientBrightnessTip = "\n当前环境过暗"
//                if (isDark) {
//                    if (!tipText.contains(ambientBrightnessTip)) {
//                        zxingview.scanBoxView.tipText = tipText + ambientBrightnessTip
//                    }
//                } else {
//                    if (tipText.contains(ambientBrightnessTip)) {
//                        tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip))
//                        zxingview.scanBoxView.tipText = tipText
//                    }
//                }
            }
 
            override fun onScanQRCodeOpenCameraError() {
                myToast(getString(R.string.没有权限))
                finish()
            }
        })
    }
 
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == Activity.RESULT_OK&&data!=null&&requestCode == 1){
            val uri = data.data
            if (uri != null) {
                val path = getUrlPath(uri)
                if (path != null) {
                    val typeIndex = path.lastIndexOf(".")
                    if (typeIndex != -1) {
                        val fileType = path.substring(typeIndex + 1).toLowerCase(Locale.CHINA)
                        //某些设备选择图片是可以选择一些非图片的文件。然后发送出去或出错。这里简单的通过匹配后缀名来判断是否是图片文件
                        //如果是图片文件则发送。反之给出提示
                        if (fileType == "jpg" || fileType == "gif"
                            || fileType == "png" || fileType == "jpeg"
                            || fileType == "bmp" || fileType == "wbmp"
                            || fileType == "ico" || fileType == "jpe") {
                            zxingview.decodeQRCode(path)
                        } else {
                            toast("无法识别的图片类型!")
                        }
                    } else {
                        toast("无法识别的图片类型!")
                    }
                } else {
                    toast("无法识别的图片类型或路径!")
                }
            } else {
                toast("无法识别的图片类型!")
            }
        }else if (requestCode == 2&&resultCode == Activity.RESULT_OK)
            finish()
        else
            initQRCode()
    }
 
    override fun onStop() {
        super.onStop()
        zxingview.stopCamera()
    }
 
    override fun onDestroy() {
        super.onDestroy()
        zxingview.onDestroy()
    }
}