XamarinXamarin.Android

Xamarin.Android Kameradan Fotoğraf Çekme | MediaStore

İçindekiler

Bu yazımda Xamarin.Android uygulamalarınızda MediaStore ile kameradan nasıl fotoğraf çekeceğinizi ve bunları ImageView’e nasıl yerleştireceğinizi anlatacağım. Ayrıca, çektiğiniz görüntülere isim verebilecek ve bu görüntüleri yerel klasörde saklayabileceksiniz. Aşağıdaki adımları sırasıyla uygulayarak sonuca ulaşabilirsiniz.

Eğer cihazınızın kamerasından değil galeriden resim seçmek istiyorsanız Xamarin.Android Galeriden Görüntü Seçme | Media Eklentisi adlı yazımı inceleyebilirsiniz.

1) Camera.xml adında bir Layout oluşturun

Öncelikle, arayüz için bir düzene ihtiyacınız var. Bir düzen eklemek için projede Kaynaklar/layouts klasörüne sağ tıklayın ve Ekle>Yeni Öğe>XML Dosyası‘nı seçerek yeni bir layout oluşturun. Ben bu düzeni Camera.xml olarak adlandırdım. Siz istediğiniz gibi adlandırabilirsiniz.

Burada kamerayı açmak için bir Buton ve görüntüyü Camera.xml düzenine yerleştirmek için bir ImageView ekleyin. Ardından butonun ve ImageView’in id değerlerini aşağıdaki gibi ayarlayın.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="open Camera" />
    <ImageView
        android:src="@android:drawable/ic_menu_gallery"
        android:layout_width="fill_parent"
        android:layout_height="300.0dp"
        android:id="@+id/imageView1"
        android:adjustViewBounds="true" />
    <Button
        android:text="Send Message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/sendCamera" />
</LinearLayout>
Xamarin.Android Kameradan Görüntü Çekme
Camera.xml layout

2) CameraActivity.cs adında bir aktivite oluşturun

Camera.xml düzenini ekledikten sonra, bu düzenin etkinliğini oluşturmanız gerekir. Bu etkinlik, Camera.xml düzeninin görünümlerinin metotlarını içerecektir.

Yeni bir aktivite eklemek için Resources klasörüne sağ tıklayın ve Ekle>Yeni Öğe>Aktivite‘yi seçin. Ben bu etkinliğe CameraActivity.cs adını verdim. Siz istediğiniz gibi adlandırabilirsiniz.

Daha sonra, bu etkinliğin düzenini Camera.xml düzeni olarak ayarlamanız gerekir. Bunu yapmak için, önce buton ve ImageView için gerekli değişkenleri tanımlayın. Ardından OnCreate() yönteminde tıklama metotlarını tanımlayın.

Burada, onCreate() metodunu dikkatlice inceleyin. OnCreate() metodu ilk olarak IsThereAnAppToTakePictures() metoduyla kamerayı kullanan bir uygulama olup olmadığını kontrol eder. Eğer yoksa, CreateDirectoryForPictures() metoduyla görüntü dosyası için bir dizin oluşturur.

Son olarak, OnActivityResult() metodu, Bitmap kullanılarak ImageView’da kameradan alınan görüntüyü görüntüler.

public class CameraActivity : Activity
{

    private File _dir;
    private File _file;
    private ImageView _imageView;

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        // make it available in the gallery
        Intent mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
        Uri contentUri = Uri.FromFile(_file);
        mediaScanIntent.SetData(contentUri);
        SendBroadcast(mediaScanIntent);

