From b69c20d08627330bb7e565123fe810fd568d568c Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sat, 10 Feb 2018 03:46:47 -0800 Subject: [PATCH] Use mobile vision APIs for QR code from files --- mobile/build.gradle | 1 + .../com/github/shadowsocks/ScannerActivity.kt | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mobile/build.gradle b/mobile/build.gradle index 2a2cf5e7..997b7cc2 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -60,6 +60,7 @@ dependencies { implementation 'com.evernote:android-job:1.2.2' implementation "com.google.android.gms:play-services-ads:$playServicesVersion" implementation "com.google.android.gms:play-services-analytics:$playServicesVersion" + implementation "com.google.android.gms:play-services-vision:$playServicesVersion" implementation "com.google.firebase:firebase-config:$playServicesVersion" implementation 'com.j256.ormlite:ormlite-android:5.0' implementation 'com.mikepenz:crossfader:1.5.2' diff --git a/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt b/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt index 43fdb5a4..3c5e0e82 100644 --- a/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt +++ b/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt @@ -41,8 +41,11 @@ import com.github.shadowsocks.App.Companion.app import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.utils.resolveResourceId -import com.google.zxing.* -import com.google.zxing.common.HybridBinarizer +import com.google.zxing.Result +import com.google.android.gms.vision.Frame +import com.google.android.gms.vision.barcode.Barcode +import com.google.android.gms.vision.barcode.BarcodeDetector + import me.dm7.barcodescanner.zxing.ZXingScannerView class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Toolbar.OnMenuItemClickListener { @@ -50,8 +53,6 @@ class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Too private const val MY_PERMISSIONS_REQUEST_CAMERA = 1 private const val REQUEST_IMPORT = 2 private const val REQUEST_IMPORT_OR_FINISH = 3 - - private val hints by lazy { mapOf(Pair(DecodeHintType.TRY_HARDER, true)) } } private lateinit var scannerView: ZXingScannerView @@ -143,14 +144,16 @@ class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler, Too val clipData = data?.clipData if (clipData != null) list += (0 until clipData.itemCount).map { clipData.getItemAt(it).uri } val resolver = contentResolver - val reader = MultiFormatReader() var success = false + val detector = BarcodeDetector.Builder(getApplicationContext()) + .setBarcodeFormats(Barcode.DATA_MATRIX or Barcode.QR_CODE) + .build() for (uri in list) try { val bitmap = BitmapFactory.decodeStream(resolver.openInputStream(uri)) - val pixels = IntArray(bitmap.width * bitmap.height) - bitmap.getPixels(pixels, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height) - Profile.findAll(reader.decode(BinaryBitmap(HybridBinarizer( - RGBLuminanceSource(bitmap.width, bitmap.height, pixels))), hints).text).forEach { + val frame = Frame.Builder().setBitmap(bitmap).build() + val barcodes = detector.detect(frame) + val value = barcodes.valueAt(0).rawValue + Profile.findAll(value).forEach { ProfileManager.createProfile(it) success = true }