Mobil Programlama

Android

Medya İşlemleri

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

 

Bu bölümde Android cihazımızla fotoğraf ve video çekmeyi göstereceğiz. Fotoğraf ve video çekimi için Android ile birlikte gelen kamera uygulamasından faydalanacağız. Bunu kullanabilmek için bir Intent’le uygulamayı gerekli parametreleri göndererek çağırmamız gerekiyor. Öncelikle uygulamamıza basit bir layout dosyası ile bir tasarım giydirelim:

 

<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:orientation="vertical"
tools:context=".MainActivity" >

<Button
android:id="@+id/captureVideo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Capture Video" />

<Button
android:id="@+id/takePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Picture" />

<ImageView
android:id="@+id/imagePreview"
android:layout_width="60dp"
android:layout_height="60dp" />

<VideoView
android:id="@+id/videoPreview"
android:layout_gravity="center"
android:layout_width="fill_parent"
android:layout_height="200dp" />

</LinearLayout>

 

 

Ekrana captureVideo ve takePicture id değeriyle iki adet düğme ekliyoruz. Bu düğmelerden birini fotoğraf, diğerini ise video kayıt için kullanacağız. imagePreview id’si ile tanımlanan ImageView fotoğraf çekildikten sonra görüntülenecektir. VideoView ise aynı işlemi çekilen video için gerçekleştirecek.

 

Şimdi onCreate metodu içinde aşağıdaki kodları yazalım:

 

private static final int VIDEO_ACTION_CODE = 101;
private static final int IMAGE_ACTION_CODE = 102;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  ((Button) findViewById(R.id.takePicture)).setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View v) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(takePictureIntent, IMAGE_ACTION_CODE);
    }
});

  ((Button) findViewById(R.id.captureVideo)).setOnClickListener(new OnClickListener() {

     @Override
     public void onClick(View v) {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
        startActivityForResult(takePictureIntent, VIDEO_ACTION_CODE);
    }
});
}

 

 

Düğmelerin onClickListener metotlarına kamera uygulamasını başlatacak Intent’leri yazıyoruz. Burada bir Intent MediaStore.ACTION_IMAGE_CAPTURE değeri ile başlatılırsa ekrana Android cihazın ön tanımlı fotoğraf çekme uygulamasını getirecektir. Bu ekran cihazın üreticisine göre farklılık gösterebilir ancak kullanılmasında avantaj vardır. startActivityForResult metodu, oluşturulan Intent ile birlikte bir requestCode değişkeni verilmesini ister. Bunun sebebi yeni oluşturulan fotoğraf çekme ekranından gelecek sonuçları (çekilen resim, iptal işlemi vs.) doğru değerlendirebilmesi içindir. Diğer düğme, tanımlanan MediaStore.ACTION_VIDEO_CAPTURE ise aynı şekilde video uygulamasını başlatır.

 

Bu kodu çalıştırdığımızda, kullanıcı düğmelerden birine bastığında ilgili uygulamaya gidecektir. Yukarıdaki resimde MaxiPro5 telefonunda yer alan fotoğraf çekme uygulaması görüntülenmektedir. Kullanıcı fotoğraf çekme işlemini tamamladığında uygulamamıza geri dönecektir. Geri dönme işlemi sırasında da fotoğraf çekme uygulaması bize bazı parametreler getirir. Bunları karşılamak için onActivityResult metodunu eklememiz gerekmektedir:

 

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if(resultCode != RESULT_OK) return;

  switch (requestCode) {
     case VIDEO_ACTION_CODE :
        VideoView videoView = ((VideoView) findViewById(R.id.videoPreview));
        videoView.setVideoURI(data.getData());
        videoView.setMediaController(new MediaController(this));
        videoView.requestFocus();
        videoView.start();
        break;
     
     case IMAGE_ACTION_CODE :
        Bundle extras = data.getExtras();
        ((ImageView) findViewById(R.id.imagePreview)).setImageBitmap((Bitmap) extras.get("data"));
        break;
        default:
        break;
    }
}

 

 

Eğer işlem başarıyla tamamlanmışsa resultCode değişkeni RESULT_OK değerini taşır. Video kayıt ve fotoğraf çekimi arasındaki farkı ise requestCode değişkeni ile anlarız. requestCode bizim belirlediğimiz bir değerdir ve Activity başlatılırken startActivityForResult metodu içerisinde tanımlanmıştır.

Çekilen fotoğrafı almak için data.getExtras() ile uygulamadan dönen Bundle değişkenlerini extras değişkenine saklıyoruz. Burada çekilen fotoğrafın Bitmap karşılığı, extras.get("data") metoduyla çekiliyor ve layout dosyasında tanımlanan ImageView içerisine setImageBitmap metoduyla yerleştiriliyor. Bu şekilde fotoğraf çekme işlemi bitirildiğinde ImageView içerisinde çekilen fotoğraf görüntüleniyor.

Video işleminin sonunda ise VideoView içerisine çekilen videoyu ekliyoruz. data.getData() metodu çekilen videonun yeri ile ilgili bilgi içermektedir. VideoView içerisinde yer alan setVideoURI metoduyla videomuzun yerini belirtiyoruz. MediaController tanımlaması ise video ile ilgili başlat / durdur düğmelerini oluşturmamızı sağlıyor. start() metodu videoyu başlatıyor. Bu kod sayesinde videomuz çekildikten sonra anında görüntüleme şansını buluyoruz.

Gördüğünüz gibi Android’de başka bir Activity kullanarak resim ve video çekmek oldukça kolay bir şekilde gerçekleşmektedir. Biz burada işlem tamamlandıktan sonra resim ve video ile ilgili bir ön izleme yapmayı tercih ettik. Ama alınan dosyayı başka bir sunucuya gönderme gibi farklı işlemleri de anlatılan kodlar yardımıyla gerçekleştirebilirsiniz.