Membuat Perekam Suara Android Anda Sendiri Menggunakan Kotlin

Membuat Perekam Suara Android Anda Sendiri Menggunakan Kotlin


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() } 

Konfigurasikan MediaRecorder


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 .

Source: https://habr.com/ru/post/id444616/


All Articles