BGAQRCode-Android
QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信、QQ 二维码扫描样式。他把Zbar和Zxing,都做了优化,扫描速度非常快,用户体验很好,用起来也非常方便
添加依赖
implementation 'cn.bingoogolapple:bga-qrcode-zbar:1.3.7'
或者
implementation 'cn.bingoogolapple:bga-qrcode-zxing:1.3.7'
用法
1.自行添加xml文件里属性,具体属性说明可在https://github.com/bingoogolapple/BGAQRCode-Android查看
<cn.bingoogolapple.qrcode.zxing.ZXingView
android:id="@+id/mZXingView"
style="@style/MatchMatch"
app:qrcv_animTime="1000"
app:qrcv_borderColor="@android:color/white"
app:qrcv_borderSize="1dp"
app:qrcv_cornerColor="@color/colorPrimaryDark"
app:qrcv_cornerLength="20dp"
app:qrcv_cornerSize="3dp"
app:qrcv_maskColor="#33FFFFFF"
app:qrcv_rectWidth="200dp"
app:qrcv_scanLineColor="@color/colorPrimaryDark"
app:qrcv_scanLineSize="1dp"
app:qrcv_topOffset="90dp" />
2.AndroidManifest文件里添加相应权限
<uses-permission android:name="android.permission.CAMERA"/>
3.在对应的activity进行操作
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT >= 23) {
checkAndRequestPermission()
}
}
/**
* 动态添加相机权限
*/
@TargetApi(Build.VERSION_CODES.M)
fun checkAndRequestPermission() {
val permission = arrayOf(Manifest.permission.CAMERA)
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(permission, 1024)
} else {
mZXingView.setDelegate(this)
}
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1024 -> {
val permission = arrayOf(Manifest.permission.CAMERA)
val shouldFalse = shouldShowRequestPermissionRationale(permission[0])
if (shouldFalse) {
initDialog()
}
}
}
}
@RequiresApi(Build.VERSION_CODES.M)
override fun onResume() {
launch(Dispatchers.IO){
if (checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
mZXingView.startSpotAndShowRect() // 显示扫描框,并开始识别
}
}
super.onResume()
}
private fun initDialog() {
val dialog = AlertDialog.Builder(this)
.setTitle("权限申请")
.setMessage(getString(R.string.per_tip))
.setNegativeButton(android.R.string.cancel) { dialog, which ->
dialog.dismiss()
}
.setPositiveButton(getString(R.string.set_tip)) { dialog, which ->
val intent = Intent()
//进入系统应用设置
intent.action = "android.settings.APPLICATION_DETAILS_SETTINGS"
intent.data = Uri.fromParts("package", packageName, null)
startActivity(intent)
finish()
}
.create().show()
}
override fun onStart() {
mZXingView.startCamera() // 打开后置摄像头开始预览,但是并未开始识别
super.onStart()
}
override fun onScanQRCodeSuccess(result: String?) {
mZXingView.startSpot()
finish()
}
override fun onCameraAmbientBrightnessChanged(isDark: Boolean) {
// 这里是通过修改提示文案来展示环境是否过暗的状态,接入方也可以根据 isDark 的值来实现其他交互效果
var tipText = mZXingView.scanBoxView.tipText
val ambientBrightnessTip = "\n环境过暗,请打开闪光灯"
if (isDark) {
if (!tipText.contains(ambientBrightnessTip)) {
mZXingView.scanBoxView.tipText = tipText + ambientBrightnessTip
}
} else {
if (tipText.contains(ambientBrightnessTip)) {
tipText = tipText.substring(0, tipText.indexOf(ambientBrightnessTip))
mZXingView.scanBoxView.tipText = tipText
}
}
}
override fun onScanQRCodeOpenCameraError() {
}
override fun onStop() {
mZXingView.stopCamera() // 关闭摄像头预览,并且隐藏扫描框
super.onStop()
}
override fun onDestroy() {
mZXingView.onDestroy() // 销毁二维码扫描控件
super.onDestroy()
}