Création de votre propre enregistreur vocal Android à l'aide de Kotlin

Création de votre propre enregistreur vocal Android à l'aide de Kotlin


Le cadre multimédia Android prend en charge l'enregistrement et la lecture audio. Dans cet article, je vais montrer comment développer une application d'enregistrement simple qui enregistrera de l'audio et la stockera dans le stockage local d'un appareil Android à l'aide de MediaRecorder partir du SDK Android.


Vous apprendrez également comment demander des autorisations à un utilisateur en temps réel et comment travailler avec le stockage local d'un appareil Android.


Création d'interface utilisateur


Nous devons d'abord créer une interface pour l'enregistrement sonore. Il s'agit d'une disposition simple à trois boutons qui sera utilisée pour démarrer, suspendre / reprendre et arrêter l'enregistrement.


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

Demander les autorisations requises


Après avoir créé l'interface utilisateur, nous pouvons commencer à utiliser MediaRecorder pour implémenter les fonctionnalités de base de notre application. Mais d'abord, nous devons demander les autorisations nécessaires pour enregistrer de l'audio et accéder au stockage local. Nous le ferons avec quelques lignes de code simples dans notre fichier AndroidManifest.xml :


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

Vous devez également vérifier si l'utilisateur a approuvé les autorisations avant de pouvoir utiliser notre MediaRecorder . Faisons-le dans 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) } 

Remarque: plus tard, ces lignes de code seront déplacées vers le OnClickListener bouton de démarrage pour l'enregistrement audio, afin que nous puissions nous assurer que MediaRecorder ne MediaRecorder pas sans les autorisations nécessaires.


Enregistrer et sauvegarder l'audio


Ajout d'OnClickListeners


Ajoutez des écouteurs aux boutons pour qu'ils répondent aux événements de l'utilisateur. Comme je l'ai mentionné précédemment, une vérification des autorisations nécessaires sera ajoutée à OnClickListener du bouton de démarrage de l'enregistrement 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() } 

Configurer MediaRecorder


Ensuite, nous devons spécifier le chemin pour enregistrer l'audio et configurer 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) } 

Nous prenons le chemin vers la racine de notre stockage externe et y ajoutons le nom de notre type d'enregistrement et de fichier. Après cela, nous créons un objet MediaRecorder et définissons la source sonore, l' MediaRecorder audio, le format et le fichier pour l'enregistrement.


Enregistrer et sauvegarder l'audio


Le code utilisé pour démarrer MediaRecorder est défini dans le OnClickListener enregistrement 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() } } 

Comme vous pouvez le voir, nous devons appeler la fonction de prepare avant de pouvoir commencer l'enregistrement. Nous incorporons également l'appel dans le bloc try-catch afin que l'application ne se casse pas lorsque la fonction prepare échoue.


OnClickListeners arrêt d'enregistrement sont très similaires au code ci-dessus.


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

Ici, nous vérifions si MediaRecorder est en cours d' MediaRecorder avant d'arrêter l'enregistrement car notre application stop si la méthode d' stop est appelée alors que MediaRecorder ne MediaRecorder pas. Après cela, nous modifions la variable d'état sur false afin que l'utilisateur ne puisse pas appuyer à nouveau sur le bouton d'arrêt.


Il nous reste à définir le OnClickListener pour le bouton pause / reprise.


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

Dans ces deux méthodes, nous vérifions si MediaRecorder . Si cela fonctionne, nous suspendons l'enregistrement et modifions le texte du bouton pour reprendre. Appuyez à nouveau pour reprendre l'enregistrement.


Enfin, nous pouvons enregistrer de l'audio et l'écouter en ouvrant le fichier recording.mp3 , qui sera enregistré dans notre stockage local. Ouvrez simplement l'explorateur de fichiers et effectuez une recherche sur le nom de fichier recording.mp3 .


Code source


Voici le code source complet de notre application:


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

Conclusion


Vous savez maintenant comment fonctionne MediaRecorder , comment demander des autorisations en temps réel et pourquoi il est important de le faire. Vous avez également découvert le stockage local de votre appareil Android et comment y stocker des données.


Une version plus complexe de cette application, qui possède des fonctionnalités supplémentaires, telles que la lecture de vos enregistrements à l'aide de MediaPlayer , est disponible sur Github .

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


All Articles