owenclave / app/src/main/java/io/nekohasekai/sagernet/utils/ZxingQRCodeAnalyzer.kt

github - dev - back to tree - upstream
/****************************************************************************** * * * Copyright (C) 2021 by nekohasekai * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation, either version 3 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see . * * * ******************************************************************************/ package io.nekohasekai.sagernet.utils import androidx.camera.core.ImageAnalysis import androidx.camera.core.ImageProxy import com.google.zxing.BinaryBitmap import com.google.zxing.DecodeHintType import com.google.zxing.NotFoundException import com.google.zxing.RGBLuminanceSource import com.google.zxing.common.GlobalHistogramBinarizer import com.google.zxing.qrcode.QRCodeReader class ZxingQRCodeAnalyzer( private val onSuccess: ((String) -> Unit), private val onFailure: ((Exception) -> Unit), ) : ImageAnalysis.Analyzer { private val qrCodeReader = QRCodeReader() override fun analyze(image: ImageProxy) { try { val bitmap = image.toBitmap() val intArray = IntArray(bitmap.getWidth() * bitmap.getHeight()) bitmap.getPixels( intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight() ) val source = RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray) val result = try { qrCodeReader.decode(BinaryBitmap(GlobalHistogramBinarizer(source)), mapOf(DecodeHintType.TRY_HARDER to true)) } catch (e: NotFoundException) { try { qrCodeReader.decode(BinaryBitmap(GlobalHistogramBinarizer(source.invert())), mapOf(DecodeHintType.TRY_HARDER to true)) } catch (ignore: NotFoundException) { return } } onSuccess(result.text) } catch (_: Exception) { } finally { image.close() } } }