class CameraXActivity : AppCompatActivity() {
companion object {
private const val TAG = "MlkitActivity"
private const val FILENAME_FORMAT = "yyyy-MM-dd-HH-mm-ss-SSS"
private const val PHOTO_EXTENSION = ".jpg"
fun getOutputDirectory(context: Context): File {
val appContext = context.applicationContext
val mediaDir = context.externalMediaDirs.firstOrNull()?.let {
File(it, appContext.resources.getString(R.string.app_name)).apply {
mkdirs()
}
}
return if (mediaDir != null && mediaDir.exists()) mediaDir
else appContext.filesDir
}
fun createFile(baseFolder: File, format: String, extension: String) =
File(
baseFolder, SimpleDateFormat(format, Locale.US)
.format(System.currentTimeMillis()) + extension
)
}
/**
* Thread Pool ~ Lib - YEmreAk, alanına bakınız
*/
private val executor = Executors.newSingleThreadExecutor()
private lateinit var cameraProviderFuture:
ListenableFuture<ProcessCameraProvider>
private lateinit var imageCapture: ImageCapture
private lateinit var outputDirectory: File
override fun onCreate(savedInstanceState: Bundle?) {
// ...
// Çekilen fotoğraların kaydedileceği yeri tanımlama
outputDirectory = getOutputDirectory(this)
// Kamera izinleri alındysa işlemleri yapma
if (allPermissionsGranted()) {
// Layouta kamerayı ekleme
pvCameraX.post { startCamera() }
ibTakePicture.setOnClickListener {
takePicture()
}
} else {
ActivityCompat.requestPermissions(
this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)
}
}
private fun startCamera() {
// ...
cameraProviderFuture.addListener(Runnable {
// ...
imageCapture = ImageCapture.Builder().apply {
setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
}.build()
// Attach use cases to camera with the same lifecycle owner
val camera = cameraProvider.bindToLifecycle(
this as LifecycleOwner, cameraSelector, cameraPreview, imageCapture
)
// ...
}, ContextCompat.getMainExecutor(this))
}
/**
* Save image that is shown in camera preview to [outputDirectory]
*/
private fun takePicture() {
val file = createFile(
outputDirectory,
FILENAME_FORMAT,
PHOTO_EXTENSION
)
val outputFileOptions = ImageCapture.OutputFileOptions.Builder(file).build()
imageCapture.takePicture(
outputFileOptions,
executor,
object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(outputFileResults:
ImageCapture.OutputFileResults) {
val msg = "Photo capture succeeded: ${file.absolutePath}"
pvCameraX.post {
Toast.makeText(this@MlkitActivity, msg, Toast.LENGTH_SHORT).show()
}
}
override fun onError(exception: ImageCaptureException) {
val msg = "Photo capture failed: ${file.absolutePath}"
pvCameraX.post {
Toast.makeText(this@MlkitActivity, msg, Toast.LENGTH_SHORT).show()
}
}
})
}
}