        // display in ImageView. We will resize the bitmap to fit the display
        // Loading the full sized image will consume to much memory 
        // and cause the application to crash.
        int height = _imageView.Height;
        int width = Resources.DisplayMetrics.WidthPixels;
        using (Bitmap bitmap = _file.Path.LoadAndResizeBitmap(width, height))
        {
            _imageView.RecycleBitmap();
            _imageView.SetImageBitmap(bitmap);

            string filePath = _file.Path;
        }
    }

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.Camera);

        if (IsThereAnAppToTakePictures())
        {
            CreateDirectoryForPictures();

            Button sendBtn = FindViewById<Button>(Resource.Id.sendCamera);
            Button button = FindViewById<Button>(Resource.Id.myButton);
            _imageView = FindViewById<ImageView>(Resource.Id.imageView1);

            sendBtn.Click += SendBtn_Click;
            button.Click += TakeAPicture;
        }
    }

    private void SendBtn_Click(object sender, EventArgs e)
    {
        var intent = new Intent();
        Bitmap bitmap = _file.Path.LoadAndResizeBitmap(50, 50);
        string bit = Convert.ToString(bitmap);
        intent.PutExtra("bitmap", bit);

        Uri contentUri = Uri.FromFile(_file);
        string uriName = Convert.ToString(contentUri);

        string filePath = _file.Path;
        intent.PutExtra("filepath", filePath);
        intent.PutExtra("image3", uriName);
        SetResult(Result.Ok, intent);
        Finish();

    }
    private void CreateDirectoryForPictures()
    {
        _dir = new File(Environment.GetExternalStoragePublicDirectory(Environment.DirectoryPictures), "CameraAppDemo");
        if (!_dir.Exists())
        {
            _dir.Mkdirs();
        }
    }

    private bool IsThereAnAppToTakePictures()
    {
        Intent intent = new Intent(MediaStore.ActionImageCapture);
        IList<ResolveInfo> availableActivities = PackageManager.QueryIntentActivities(intent, PackageInfoFlags.MatchDefaultOnly);
        return availableActivities != null && availableActivities.Count > 0;
    }

    private void TakeAPicture(object sender, EventArgs eventArgs)
    {
        Intent intent = new Intent(MediaStore.ActionImageCapture);

        _file = new File(_dir, String.Format("myPhoto_{0}.jpg", Guid.NewGuid()));

        intent.PutExtra(MediaStore.ExtraOutput, Uri.FromFile(_file));

        StartActivityForResult(intent, 0);
    }
}

Sonuç olarak uygulama aşağıdaki gibi çalışacaktır. Önce OPEN CAMERA butonuyla kamera açılır. Ardından kameradan bir fotoğraf çekersiniz. Son olarak, çektiğiniz bu fotoğraf ImageView’da görünür. Dilerseniz bu görüntüyü SEND MESSAGE butonu ile diğer sayfalara da gönderebilirsiniz. Kamera sayfasına eklediğiniz görüntüyü OnSaveClick() yönteminde PutExtra olarak gönderebilirsiniz. Yani diğer sayfalarda bu ekstraları çekip görüntü değerlerine erişebilirsiniz.

Xamarin.Android Kameradan Görüntü Çekme
Xamarin.Android Kameradan Görüntü Çekme

Metotlar(Methods), Alanlar(Fields) ve Özellikler(Properties)

MediaStore Sınıfı

  • ActionImageCapture(): Kamera uygulamasının bir görüntüyü yakalayıp geri döndürmesine izin veren bir Standart Intent aksiyonudur.
  • ExtraOutput: İstenen görüntüyü veya videoyu depolamak için kullanılacak bir içerik çözümleyici URI’sini belirtmek için kullanılan Intent-extra’nın adı.

Environment Sınıfı

  • GetExternalStoragePublicDirectory(String): Belirli bir türdeki dosyaları yerleştirmek için üst düzey bir genel harici depolama dizini edinir.
  • DirectoryPictures: Kullanıcının kullanabileceği resimlerin yerleştirileceği standart dizin.

Sonuç

Bu yazımda Xamarin.Android uygulamalarınızda MediaStore ile kameradan nasıl fotoğraf çekeceğinizi ve bunları ImageView’e nasıl yerleştireceğinizi anlattım. Umarım faydalı olmuştur.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu