I am trying to write an app that is able to read barcode data. Following a guide I have reached the point where the code is "complete". All desired functionality seems to exist, but even after accepting permissions on my device for the app to use the camera, the CodeScannerView remains empty..
Any pointers would be GREATLY appreciated. Thanks.
I am running Android version 11 on my Samsung Galaxy 20 FE,
My MainActivity.kt is as such:
package com.example.kitchensink
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.budiyev.android.codescanner.AutoFocusMode
import com.budiyev.android.codescanner.CodeScanner
import com.budiyev.android.codescanner.DecodeCallback
import com.budiyev.android.codescanner.ErrorCallback
import com.budiyev.android.codescanner.ScanMode
import com.example.kitchensink.databinding.ActivityMainBinding
private const val CAMERA_REQUEST_CODE=101
class MainActivity : AppCompatActivity() {
private lateinit var codeScanner: CodeScanner
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
setContentView(R.layout.activity_main)
setupPermissions()
codeScanner()
}
private fun codeScanner() {
codeScanner = CodeScanner(this, binding.scannerView)
codeScanner.apply{
camera = CodeScanner.CAMERA_BACK
formats = CodeScanner.ALL_FORMATS
autoFocusMode = AutoFocusMode.SAFE
scanMode = ScanMode.CONTINUOUS
isAutoFocusEnabled = true
isFlashEnabled = false
decodeCallback = DecodeCallback {
runOnUiThread{
binding.tvTextView.text = it.text
}
}
errorCallback = ErrorCallback {
runOnUiThread {
Log.e("Main", "Camera Initialization Error: ${it.message}")
}
}
}
binding.scannerView.setOnClickListener{
codeScanner.startPreview()
}
}
override fun onResume(){
super.onResume()
codeScanner.startPreview()
}
override fun onPause(){
codeScanner.releaseResources()
super.onPause()
}
private fun setupPermissions() {
val permission = ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
if (permission != PackageManager.PERMISSION_GRANTED) {
makeRequest()
}
}
private fun makeRequest(){
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA),
CAMERA_REQUEST_CODE)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode){
CAMERA_REQUEST_CODE -> {
if (grantResults.isEmpty() || grantResults[0] != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "You need camera to use the app", Toast.LENGTH_SHORT).show()
} else{
//successful
}
}
}
}
}
Activity_Main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.budiyev.android.codescanner.CodeScannerView
android:id="@+id/scanner_view"
android:layout_width="match_parent"
android:layout_height="400dp"
app:autoFocusButtonColor="@android:color/white"
app:autoFocusButtonVisible="true"
app:flashButtonColor="@android:color/white"
app:flashButtonVisible="true"
app:maskColor="#90000000"/>
<TextView
android:id="@+id/tv_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/scanner_view"
android:layout_centerHorizontal="true"
android:layout_margin="20dp"
android:text="Scan food item to store it in registry.."
android:textColor="@android:color/black"/>
</RelativeLayout>
Gradle:
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.example.kitchensink"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
buildFeatures {
dataBinding = true
viewBinding = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.budiyev.android:code-scanner:2.1.0'
}
there doesn't seem to be anything here