我怎样才能等到imageCapture初始化的那一刻,我尝试使用
while (imageCapture == null) {}
,但它只会使应用程序崩溃,使用延迟也不是一个选项,因为我也想用后置摄像头拍照,而且它会花费太长时间,因为有时可能需要一些时间来初始化
这是我当前的代码
class MainActivity : AppCompatActivity() {
private var imageCapture: ImageCapture? = null
private lateinit var viewBinding: ActivityMainBinding
private lateinit var outputDirectory: File
private lateinit var cameraExecutor: ExecutorService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
supportActionBar?.hide()
startCamera()
takePhoto()
startCameraBack()
takePhoto()
outputDirectory = getOutputDirectory()
cameraExecutor = Executors.newSingleThreadExecutor()
}
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build()
preview.setSurfaceProvider(findViewById<PreviewView>(R.id.viewFinder).surfaceProvider)
val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
imageCapture = ImageCapture.Builder().build()
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
}, ContextCompat.getMainExecutor(this))
}
private fun takePhoto() {
val imageCapture = imageCapture ?: return
val photoFile = File(
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".jpg"
)
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
var savedUri: Uri = Uri.fromFile(photoFile)
Toast.makeText(this@MainActivity,"Saved to $savedUri", Toast.LENGTH_LONG).show()
}
})
}
private fun getOutputDirectory(): File {
val mediaDir = externalMediaDirs.firstOrNull()?.let {
File(it, resources.getString(R.string.app_name)).apply { mkdirs() }
}
return if (mediaDir != null && mediaDir.exists())
mediaDir else filesDir
}
companion object {
private const val TAG = "CameraXGFG"
private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
}
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
}
您的问题来自异步的
cameraProviderFuture.addListener()
。调用 imageCapture
后访问 addListener()