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önder