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