Как мне дождаться инициализации imageCapture, чтобы сделать снимок?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как мне дождаться инициализации imageCapture, чтобы сделать снимок?

Сообщение Anonymous »

Как мне дождаться момента инициализации 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(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()
}


Подробнее здесь: https://stackoverflow.com/questions/784 ... -a-picture
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»