首页 > 解决方案 > 无法解决此问题?得到错误吐司“无法访问相机”Kotlin -Android

问题描述

我收到吐司错误 Unable to access cameracodeScanner.errorCallback = ErrorCallback我在清单中正确授予了相机权限

这是我的kt代码。

class scannerActivity: AppCompatActivity() {

private lateinit var codeScanner: CodeScanner
val MY_CAMERA_PERMISSION_REQUEST = 1111

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_scanner)

          val Button = findViewById<Button>(R.id.button6)
          Button.setOnClickListener {
           startActivity(Intent(this@scannerActivity, conductorMenu::class.java))}

        val scannerView = findViewById<CodeScannerView>(R.id.scannerView)

        codeScanner = CodeScanner(this@scannerActivity, scannerView)
        codeScanner.camera = CodeScanner.CAMERA_BACK
        codeScanner.formats = CodeScanner.ALL_FORMATS
        codeScanner.autoFocusMode = AutoFocusMode.SAFE
        codeScanner.scanMode = ScanMode.SINGLE
        codeScanner.isAutoFocusEnabled = true
        codeScanner.isFlashEnabled = false

        codeScanner.decodeCallback = DecodeCallback {

            runOnUiThread {
                Toast.makeText(this@scannerActivity, "Scan result: ${it.text}", Toast.LENGTH_LONG).show()
            }
        }

        codeScanner.errorCallback = ErrorCallback {

            runOnUiThread {
                Toast.makeText(this@scannerActivity, "Camera error: ${it.message}", Toast.LENGTH_LONG).show()
            }
        }

       checkPermission()

    }

    fun checkPermission(){
        if (ContextCompat.checkSelfPermission(this@scannerActivity, Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this@scannerActivity, arrayOf(Manifest.permission.CAMERA), MY_CAMERA_PERMISSION_REQUEST)

        } else{
            codeScanner.startPreview()
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode==MY_CAMERA_PERMISSION_REQUEST && grantResults.isNotEmpty() && grantResults[0]==PackageManager.PERMISSION_GRANTED){
            codeScanner.startPreview()
        }
        else{
            Toast.makeText(this@scannerActivity, "Cannot scan until you give camera permission", Toast.LENGTH_LONG).show()
        }
    }

    override fun onResume() {
        super.onResume()
        codeScanner.startPreview()
    }

    override fun onPause() {
        codeScanner.releaseResources()
        super.onPause()
    }
}

`<uses-permission android:name="android.permission.CAMERA"/>` 

帮助解决这个问题?

标签: androidkotlin

解决方案


首先,您必须将 multidex 放入您的构建 gradle

android {
    defaultConfig {
        ...
        minSdkVersion(15) 
        targetSdkVersion(28)
        multiDexEnabled = true
    }
    ...
}

dependencies {
    implementation("androidx.multidex:multidex:2.0.1")
}

然后您有 3 种方式可供您选择 1.) 清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="androidx.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

2.) 覆盖应用程序类

class MyApplication : MultiDexApplication() {...}

3.) 将 Multidex 函数添加到应用程序类

class MyApplication : SomeOtherApplication() {

    override fun attachBaseContext(base: Context) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

在某些情况下,您可能还必须对您的 progaurd 进行修改。你可以在这里阅读更多关于它的信息 https://developer.android.com/studio/build/multidex#kts }


推荐阅读