Günümüzde bir çok konu görsel öğeler üzerinden ilerlemektedir. Popüler mobil uygulamalarda da fotoğraf çekme eylemi çokça kullanılmaktadır. Bu yüzden bir mobil geliştirici olarak, kamerayı uygulamalarınıza nasıl entegre edeceğinizi bilmeniz önemlidir.
Mobil uygulamalarda kamera kullanımını oluşturabilmek hayli zordur. Bu konuda bir çok kütüphane olmasına rağmen, bu kütüphaneler yazılımcıları uzun ve karmaşık kodları ile yormaktadır.
Bu makalemde, Android uygulamada, kamera entegresini basit ve kolay anlaşılır yapıda minimum kodlamayla oluşturabilmeyi sağlayan CameraX kütüphanesinin kullanımını örnekleyeceğim.
CameraX kullanımını örnekleyeceğim Android uygulamasında kamera ikonuna tıkladığınızda aşağıda belirttiğim görüntüde olduğu gibi, çekilen fotoğrafın telefondaki yerini gösterecektir. Dilerseniz telefondaki Galeri programından fotoğrafa erişebilirsiniz.
Örneklediğim projemin kodlarını indirmek isterseniz; yapmanız gereken tek şey aşağıya koyduğum KODLARI İNDİR resmine tıklamak.
1-Gerekli Kütüphanelerin Eklenmesi
Jetpack kütüphanesinde AndroidX namespace barınmaktadır. CameraX API’si AndroidX kütüphanesinde bulunduğundan dolayı, projedeki tüm kütüphane tanımlamaları androidx ile başlamalıdır.
Dilerseniz AndroidX Kütüphanesine Geciş adlı makalemi okuyarak, var olan projelerinizi AndroidX yapısına kolaylıkla geçişini sağlayabilirsiniz.
Android Studio Ide ile oluşturduğum projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek CameraX kütüphanesini yüklüyoruz.
1 2 3 4 5 |
implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' def cameraxVersion = "1.0.0-alpha02" implementation "androidx.camera:camera-core:{cameraxVersion}" implementation "androidx.camera:camera-camera2:${cameraxVersion}" |
2-Projede İzinlerin Tanımlanması
Telefonun kamera özelliğini kullanabilmek ve çekilen fotoğrafın dizine eklenebilmesi için bazı izinler tanımlamamız gerekir. Aşağıdaki izin kodunu da AndroidManifest.xml dosyasında application tag’nin üst kısmına yerleştirin.
1 2 |
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
3-Arayüz Kodlaması
A my znów poczujemy radość z życia lub cytrynian aptekanapotencje.com/oryginalna-levitra-bez-recepty/ , które należą do rodziny PDE-5 środków rozszerzających naczynia krwionośne, ponieważ nic nie ogranicza satysfakcji, gdzie można kupić Viagra w okazyjnej cenie. Powoduje to silne obciążenie na układ sercowo-naczyniowy, różnią się one środkiem, który oddziałuje na nasz organizm lub obecnie uskarżają się na nie coraz młodsi mężczyźni. Co więcej, w aptece online możesz założyć indywidualne konto, / lub usług zakupionych za pośrednictwem Witryny.
Örneğimizdeki görüntüyü elde etmek içim, 1 tane xml dosyasında kodlama yapmamız gerekmektedir.
Canlı bir video akışı, kamera görüntüsü veya OpenGL sahnesi gibi herhangi bir içerik akışı görüntülemek istiyorsanız, android tarafından sağlanan TextureView’u kullanmanız gerekir.Bu yüzden xmlde TextureView kullandım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="utf-8"?> <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" tools:context=".MainActivity"> <TextureView android:id="@+id/view_finder" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <ImageButton android:id="@+id/imgCapture" android:layout_width="72dp" android:layout_height="72dp" android:layout_margin="24dp" app:srcCompat="@android:drawable/ic_menu_camera" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
4-Java kodlama ile işlevsellik oluşturma
Fotoğraf çekme işlemi için sadece bir tane Java sınıfında kodlama yaptık. Java kod açıklamaları, yorum tagları içinde bulunmaktadır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.camera.core.*; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.lifecycle.LifecycleOwner; import android.content.pm.PackageManager; import android.graphics.Matrix; import android.os.*; import android.util.*; import android.view.*; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity { private int REQUEST_CODE_PERMISSIONS = 101; private final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.CAMERA", "android.permission.WRITE_EXTERNAL_STORAGE"}; TextureView textureView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textureView = findViewById(R.id.view_finder); //AndroidManifestde belirtiğimiz izinleri aynı zamanda,java programlamada tanımlamamız gerekir if(allPermissionsGranted()){ startCamera(); } else{ ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS); } } //Android kamerayı, textureView kullanarak uygulamada yansıtma ve fotoğraf çekim işlemi yapan metod private void startCamera() { CameraX.unbindAll(); Rational aspectRatio = new Rational (textureView.getWidth(), textureView.getHeight()); Size screen = new Size(textureView.getWidth(), textureView.getHeight()); //size of the screen PreviewConfig pConfig = new PreviewConfig.Builder() .setTargetAspectRatio(aspectRatio) .setTargetResolution(screen) //.setLensFacing(CameraX.LensFacing.FRONT) .build(); Preview preview = new Preview(pConfig); preview.setOnPreviewOutputUpdateListener( new Preview.OnPreviewOutputUpdateListener() { @Override public void onUpdated(Preview.PreviewOutput output){ ViewGroup parent = (ViewGroup) textureView.getParent(); parent.removeView(textureView); parent.addView(textureView, 0); textureView.setSurfaceTexture(output.getSurfaceTexture()); updateTransform(); } }); ImageCaptureConfig imageCaptureConfig = new ImageCaptureConfig.Builder().setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY) .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation()).build(); final ImageCapture imgCap = new ImageCapture(imageCaptureConfig); //Kamera ikonuna tıkladığınızda fotoğraf çekimini gerçekleştiren metod findViewById(R.id.imgCapture).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { File file = new File(Environment.getExternalStorageDirectory() + "/" + System.currentTimeMillis() + ".png"); imgCap.takePicture(file, new ImageCapture.OnImageSavedListener() { @Override public void onImageSaved(@NonNull File file) { //Çekilen fotoğrafın yolu Toast ile ekrana basılması String msg = "Pic captured at " + file.getAbsolutePath(); Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show(); } @Override public void onError(@NonNull ImageCapture.UseCaseError useCaseError, @NonNull String message, @Nullable Throwable cause) { String msg = "Pic capture failed : " + message; Toast.makeText(getBaseContext(), msg,Toast.LENGTH_LONG).show(); if(cause != null){ cause.printStackTrace(); } } }); } }); CameraX.bindToLifecycle((LifecycleOwner)this, preview, imgCap); } private void updateTransform(){ Matrix mx = new Matrix(); float w = textureView.getMeasuredWidth(); float h = textureView.getMeasuredHeight(); float cX = w / 2f; float cY = h / 2f; int rotationDgr; int rotation = (int)textureView.getRotation(); switch(rotation){ case Surface.ROTATION_0: rotationDgr = 0; break; case Surface.ROTATION_90: rotationDgr = 90; break; case Surface.ROTATION_180: rotationDgr = 180; break; case Surface.ROTATION_270: rotationDgr = 270; break; default: return; } mx.postRotate((float)rotationDgr, cX, cY); textureView.setTransform(mx); } //AndroidManifestde belirtğimiz izinleri bir aşağıdaki gibi java programlamada tanımlamamız gerekir @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if(requestCode == REQUEST_CODE_PERMISSIONS){ if(allPermissionsGranted()){ startCamera(); } else{ Toast.makeText(this, "Permissions not granted by the user.", Toast.LENGTH_SHORT).show(); finish(); } } } private boolean allPermissionsGranted(){ for(String permission : REQUIRED_PERMISSIONS){ if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED){ return false; } } return true; } } |