Mobil Programlama

Android

DERS PROGRAMI
Android 301 Ders Programı

Ses Kayıt İşlemleri

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

Zaman zaman uygulamalarımızda herhangi bir ortam sesini kayıt etmemiz gerekebilir. Bu yazımızda Android cihazın ses kayıt kaynaklarından birini kullanarak ortamdaki sesleri nasıl bir ses dosyasına aktaracağımızı göstereceğiz.

Öncelikle yeni bir uygulama oluşturduktan sonra AndroidManifest dosyasına aşağıdaki izinleri veriyoruz.

 



<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.turkcell.recorder"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="8" />

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.turkcell.recorder.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

 

android.permission.RECORD_AUDIO adlı izin uygulamamıza ses kayıt iznini veriyor. Bu sayede mikrofon gibi ses kayıt donanımlarına erişim hakkı elde etmiş oluyoruz. android.permission.WRITE_EXTERNAL_STORAGE ise harici SD kart üzerine yazma hakkı sağlıyor. Dosyamızı SD kart üzerine yazacağımızdan bu izine ihtiyacımız olacak.

Şimdi ise uygulamamıza basit bir tasarım yapalım. Sadece bir ekran ve tek bir düğmeden oluşan uygulamamızda kullanıcı düğmeye bastığında kayıt başlayacak ve tekrar bastığında kayıt sonlanacak. Kayıt bittiğinde ise kayıt edilen dosyayı çalarak kullanıcıya sesi tekrar dinleteceğiz.

 



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

    <Button
        android:id="@+id/record_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_vertical|center_horizontal"
        android:text="@string/record" />

</RelativeLayout>

 

Düğme üzerindeki metin değerlerini (Kayıt / Durdur) string.xml dosyası içerisinden alacağız. Bu dosyayı da aşağıdaki gibi düzenleyelim;

 

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <string name="app_name">AudioRecord</string>
    <string name="action_settings">Settings</string>
    <string name="record">Kayıt</string>
    <string name="stop">Durdur</string>

</resources>

 

Yukarıdaki XML dosyalarında gerekli değişiklikleri yaptıktan sonra MainActivity dosyasına girelim ve öncelikle onCreate metodunda düğmeyle ilgili düzenlemeleri yapalım;

 



private MediaRecorder recorder;
   private MediaPlayer   player;
   private Button        recordButton;

   private final String  filepath = Environment.getExternalStorageDirectory().getPath() + "/record.3gp";

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

      recordButton = (Button) findViewById(R.id.record_button);
      recordButton.setOnClickListener(new OnClickListener() {

         @Override
         public void onClick(View v) {
            String recordString = getResources().getString(R.string.record);
            String stopString = getResources().getString(R.string.stop);
            if (recordString.equals(recordButton.getText().toString())) {
               startRecording();
               recordButton.setText(stopString);
            }
            else {
               stopRecording();
               recordButton.setText(recordString);
               startPlaying();
            }
         }
      });
   }

 

Burada öncelikle üç adet değişken tanımlıyoruz. MediaRecorder sınıfı Android'de ses kayıt işlemlerini gerçekleştiren sınıftır. MediaPlayer ise bir ses kaynağını oynatmak için kullanılır. Ses kayıt işlemi bittikten sonra dosyayı bu sınıf yardımıyla oynatacağız. filePath değişkeni ise dosyanın kayıt edileceği yeri belirtir. Biz burada harici SD kart üzerinde record.3gp adında bir dosyaya kayıt edilmesini belirtiyoruz.

onCreate metodu içerisinde ise kayıt düğmesi ile ilgili aksiyonları tanımlıyoruz. Eğer düğme üzerinde "Kayıt" sözcüğü varsa kullanıcı düğmeye bastığında startRecording metodu çalışıyor ve kayıt işlemi başlıyor. Aynı zamanda düğmenin değeri "Durdur" olarak güncelleniyor ve kullanıcı tekrar düğmeye bastığında stopRecording metodu yardımıyla kayıt işleminin bitmesi sağlanıyor. startPlaying ise kayıt bittiğinde devreye giriyor ve kullanıcıya fikir vermesi açısından ses kaydı oynatılıyor.

NOT: getResources metodu string.xml içerisindeki değerlere ulaşmak için kullanılabilir. Şimdi startRecording metoduna göz atalım;

 

private void startRecording() {
      recorder = new MediaRecorder();
      recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
      recorder.setOutputFile(filepath);
      try {
         recorder.prepare();
         recorder.start();
      }
      catch (IllegalStateException e) {
         e.printStackTrace();
      }
      catch (IOException e) {
         e.printStackTrace();
      }
   }

 

Bu metod içerisinde öncelikle yeni bir MediaRecorder tanımlaması yapılır. Öncelikle setAudioSource ile kayıt yapılacak kaynak belirlenir. MIC değeri kaydın mikrofon üzerinden gelen ses ile yapılacağını gösterir. setOutputFormat ise kaydın hangi sıkıştırma formatıyla çevrileceğini belirtir. Biz burada ufak boyutlu bir dosya istediğimizden 3GP adı verilen sıkıştırma formatını tercih ettik. setAudioEncoder metodu ise kullanılacak codec değerini seçer. setOutputFile ile oluşturulan ses dosyasının kayıt edileceği konumu belirtiriz.

Kayıt işlemini başlatmak için öncelikle prepare metodu ile MediaRecorder sınıfı verilen parametrelerle kayıt işlemi için hazırlanır. Eğer bu noktada bir sorun oluşursa IllegalStateException hatası ile sorunun sebebi bize bildirilir. Bir sorun oluşmazsa start metodu ile kaydı başlatabiliriz.

 

private void stopRecording() {
      if (recorder != null) {
         recorder.stop();
         recorder.reset();
         recorder.release();
         recorder = null;
      }
   }

 

stopRecording metodunda öncelikle stop komutuyla MediaRecorder'da kayıt işlemini durdurulmasını isteriz. Kayıt durduğunda ses dosyası diske yazılır ve mikrofondan ses alma durdurulur. Daha sonra reset metodu ile MediaRecorder objesini ilk durumuna (herhangi bir tanım yapılmadığı andaki konuma) döndürebiliriz. release metodundan sonra MediaRecorder bellekten silinir ve bir daha kullanılamaz hale gelir. release işleminden sonra tekrar kullanım için MediaRecorder'ın yeniden oluşturulması gerekir.

 

startPlaying metodunda ise oluşturulan dosyanın oynatılması sağlanır. Burada MediaRecorder ile oluşturulan ses dosyası MediaPlayer ile oynatılır.

 



private void startPlaying() {
      player = new MediaPlayer();
      player.setVolume(1.0f, 1.0f);
      try {
         player.setDataSource(filepath);
         player.prepare();
         player.start();
         player.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer arg0) {
               player.stop();
               player.release();
               player = null;
            }
         });
      }
      catch (Exception e) {
      }
   }

 

MediaPlayer ilk oluşturulduğunda setVolume ile sesin en yüksek değere (0 - 1 arası) gelmesi sağlanır. Daha sonra setDataSource metodu ile hangi dosyanın oynatılacağı MediaPlayer'a bildirilir. prepare işlemi tıpkı MediaRecorder'da olduğu gibi MediaPlayer'ın belirtilen ayarlarla hazırlanmasını sağlar. start metodu ise dosyayı çalar ve kullanıcı hoparlörden kayıt ettiği sesi dinlemeye başlar. Dosya oynatılması bittikten sonra setOnCompletionListener metodu uyarılır ve MediaPlayer objesi yok edilir.