3 Temmuz 2020 Cuma

Kotlin-10 (Android Kotlin Camera - Kotlin ile camera görüntüsü alma)

Merhaba,

bu yazım Kotlin ile uygulama üzerinden kamera' ya erişim ve kamera görüntüsü almayla alakalı olacaktır.

Android ile uygulama geliştirirken varsayılan durumda dosya sistemine ve kameraya erişim kapalı olarak gelmektedir. Uygulamada kamera ile alakalı bir işlem yapılacaksa uygulamanın beyni olarak adlandırabileceğimiz AndroidManifest.xml dosyası üzerinden kameraya ve external storage'a erişim yetkisi tanımlanmalıdır. Bu tanımlama sonrasında yazılacak birkaç satır kod ile harici(3rd) kütüphane kullanmadan Kotlin ile kamera görüntüsü alınabilmektedir. Aşağıdaki adımları takip ederek geliştirdiğiniz uygulamada kamera ile görüntü alabilirsiniz.

 

İlk olarak Android Studio ile kotlin destekli bir Android uygulaması oluşturun.

 

Uygulamada kamerayı açmak ve kameradan alınacak görüntüyü kullanıcıya göstermek için birer Button ve  ImageView'a ihtiyaç olacaktır. ImageView ve Button'u layout/activity_main.xml dosyasına ekleyin.

layout/activity_main.xml dosyasının son hali aşağıdaki gibi olmalıdır.



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">

<ImageView
android:id="@+id/cameraImage"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="center"
android:src="@drawable/ic_launcher_background" />

<Button
android:id="@+id/imageCaptureBtn"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="capture image" />

</LinearLayout>

 

 

Üstte bahsedilen camera ve disk erişimi yetkileri için ise  AndroidManifest.xml dosyasına android.permission.CAMERA ve android.permission.WRITE_EXTERNAL_STORAGE izinlerini ekleyin.

AndroidManifest.xml dosyasının son hali aşağıdaki gibi olacaktır.



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tutorials.cameraimage">

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>


  

Son adım olarak ta MainActivity.kt class'ına giderek birkaç satır kotlin koduna ihtiyaç duyulacaktır. Burada imageCaptureBtn'a onClickListner set edilerek kullanıcının kamera açma isteği algılanacaktır. Button'a tıklandıktan sonra camera erişimi olup olmadığı kontrol edilecektir. Eğer erişim verilmemişse kullanıcı gereken yetkileri vermesi için Toast mesajı ile bilgilendirilecektir. Bu erişim yetkisi isteme işlemi BuildVersion (API) 23 ve üzeri için geçerlidir. Dolayısıyla kodlamada BuildVersion kontrolü yapılarak ilerlenmiştir.

 

MainActivity.kt dosyasının son hali aşağıdaki gibi olacaktır.



class MainActivity : AppCompatActivity() {

val PERMISSION_CODE: Int = 12345
val IMAGE_CAPTURE_CODE: Int = 12346
var imageUri: Uri? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

imageCaptureBtn.setOnClickListener {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(android.Manifest.permission.CAMERA)
== PackageManager.PERMISSION_DENIED
|| checkSelfPermission(
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) == PackageManager.PERMISSION_DENIED
) {
val permission = arrayOf(
android.Manifest.permission.CAMERA,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
)

requestPermissions(permission, PERMISSION_CODE)
} else {
openCamera()
}

} else {
//api<23
openCamera()
}
}
}

private fun openCamera() {
val contentValues = ContentValues()
contentValues.put(MediaStore.Images.Media.TITLE, "imageTitle")
imageUri =
contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri)
startActivityForResult(intent, IMAGE_CAPTURE_CODE)
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
when (requestCode) {
PERMISSION_CODE -> {

if (grantResults.size > 0 && grantResults[0]
== PackageManager.PERMISSION_GRANTED) {
openCamera()
} else {
Toast.makeText(this,
R.string.permission_denied_msg, Toast.LENGTH_SHORT).show()
}

}
}
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
cameraImage.setImageURI(imageUri)
}
}
}


 

Bu aşamalardan sonra uygulama ilk çalıştığında tanımlı izinler için kullanıcıdan onay isteyecektir. Gereken izinleri vererek uygulamayı test edebilirsiniz.


NOT1: Activity'nin onRequestPermission methodu override edilerek camera erişimi için gereken izin alınıp alınmadığı kontrol edilmiştir. İzin varsa camera açılmış yoksa kullanıcıya izin vermesi için mesaj gösterilmiştir. Bu işlemleri yapan kod bloğu aşağıdadır.



when (requestCode) {
PERMISSION_CODE -> {

if (grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
openCamera()
} else {
Toast.makeText(this, R.string.permission_denied_msg, Toast.LENGTH_SHORT).show()
}

}
}

 


 

NOT2: Yine FragmentActivity'nin onActivityResult methodu override edilerek kamera görüntüsü alıntıktan sonra işlemin başarılı bir şelikde snuçlandığından emin olunarak camera görüntüsü kullanıcıya gösterilmek üzere  ekrandaki ImageView'a set edilmiştir. Bu işlemleri gerçekleştiren kotlin satırları aşağıdadır.



if (resultCode == Activity.RESULT_OK) {
cameraImage.setImageURI(imageUri)
}

 


  

Uygulamanın kaynak kodlarına aşağıdaki linkten erişebilirsiniz.

github: https://github.com/lvntyldz/tutorials/tree/master/kotlin-android-app-examples/10-camera-image 

 

 

Hiç yorum yok:

Yorum Gönderme