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,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 } }