
Kerangka kerja multimedia Android mendukung perekaman dan pemutaran audio. Pada artikel ini, saya akan menunjukkan bagaimana mengembangkan aplikasi perekaman sederhana yang akan merekam audio dan menyimpannya di penyimpanan lokal perangkat Android menggunakan MediaRecorder
dari Android SDK.
Anda juga akan belajar cara meminta izin dari pengguna secara waktu nyata dan cara bekerja dengan penyimpanan lokal perangkat Android.
Pembuatan Antarmuka Pengguna
Pertama, kita perlu membuat antarmuka untuk merekam suara. Ini adalah tata letak tiga tombol sederhana yang akan digunakan untuk memulai, menjeda / melanjutkan, dan berhenti merekam.
<?xml version="1.0" encoding="utf-8"?> <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"> <TextView android:id="@+id/textview_sound_recorder_heading" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Sound Recorder" android:layout_centerHorizontal="true" android:textSize="32dp" android:textStyle="bold" android:textColor="#000" android:layout_marginTop="32dp"/> <Button android:id="@+id/button_start_recording" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start" android:layout_alignParentBottom="true" android:layout_marginLeft="32dp" android:layout_marginBottom="32dp" android:layout_centerVertical="true"/> <Button android:id="@+id/button_pause_recording" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pause" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="32dp"/> <Button android:id="@+id/button_stop_recording" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginBottom="32dp" android:layout_marginRight="32dp"/> </RelativeLayout>
Diperlukan Izin Izin
Setelah membuat antarmuka pengguna, kita dapat mulai menggunakan MediaRecorder
untuk mengimplementasikan fungsionalitas dasar aplikasi kita. Tetapi pertama-tama, kita perlu meminta izin yang diperlukan untuk merekam audio dan mengakses penyimpanan lokal. Kami akan melakukan ini dengan beberapa baris kode sederhana di file AndroidManifest.xml
kami:
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Anda juga perlu memeriksa apakah pengguna telah menyetujui izin sebelum kami dapat menggunakan MediaRecorder
kami. Ayo lakukan di Activity MainActivity.kt
:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE) ActivityCompat.requestPermissions(this, permissions,0) }
Catatan: nanti baris kode ini akan dipindahkan ke OnClickListener
tombol mulai untuk merekam audio, sehingga kami dapat memastikan bahwa MediaRecorder
tidak akan MediaRecorder
tanpa izin yang diperlukan.
Rekam dan simpan audio
Menambahkan OnClickListeners
Tambahkan pendengar ke tombol sehingga mereka merespons acara pengguna. Seperti yang saya sebutkan sebelumnya, cek untuk izin yang diperlukan akan ditambahkan ke OnClickListener dari tombol mulai perekaman audio:
button_start_recording.setOnClickListener { if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE) ActivityCompat.requestPermissions(this, permissions,0) } else { startRecording() } } button_stop_recording.setOnClickListener{ stopRecording() } button_pause_recording.setOnClickListener { pauseRecording() }
Selanjutnya kita perlu menentukan jalur untuk menyimpan audio dan mengkonfigurasi MediaRecorder.
private var output: String? = null private var mediaRecorder: MediaRecorder? = null private var state: Boolean = false private var recordingStopped: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) output = Environment.getExternalStorageDirectory().absolutePath + "/recording.mp3" mediaRecorder = MediaRecorder() mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC) mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC) mediaRecorder?.setOutputFile(output) }
Kami mengambil jalur ke akar penyimpanan eksternal kami dan menambahkan nama catatan dan tipe file kami ke sana. Setelah itu, kami membuat objek MediaRecorder
dan menentukan sumber suara, audio MediaRecorder
, format dan file untuk rekaman.
Rekam dan simpan audio
Kode yang digunakan untuk memulai MediaRecorder
didefinisikan dalam OnClickListener
tombol mulai perekaman audio:
private fun startRecording() { try { mediaRecorder?.prepare() mediaRecorder?.start() state = true Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show() } catch (e: IllegalStateException) { e.printStackTrace() } catch (e: IOException) { e.printStackTrace() } }
Seperti yang Anda lihat, kita perlu memanggil fungsi prepare
sebelum kita dapat mulai merekam. Kami juga menyematkan panggilan ke blok try-catch sehingga aplikasi tidak rusak ketika fungsi prepare
gagal.
OnClickListeners
berhenti merekam sangat mirip dengan kode di atas.
private fun stopRecording() { if (state) { mediaRecorder?.stop() mediaRecorder?.release() state = false } else { Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show() } }
Di sini kita memeriksa apakah MediaRecorder
sedang MediaRecorder
sebelum kita berhenti merekam karena aplikasi kita akan rusak jika metode stop
dipanggil sementara MediaRecorder
tidak akan MediaRecorder
. Setelah itu, kami mengubah variabel status ke false
sehingga pengguna tidak dapat menekan tombol stop lagi.
Tetap bagi kami untuk menentukan OnClickListener
untuk tombol pause / resume.
@SuppressLint("RestrictedApi", "SetTextI18n") @TargetApi(Build.VERSION_CODES.N) private fun pauseRecording() { if (state) { if (!recordingStopped) { Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show() mediaRecorder?.pause() recordingStopped = true button_pause_recording.text = "Resume" } else { resumeRecording() } } } @SuppressLint("RestrictedApi", "SetTextI18n") @TargetApi(Build.VERSION_CODES.N) private fun resumeRecording() { Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show() mediaRecorder?.resume() button_pause_recording.text = "Pause" recordingStopped = false }
Dalam dua metode ini, kami memeriksa apakah MediaRecorder
. Jika berhasil, kami akan berhenti merekam dan mengubah teks tombol untuk melanjutkan. Menekannya lagi akan melanjutkan perekaman.
Akhirnya, kita dapat merekam audio dan mendengarkannya dengan membuka file recording.mp3
, yang akan disimpan di penyimpanan lokal kita. Cukup buka file explorer dan lakukan pencarian pada nama file recording.mp3
.
Kode sumber
Berikut ini adalah kode sumber lengkap aplikasi kami:
package com.example.android.soundrecorder import android.Manifest import android.annotation.SuppressLint import android.annotation.TargetApi import android.content.pm.PackageManager import android.media.MediaRecorder import android.os.Build import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.os.Environment import android.support.v4.app.ActivityCompat import android.support.v4.content.ContextCompat import android.widget.Toast import kotlinx.android.synthetic.main.activity_main.* import java.io.IOException class MainActivity : AppCompatActivity() { private var output: String? = null private var mediaRecorder: MediaRecorder? = null private var state: Boolean = false private var recordingStopped: Boolean = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mediaRecorder = MediaRecorder() output = Environment.getExternalStorageDirectory().absolutePath + "/recording.mp3" mediaRecorder?.setAudioSource(MediaRecorder.AudioSource.MIC) mediaRecorder?.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) mediaRecorder?.setAudioEncoder(MediaRecorder.AudioEncoder.AAC) mediaRecorder?.setOutputFile(output) button_start_recording.setOnClickListener { if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { val permissions = arrayOf(android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE) ActivityCompat.requestPermissions(this, permissions,0) } else { startRecording() } } button_stop_recording.setOnClickListener{ stopRecording() } button_pause_recording.setOnClickListener { pauseRecording() } } private fun startRecording() { try { mediaRecorder?.prepare() mediaRecorder?.start() state = true Toast.makeText(this, "Recording started!", Toast.LENGTH_SHORT).show() } catch (e: IllegalStateException) { e.printStackTrace() } catch (e: IOException) { e.printStackTrace() } } @SuppressLint("RestrictedApi", "SetTextI18n") @TargetApi(Build.VERSION_CODES.N) private fun pauseRecording() { if (state) { if (!recordingStopped) { Toast.makeText(this,"Stopped!", Toast.LENGTH_SHORT).show() mediaRecorder?.pause() recordingStopped = true button_pause_recording.text = "Resume" } else { resumeRecording() } } } @SuppressLint("RestrictedApi", "SetTextI18n") @TargetApi(Build.VERSION_CODES.N) private fun resumeRecording() { Toast.makeText(this,"Resume!", Toast.LENGTH_SHORT).show() mediaRecorder?.resume() button_pause_recording.text = "Pause" recordingStopped = false } private fun stopRecording(){ if (state) { mediaRecorder?.stop() mediaRecorder?.release() state = false } else { Toast.makeText(this, "You are not recording right now!", Toast.LENGTH_SHORT).show() } } }
Kesimpulan
Sekarang Anda tahu cara kerja MediaRecorder
, cara meminta izin waktu-nyata, dan mengapa itu penting untuk dilakukan. Anda juga belajar tentang penyimpanan lokal perangkat Android Anda dan cara menyimpan data di dalamnya.
Versi yang lebih kompleks dari aplikasi ini, yang memiliki beberapa fitur tambahan, seperti memutar rekaman Anda menggunakan MediaPlayer
, tersedia di Github .