flutter_barcode_reader/android/src/main/kotlin/de/mintware/barcode_scan/BarcodeScannerActivity.kt

137 lines
4.2 KiB
Kotlin

package de.mintware.barcode_scan
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.google.zxing.Result
import me.dm7.barcodescanner.zxing.ZXingScannerView
class BarcodeScannerActivity : Activity(), ZXingScannerView.ResultHandler {
lateinit var scannerView: me.dm7.barcodescanner.zxing.ZXingScannerView
companion object {
val REQUEST_TAKE_PHOTO_CAMERA_PERMISSION = 100
val TOGGLE_FLASH = 200
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = ""
scannerView = ZXingScannerView(this)
scannerView.setAutoFocus(true)
// this paramter will make your HUAWEI phone works great!
scannerView.setAspectTolerance(0.5f)
setContentView(scannerView)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
if (scannerView.flash) {
val item = menu.add(0,
TOGGLE_FLASH, 0, "关闭闪光灯")
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
} else {
val item = menu.add(0,
TOGGLE_FLASH, 0, "开启闪光灯")
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
}
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == TOGGLE_FLASH) {
scannerView.flash = !scannerView.flash
this.invalidateOptionsMenu()
return true
}
return super.onOptionsItemSelected(item)
}
override fun onResume() {
super.onResume()
scannerView.setResultHandler(this)
// start camera immediately if permission is already given
if (!requestCameraAccessIfNecessary()) {
scannerView.startCamera()
}
}
override fun onPause() {
super.onPause()
scannerView.stopCamera()
}
override fun handleResult(result: Result?) {
val intent = Intent()
intent.putExtra("SCAN_RESULT", result.toString())
setResult(Activity.RESULT_OK, intent)
finish()
}
fun finishWithError(errorCode: String) {
val intent = Intent()
intent.putExtra("ERROR_CODE", errorCode)
setResult(Activity.RESULT_CANCELED, intent)
finish()
}
private fun requestCameraAccessIfNecessary(): Boolean {
val array = arrayOf(Manifest.permission.CAMERA)
if (ContextCompat
.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, array,
REQUEST_TAKE_PHOTO_CAMERA_PERMISSION)
return true
}
return false
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>,grantResults: IntArray) {
when (requestCode) {
REQUEST_TAKE_PHOTO_CAMERA_PERMISSION -> {
if (PermissionUtil.verifyPermissions(grantResults)) {
scannerView.startCamera()
} else {
finishWithError("PERMISSION_NOT_GRANTED")
}
}
else -> {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
}
}
object PermissionUtil {
/**
* Check that all given permissions have been granted by verifying that each entry in the
* given array is of the value [PackageManager.PERMISSION_GRANTED].
* @see Activity.onRequestPermissionsResult
*/
fun verifyPermissions(grantResults: IntArray): Boolean {
// At least one result must be checked.
if (grantResults.size < 1) {
return false
}
// Verify that each required permission has been granted, otherwise return false.
for (result in grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
return false
}
}
return true
}
}