Erstellen Sie Ihren eigenen Android Voice Recorder mit Kotlin

Erstellen Sie mit Kotlin Ihren eigenen Android-Diktiergerät


Das Android-Multimedia-Framework unterstützt die Audioaufnahme und -wiedergabe. In diesem Artikel werde ich zeigen, wie Sie eine einfache Aufnahmeanwendung entwickeln, die Audio aufzeichnet und mit dem MediaRecorder aus dem Android SDK im lokalen Speicher eines Android-Geräts MediaRecorder .


Außerdem erfahren Sie, wie Sie in Echtzeit Berechtigungen von einem Benutzer anfordern und mit dem lokalen Speicher eines Android-Geräts arbeiten.


Erstellung der Benutzeroberfläche


Zuerst müssen wir eine Schnittstelle für die Tonaufnahme erstellen. Dies ist ein einfaches Layout mit drei Tasten, mit dem die Aufnahme gestartet, angehalten / fortgesetzt und gestoppt werden kann.


 <?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> 

Berechtigungen anfordern erforderlich


Nach dem Erstellen der Benutzeroberfläche können wir MediaRecorder , um die grundlegenden Funktionen unserer Anwendung zu implementieren. Aber zuerst müssen wir die erforderlichen Berechtigungen anfordern, um Audio aufzunehmen und auf den lokalen Speicher zuzugreifen. Wir werden dies mit ein paar einfachen Codezeilen in unserer AndroidManifest.xml Datei AndroidManifest.xml :


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

Sie müssen auch überprüfen, ob der Benutzer die Berechtigungen genehmigt hat, bevor wir unseren MediaRecorder . Machen wir es in 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) } 

Hinweis: Später werden diese Codezeilen in den OnClickListener Startschaltfläche verschoben, um Audio aufzunehmen, damit wir sicherstellen können, dass MediaRecorder nicht ohne die erforderlichen Berechtigungen MediaRecorder wird.


Audio aufnehmen und speichern


Hinzufügen von OnClickListeners


Fügen Sie den Schaltflächen Listener hinzu, damit sie auf Benutzerereignisse reagieren. Wie bereits erwähnt, wird dem OnClickListener der Schaltfläche zum Starten der Audioaufnahme eine Überprüfung auf die erforderlichen Berechtigungen hinzugefügt:


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

Konfigurieren Sie MediaRecorder


Als nächstes müssen wir den Pfad angeben, um das Audio zu speichern und MediaRecorder zu konfigurieren.


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

Wir nehmen den Pfad zum Stammverzeichnis unseres externen Speichers und fügen den Namen unseres Datensatzes und den Dateityp hinzu. Danach erstellen wir ein MediaRecorder Objekt und definieren die Tonquelle, den Audio- MediaRecorder , das Format und die Datei für die Aufnahme.


Audio aufnehmen und speichern


Der zum Starten von MediaRecorder verwendete Code wird im MediaRecorder der OnClickListener Audioaufnahme definiert:


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

Wie Sie sehen, müssen wir die prepare aufrufen prepare bevor wir mit der Aufnahme beginnen können. Wir binden den Aufruf auch in den Try-Catch-Block ein, damit die Anwendung nicht unterbrochen wird, wenn die prepare fehlschlägt.


OnClickListeners Schaltfläche OnClickListeners Beenden der Aufzeichnung sind dem obigen Code sehr ähnlich.


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

Hier prüfen wir, ob MediaRecorder gerade MediaRecorder bevor wir die Aufzeichnung beenden, da unsere Anwendung MediaRecorder wird, wenn die MediaRecorder aufgerufen wird, während MediaRecorder nicht MediaRecorder . Danach ändern wir die Statusvariable in false damit der Benutzer die Stopp-Taste nicht erneut drücken kann.


Es bleibt uns OnClickListener , den OnClickListener für die Schaltfläche Pause / Fortsetzen zu definieren.


 @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 } 

Bei diesen beiden Methoden prüfen wir, ob MediaRecorder . Wenn es funktioniert, unterbrechen wir die Aufnahme und ändern den Text der Schaltfläche, um fortzufahren. Durch erneutes Drücken wird die Aufnahme fortgesetzt.


Schließlich können wir Audio aufnehmen und anhören, indem wir die Datei record.mp3 öffnen, die in unserem lokalen Speicher gespeichert wird. Öffnen Sie einfach den Datei-Explorer und suchen Sie nach dem Dateinamen recording.mp3 .


Quellcode


Hier ist der vollständige Quellcode unserer Anwendung:


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

Fazit


Jetzt wissen Sie, wie MediaRecorder funktioniert, wie Sie Echtzeitberechtigungen anfordern und warum dies wichtig ist. Sie haben auch Informationen zum lokalen Speichern Ihres Android-Geräts und zum Speichern von Daten darin erhalten.


Eine komplexere Version dieser Anwendung mit einigen zusätzlichen Funktionen, z. B. das Abspielen Ihrer Aufnahmen mit MediaPlayer , ist auf Github verfügbar.

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


All Articles