【问题标题】:CameraX When I press Take Photo button, cant enter OnImageSavedCallbackCameraX 当我按下拍照按钮时,无法输入 OnImageSavedCallback
【发布时间】:2022-01-25 15:27:19
【问题描述】:

我尝试检查断点问题,但在此:“object : OnImageSavedCallback{ " 行,调试器不能再进一步,只是退出函数而没有任何错误。我希望有人能告诉我我缺少的部分。

我还已经将权限请求添加到 AndroidManifest.xml 以在存储上写入和读取媒体。

class MainActivity : AppCompatActivity() {
private lateinit var  binding: ActivityMainBinding

private var imageCapture:ImageCapture? = null
private lateinit var outputDirectory: File

private lateinit var  cameraExecutor:ExecutorService

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)

    outputDirectory = getOutputDirectory()
    cameraExecutor = Executors.newSingleThreadExecutor()

    if(allPermissionGranted()){
        Toast.makeText(this, "Camera Permissions are Granted", Toast.LENGTH_SHORT).show()
        startCamera()
    }
    else
    {
        ActivityCompat.requestPermissions(
            this, Constants.REQUIRED_PERMISSIONS,
            Constants.REQUEST_CODE_PERMISSIONS
        )
    }

    binding.btnTakePhoto.setOnClickListener {
        takePhoto()
    }


}

private  fun getOutputDirectory(): File{
    val mediaDir = externalMediaDirs.firstOrNull()?.let { mFile ->
        File(mFile, resources.getString(R.string.app_name)).apply {
            mkdirs()
        }
    }

    return  if(mediaDir != null && mediaDir.exists())
        mediaDir else filesDir
}

private fun takePhoto(){
    val imageCapture = imageCapture?: return

    val photoFile = File(
        outputDirectory,
        SimpleDateFormat(Constants.FILE_NAME_FORMAT,
            Locale.getDefault()).format(System.currentTimeMillis()) + ".jpg")

    val outputOption = ImageCapture.OutputFileOptions.Builder(photoFile).build()

    imageCapture.takePicture(
        outputOption, ContextCompat.getMainExecutor(this),
        object : OnImageSavedCallback{
            override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
                val savedUri = Uri.fromFile(photoFile)
                val msg = "Photo Saved"

                Toast.makeText(
                    this@MainActivity,
                    "$msg $savedUri",
                    Toast.LENGTH_LONG
                ).show()
            }

            override fun onError(exception: ImageCaptureException) {
                Log.e(Constants.TAG, "onError: ${exception.message}",exception)
            }
        }
    )
}
private fun startCamera(){
    val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

    cameraProviderFuture.addListener({

        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        val preview = Preview.Builder().build().also {
            mPreview->
            mPreview.setSurfaceProvider(
                binding.viewFinder.surfaceProvider
            )
        }
        imageCapture = ImageCapture.Builder().build()

        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        try{
            cameraProvider.unbindAll()
            cameraProvider.bindToLifecycle(
                this, cameraSelector, preview, imageCapture
            )

        }
        catch (e: Exception){
            Log.d(Constants.TAG, "startCamera Fail:", e)
        }
    }, ContextCompat.getMainExecutor(this))
}

@SuppressLint("MissingSuperCall")
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String>,
    grantResults: IntArray
) {
    if(requestCode == Constants.REQUEST_CODE_PERMISSIONS){
        if(allPermissionGranted()){
            startCamera()
        }
        else
        {
            Toast.makeText(this, "Permissions Not Granted by User", Toast.LENGTH_SHORT).show()

            finish()
        }
    }
}

private  fun allPermissionGranted() =
    Constants.REQUIRED_PERMISSIONS.all{
        ContextCompat.checkSelfPermission(
            baseContext, it
        ) == PackageManager.PERMISSION_GRANTED
    }

override fun onDestroy() {
    super.onDestroy()
    cameraExecutor.shutdown()
}

}

【问题讨论】:

    标签: android-studio kotlin camera android-camerax


    【解决方案1】:

    埃米尔汗。

    我相信错误出现在“outputOption”中。 切换到此代码并尝试运行应用程序并单击按钮。

    另一件事,当尝试运行程序并且您的应用关闭时,您可以使用“调试”查看哪一行代码出现问题。

    我希望它成功了,拥抱。

    ...

    val outputFilesOption = ImageCapture.OutputFileOptions.Builder(photoFile).build()

            imageCapture.takePicture(
                outputFilesOption,getMainExecutor(this),
                object : ImageCapture.OnImageSavedCallback {
    

    ...

    【讨论】:

    • 感谢您的回答。但仍然有同样的问题。关于调试,问题并没有真正关闭,只是退出函数并继续,控制台等没有任何错误日志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多