Android – Kotlin – CameraX Api ile Kamera Kaydı
Merhaba Arkadaşlar,
Bu dersimizde CameraX Api ile bir video kaydetme olayını göreceğiz. Uygulama da bir buttonumuz var ve button ‘a tıkladığında Umit2 adında bir mp4 ‘ü kaydediyor. Kaydedilen kısmı log ‘tan görebilirsiniz.
Gradle için :
def camerax_version = "1.0.0-beta03"
// CameraX core library using camera2 implementation
implementation "androidx.camera:camera-camera2:$camerax_version"
// CameraX Lifecycle Library
implementation "androidx.camera:camera-lifecycle:$camerax_version"
// CameraX View class
implementation "androidx.camera:camera-view:1.0.0-alpha10"
activity dosyası :
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="//schemas.android.com/apk/res/android"
xmlns:app="//schemas.android.com/apk/res-auto"
xmlns:tools="//schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".KameraActivity">
<androidx.camera.view.CameraView
android:id="@+id/camera_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:lensFacing="back"
app:scaleType="centerCrop"
app:pinchToZoomEnabled="true"
app:captureMode="mixed"
app:flash="auto"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/video_record"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="Record Video"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
</androidx.constraintlayout.widget.ConstraintLayout>
Proje Kodları
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import android.os.Environment
import android.util.Log
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.core.ImageCapture
import androidx.camera.core.ImageCaptureException
import androidx.camera.core.VideoCapture
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import kotlinx.android.synthetic.main.activity_kamera.*
import java.io.File
class KameraActivity : AppCompatActivity() {
val TAG = KameraActivity::class.java.simpleName
var isRecording = false
var CAMERA_PERMISSION = Manifest.permission.CAMERA
var RECORD_AUDIO_PERMISSION = Manifest.permission.RECORD_AUDIO
var RC_PERMISSION = 101
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kamera)
val recordFiles = ContextCompat.getExternalFilesDirs(this, Environment.DIRECTORY_MOVIES)
val storageDirectory = recordFiles[0]
val videoRecordingFilePath = "${storageDirectory.absoluteFile}/Umit2_video.mp4"
if (checkPermissions()) startCameraSession() else requestPermissions()
video_record.setOnClickListener {
if (isRecording) {
isRecording = false
video_record.text = "Record Video"
Toast.makeText(this, "Recording Stopped", Toast.LENGTH_SHORT).show()
camera_view.stopRecording()
} else {
isRecording = true
video_record.text = "Stop Recording"
Toast.makeText(this, "Recording Started", Toast.LENGTH_SHORT).show()
recordVideo(videoRecordingFilePath)
}
}
}
private fun requestPermissions() {
ActivityCompat.requestPermissions(this, arrayOf(CAMERA_PERMISSION, RECORD_AUDIO_PERMISSION), RC_PERMISSION)
}
private fun checkPermissions(): Boolean {
return ((ActivityCompat.checkSelfPermission(this, CAMERA_PERMISSION)) == PackageManager.PERMISSION_GRANTED
&& (ActivityCompat.checkSelfPermission(this, CAMERA_PERMISSION)) == PackageManager.PERMISSION_GRANTED)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode) {
RC_PERMISSION -> {
var allPermissionsGranted = false
for (result in grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
allPermissionsGranted = false
break
} else {
allPermissionsGranted = true
}
}
if (allPermissionsGranted) startCameraSession() else permissionsNotGranted()
}
}
}
private fun startCameraSession() {
camera_view.bindToLifecycle(this)
}
private fun permissionsNotGranted() {
AlertDialog.Builder(this).setTitle("Permissions required")
.setMessage("These permissions are required to use this app. Please allow Camera and Audio permissions first")
.setCancelable(false)
.setPositiveButton("Grant") { dialog, which -> requestPermissions() }
.show()
}
private fun recordVideo(videoRecordingFilePath: String) {
camera_view.startRecording(File(videoRecordingFilePath), ContextCompat.getMainExecutor(this), object: VideoCapture.OnVideoSavedCallback {
override fun onVideoSaved(file: File) {
Toast.makeText(this@KameraActivity, "Recording Saved", Toast.LENGTH_SHORT).show()
Log.d(TAG, "onVideoSaved $videoRecordingFilePath")
}
override fun onError(videoCaptureError: Int, message: String, cause: Throwable?) {
Toast.makeText(this@KameraActivity, "Recording Failed", Toast.LENGTH_SHORT).show()
Log.e(TAG, "onError $videoCaptureError $message")
}
})
}
}
Kaynakça ve Kaynaklar :
//developer.android.com/training/camerax
//codelabs.developers.google.com/codelabs/camerax-getting-started/#6
//github.com/android/camera-samples/tree/master/CameraXBasic