23 Working With The Camera
23 Working With The Camera
xml file
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
tools:context=".MainActivity">
<Button
android:id="@+id/camera_capture_button"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginBottom="50dp"
android:background="@drawable/capture_button"
android:elevation="2dp"
android:scaleType="fitCenter"
android:text="Capture Photo"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<ImageView
android:id="@+id/iv_capture"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginEnd="20dp"
android:layout_marginBottom="50dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent" />
<androidx.camera.view.PreviewView
android:id="@+id/viewFinder"
android:layout_width="match_parent"
android:layout_height="450dp"
android:layout_marginStart="20dp"
android:layout_marginTop="20dp"
android:layout_marginEnd="20dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size
android:width="118dp"
android:height="118dp" />
</shape>
import android.Manifest
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.CameraSelector
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException
import androidx.camera.core.Preview
import androidx.camera.lifecycle.ProcessCameraProvider
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_main.*
import java.io.File
import java.text.SimpleDateFormat
import java.util.*
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
supportActionBar?.hide()
// Check camera permissions if all permission granted
if (allPermissionsGranted()) {
startCamera()
} else {
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS,
REQUEST_CODE_PERMISSIONS)
findViewById<Button>(R.id.camera_capture_button).setOnClickListener {
takePhoto()
outputDirectory = getOutputDirectory()
cameraExecutor = Executors.newSingleThreadExecutor()
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT,
Locale.US).format(System.currentTimeMillis()) + ".jpg"
// been taken
imageCapture.takePicture(
outputOptions,
ContextCompat.getMainExecutor(this),
object : ImageCapture.OnImageSavedCallback {
findViewById<ImageView>(R.id.iv_capture).visibility =
View.VISIBLE
findViewById<ImageView>(R.id.iv_capture).setImageURI(savedUri)
Toast.makeText(baseContext, msg,
Toast.LENGTH_LONG).show()
Log.d(TAG, msg)
})
cameraProviderFuture.addListener(Runnable {
// Preview
.build()
.also {
it.setSurfaceProvider(viewFinder.createSurfaceProvider())
imageCapture = ImageCapture.Builder().build()
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
}
}, ContextCompat.getMainExecutor(this))
ContextCompat.checkSelfPermission(baseContext, it) ==
PackageManager.PERMISSION_GRANTED
IntArray
){
if (requestCode == REQUEST_CODE_PERMISSIONS) {
if (allPermissionsGranted()) {
startCamera()
} else {
finish()
companion object {
super.onDestroy()
cameraExecutor.shutdown()
OUTPUT: