flutter_barcode_reader/android/src/main/kotlin/com/apptreesoftware/barcodescan/BarcodeScannerActivity.kt

135 lines
4.1 KiB
Kotlin
Raw Normal View History

2017-10-30 01:05:11 +08:00
package com.apptreesoftware.barcodescan
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.view.Menu
import android.view.MenuItem
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
}
2017-10-30 01:05:11 +08:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
title = ""
scannerView = ZXingScannerView(this)
scannerView.setAutoFocus(true)
setContentView(scannerView)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
if (scannerView.flash) {
val item = menu.add(0,
TOGGLE_FLASH, 0, "Flash Off")
2017-10-30 01:05:11 +08:00
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
} else {
val item = menu.add(0,
TOGGLE_FLASH, 0, "Flash On")
2017-10-30 01:05:11 +08:00
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
2017-10-30 01:05:11 +08:00
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()
}
2017-10-30 01:05:11 +08:00
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)
2017-10-30 01:05:11 +08:00
return true
}
return false
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>,grantResults: IntArray) {
2017-10-30 01:05:11 +08:00
when (requestCode) {
REQUEST_TAKE_PHOTO_CAMERA_PERMISSION -> {
if (PermissionUtil.verifyPermissions(grantResults)) {
scannerView.startCamera()
} else {
finishWithError("PERMISSION_NOT_GRANTED")
2017-10-30 01:05:11 +08:00
}
}
else -> {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
2017-10-30 01:05:11 +08:00
}
}
}
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
}
}