4 Nisan 2010 Pazar

Android'de ses kayıt

Android'de ses kayıt

Bu yazıda Android'de basit bir ses kayıt uygulamasının nasıl yapılacağını anlatacağız. Uygulamamız Android içindeki basit ses kayıt ve daha sonrasında oynatma işlemlerini gerçekleştiriyor olacak.

İlk olarak programımız için bir arayüz hazırlıyoruz. Sade arayüzümüzde kayıt başlatma ve durdurma düğmeleriyle, yaptığımız kaydı çalmak için "Play" butonu olacak. Kullanacağımız Layout dosyamız aşağıdaki gibidir;

<?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:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/startrecording"
android:text="Kayıt Baslat" />
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/stoprecording"
android:text="Kayıt Durdur" />
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/playrecording"
android:text="Son Kaydı Oynat" />
</LinearLayout>

Bu tasarımla ekranda 3 adet buton görebiliyor olmanız lazım. Şimdi yapacağımız kayıt düğmesine bastığımızda mikrofon kaynağından ses kaydına başlanması ve bunun "dur" düğmesi tıklanana kadar devam etmesi. Ardından "SOn Kaydı Oynat" dendiğinde son yapılan kaydın oynatılması.

public class IBMAudio extends Activity {

// MediaRecorder nesnesi
private MediaRecorder mrec = null;

private Button startRecording = null;
private Button stopRecording = null;
private Button playRecording = null;
// kayıt dosyası
File audiofile = null;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// MediaRecorder oluşturuyoruz
mrec = new MediaRecorder();
// düğme tanımlamaları
startRecording = (Button) findViewById(R.id.startrecording);
stopRecording = (Button) findViewById(R.id.stoprecording);
playRecording = (Button) findViewById(R.id.playrecording);

// audio file oluşturulmamışsa SD Card içinde rasgele bir isimle dosya yarat
if (audiofile == null) {
File sampleDir = Environment.getExternalStorageDirectory();

try {
audiofile = File.createTempFile("temp", ".3gp", sampleDir);
} catch (IOException e) {
return;
}
}

startRecording.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
startRecording.setEnabled(false);
stopRecording.setEnabled(true);
stopRecording.requestFocus();

// kaydı başlat
startRecording();
} catch (Exception ee) {
Log.e("Log", ee.getMessage());
}

}
});

stopRecording.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
startRecording.setEnabled(true);
stopRecording.setEnabled(false);
startRecording.requestFocus();
// kaydı durdur
stopRecording();
// değerleri dosyaya yaz
processaudiofile();
}
});

playRecording.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
playRecording.requestFocus();
// MediaPlayer dosyası oluştur
MediaPlayer MPX = new MediaPlayer();
try {
// dosya kaynağı olarak kayıt dosyamızı göster
MPX.setDataSource(audiofile.getAbsolutePath());
Log.d("Log", "Dosya yeri :" + audiofile.getAbsolutePath());
// oynatıcıyı hazırla
MPX.prepare();
// oynatıcıyı başlat
MPX.start();
} catch (IllegalArgumentException e) {
Log.e("Log", e.getMessage());
} catch (IllegalStateException e) {
Log.e("Log", e.getMessage());
} catch (IOException e) {
Log.e("Log", e.getMessage());
}
}
});

stopRecording.setEnabled(false);
startRecording.setEnabled(true);

}

protected void processaudiofile() {
// dosyaya yazılacak özellikleri burada belirliyoruz
ContentValues values = new ContentValues(4);
long current = System.currentTimeMillis(); // sistem tarihi

values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName()); // dosya adı
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current / 1000)); // kayıt tarihi
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); // dosya tipi
values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath()); // diskteki kayıt yeri
ContentResolver contentResolver = getContentResolver();

Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Uri newUri = contentResolver.insert(base, values); // kayıt için özellikleri veriyoruz

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); // kaydı gerçekletirir
}

// ses kaydı işlemleri burada yapılıyor
protected void startRecording() throws IOException {
mrec.setAudioSource(MediaRecorder.AudioSource.MIC); // ses kayıt kaynağı olarak mikrofonu seçiyoruz
mrec.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); // ses formatı olarak 3gp formatını seçiyoruz
mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // encoder değeri olarak AMR_NB

mrec.setOutputFile(audiofile.getAbsolutePath()); // kayıt dosyamızın yerini belirtiyoruz

mrec.prepare(); // kayıt için ortamı hazırlıyoruz
mrec.start(); // kayda başlıyoruz
}

protected void stopRecording() {
mrec.stop(); //kaydı durduruyoruz
mrec.reset(); // yeni kayıt için nesneyi ilk duruma getiriyoruz. Eğer başka kayıt yapılmayacaksa release() metodunu kullanmak gerekir.
//mrec.release();
}

}

Yapılanları kısaca özetlersek MediaRecorder nesnesi ses kaynağı ve kayıt formatı belirtildiğinde kaynaktan gelen sesi seçilen formata göre kayda başlayacaktır (örneğimizde 3gp formatı ve mikrofon). Kayda başlamadan önce prepare() metodu çağırılarak kayıt için bir ön hazırlık yapılması gerekir. start() ve stop() metodları da kaydın başlaması ve bitirilmesi için kullanılır. Kayıt bittikten sonra release() metodu çağırılırsa MediaRecorder kullandığı kaynakları serbest bırakacak ve başka bir kayıt yapmayacaktır. Eğer MediaRecorder'ı release() durumuna getirip start() metodunu çağırırsanız programınızın çöktüğünü görürsünüz. Üst üste aynı MediaRecorder nesnesiyle kayıt için nesneyi ilk duruma getirmeli yani reset() metodunu çağırmalısınız. release() metodu nesneyle yapılacak bir işlem kalmadıysa çağırılmalıdır (örneğin programdan çıkarken).

MediaPlayer nesnesi de MediaRecorder'la benzer özellikler taşır. Oynatıcıyı başlatmadan önce dosya kaynağını ve kullanılan ses formatını belirlemeli daha sonra da prepare() metoduyla oynatmaya hazır hale getirmelisiniz. start() metodu sesi çalmaya başlayacaktır. reset() metodu ise oynatıcıyı bir sonraki oynatma için hazır hale getirir.

Hiç yorum yok:

Yorum Gönder