Voice recording with MediaRecorder Android Studio

0

I'm working on a project with voice recording, I'm halfway gone, I already have the recorder working and saving the recording according to the code below, but I'm having some problems: 1º I can not create a folder to save the I can not list the audios in the listView, 3rd I have no idea how to delete the audios after they have been created and displayed in the ListView. follows the code of the .java and XML writer. NOTE: I'm not going to put the listview's display code because it has nothing implemented.

import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.Random;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

public class Gravador extends AppCompatActivity {

Button buttonStart, buttonStop, buttonPlayLastRecordAudio, buttonStopPlayingRecording ;
String AudioSavePathInDevice = null;
MediaRecorder mediaRecorder ;
Random random ;
String RandomAudioFileName = "ABCDEFGHIJKLMNOP";
public static final int RequestPermissionCode = 1;
MediaPlayer mediaPlayer ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gravador);

    buttonStart = (Button) findViewById(R.id.button);
    buttonStop = (Button) findViewById(R.id.button2);
    buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
    buttonStopPlayingRecording = (Button)findViewById(R.id.button4);

    buttonStop.setEnabled(false);
    buttonPlayLastRecordAudio.setEnabled(false);
    buttonStopPlayingRecording.setEnabled(false);

    random = new Random();

    buttonStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if(checkPermission()) {

                AudioSavePathInDevice = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + CreateRandomAudioFileName(5) + "AudioRecording.3gp";

                MediaRecorderReady();

                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                buttonStart.setEnabled(false);
                buttonStop.setEnabled(true);

                Toast.makeText(Gravador.this, "Recording started", Toast.LENGTH_LONG).show();
            }
            else {

                requestPermission();

            }

        }
    });

    buttonStop.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            mediaRecorder.stop();

            buttonStop.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);
            buttonStart.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);

            Toast.makeText(Gravador.this, "Recording Completed", Toast.LENGTH_LONG).show();

        }
    });

    buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) throws IllegalArgumentException, SecurityException, IllegalStateException {

            buttonStop.setEnabled(false);
            buttonStart.setEnabled(false);
            buttonStopPlayingRecording.setEnabled(true);

            mediaPlayer = new MediaPlayer();

            try {
                mediaPlayer.setDataSource(AudioSavePathInDevice);
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }

            mediaPlayer.start();

            Toast.makeText(Gravador.this, "Recording Playing", Toast.LENGTH_LONG).show();

        }
    });

    buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            buttonStop.setEnabled(false);
            buttonStart.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);

            if(mediaPlayer != null){

                mediaPlayer.stop();
                mediaPlayer.release();

                MediaRecorderReady();

            }

        }
    });
}

public void MediaRecorderReady(){

    mediaRecorder=new MediaRecorder();

    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

    mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);

    mediaRecorder.setOutputFile(AudioSavePathInDevice);

}

public String CreateRandomAudioFileName(int string){

    StringBuilder stringBuilder = new StringBuilder( string );

    int i = 0 ;
    while(i < string ) {

        stringBuilder.append(RandomAudioFileName.charAt(random.nextInt(RandomAudioFileName.length())));

        i++ ;
    }
    return stringBuilder.toString();

}

private void requestPermission() {

    ActivityCompat.requestPermissions(Gravador.this, new String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);

}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case RequestPermissionCode:
            if (grantResults.length > 0) {

                boolean StoragePermission = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean RecordPermission = grantResults[1] == PackageManager.PERMISSION_GRANTED;

                if (StoragePermission && RecordPermission) {

                    Toast.makeText(Gravador.this, "Permission Granted", Toast.LENGTH_LONG).show();
                }
                else {
                    Toast.makeText(Gravador.this,"Permission Denied",Toast.LENGTH_LONG).show();

                }
            }

            break;
    }
}

public boolean checkPermission() {

    int result = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE);
    int result1 = ContextCompat.checkSelfPermission(getApplicationContext(), RECORD_AUDIO);

    return result == PackageManager.PERMISSION_GRANTED && result1 == PackageManager.PERMISSION_GRANTED;
}

}

Writer XML

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/imageView"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:src="@drawable/mic_pic"/>

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Record"
    android:id="@+id/button"
    android:layout_below="@+id/imageView"
    android:layout_alignParentLeft="true"
    android:layout_marginTop="37dp"
    />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="STOP"
    android:id="@+id/button2"
    android:layout_alignTop="@+id/button"
    android:layout_centerHorizontal="true"
    />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Play"
    android:id="@+id/button3"
    android:layout_alignTop="@+id/button2"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="STOP PLAYING RECORDING "
    android:id="@+id/button4"
    android:layout_below="@+id/button2"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="10dp"

        />
</RelativeLayout>
    
asked by anonymous 07.02.2017 / 02:28

1 answer

0

Well you have more than one doubt so I'll try to help you in steps:

  • Save audio to a specified folder:
  • According to this gringo OS answer :

    File f = new File(Environment.getExternalStorageDirectory() + "/suapasta");
    
    if (f.isDirectory()) {
            //Seu codigo caso o "suapasta" seja um diretorio
    
    } else {
    
            // cria um objeto File pro diretorio pai
            File wallpaperDirectory = new File("/sdcard/Wallpaper/");
            // cria a pasta caso seja necessario
            wallpaperDirectory.mkdirs();
           // cria o objeto File pro output
           File outputFile = new File(wallpaperDirectory, filename);
           // agora adiciona o OutputStream no seu arquivo
           FileOutputStream fos = new FileOutputStream(outputFile);
    
    }
    

    This code checks if the location where you want to save is a folder (it will not be the first time you save, or if you delete the data from the device) and if it is, you already saved it directly as you would in the root folder, create the folder for you and there you save the file (I recommend a backup method to avoid duplication of code)

  • Show in listview
  • This looks more like a question of not knowing how ListView works than having to do with audio, so I strongly advise you to read the ListView documentation (unless it's a requirement to use ListView, I also strongly recommend , but strongly even, take a look at the RecyclerView instead of the ListView)

    Follow the documentation:

    ListView

    Creating Lists and Cards

    But the basic idea is that you need to create a layout for each item in your list, have a list of audio objects (or a container class with more information about the audio) that will be passed pro pro adapter, create an adapter that relates your layout to each item in the list (look for ListView / RecyclerView adapter that finds a lot on Google) and I believe that you also want to relate each audio to a list element, do on the adapter when you understand the concept.

  • Delete your audios
  • Well, I did not understand this question very well, because if you delete them they will not be able to use them in ListView to play, so if you can leave a comment explaining better what you meant by what I edit. >

    I'm sorry if I did not answer all the questions but it was a very long question, I hope I have helped

        
    07.02.2017 / 11:50