2017-10-03 4 views
0

J'essaie de construire un enregistreur audio dans le studio android. J'ai suivi ce tutoriel: https://www.youtube.com/watch?v=XANjoeEeQ1YAndroid Studio MediaRecorder n'enregistre pas

Qui n'a pas fonctionné pour moi? Quand j'ai appuyé sur le bouton "enregistrer", rien ne s'est passé. À partir de là, j'ai ajouté des écouteurs d'actions avec des méthodes onClick() et autres. Ça n'a toujours pas marché. Ensuite, j'ai ajouté une vue de texte pour me montrer l'état à des fins de débogage. Après l'ajout de l'état textView, j'ai découvert que la méthode beginRecording() va directement à l'instruction catch.

J'ai regardé une autre vidéo youtube https://www.youtube.com/watch?v=lWaypoRVfSc qui semble faire plus ou moins la même chose en ce qui concerne le MediaRecorder.

Alors .. Ma question est. Qu'est ce que j'ai mal fait? Comment puis-je le faire enregistrer lorsque le bouton RECORD est enfoncé?

Merci à l'avance.

vient ici mon code:

package com.example.natalie.recorder; 

import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Button; 
import android.widget.TextView; 

import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.io.StringWriter; 

public class MainActivity extends AppCompatActivity { 
    private MediaPlayer mediaPLayer; 
    private MediaRecorder recorder; 
    private String OUTPUT_FILE; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     Button startR = (Button) findViewById(R.id.startBtn); 
     Button stopR = (Button) findViewById(R.id.finishBtn); 
     Button playRecording = (Button) findViewById(R.id.playBtn); 
     Button stopPlaying = (Button) findViewById(R.id.stopBtn); 
     final TextView statusTV; 
     statusTV = (TextView) findViewById(R.id.statusTextView); 

     OUTPUT_FILE= Environment.getExternalStorageDirectory().getAbsolutePath()+"/audiorecorder.3gpp"; 

     /*------START BUTTON------*/ 

     startR.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) { 
       final TextView stv=statusTV; 
       try { 
        beginRecording(); 
        stv.setText("Recording"); 
       } catch (Exception e) { 
        StringWriter sw = new StringWriter(); 
        e.printStackTrace(new PrintWriter(sw)); 
        String exceptionAsString = sw.toString(); 
        stv.setText("Error"); 
       } 
      } 
     }); 

     /*------STOP BUTTON------*/ 

     stopR.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) { 
       final TextView stv=statusTV; 
       try { 
        stopRecording(); 
        stv.setText("Stopped"); 
       } catch (Exception e) { 
        StringWriter sw = new StringWriter(); 
        e.printStackTrace(new PrintWriter(sw)); 
        String exceptionAsString = sw.toString(); 
        statusTV.setText("Error"); 
        Log.d("here","dd",e); 
       } 
      } 
     }); 

     playRecording.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) { 
       try { 
        playRecording(); 
       } catch (Exception e) { 
        StringWriter sw = new StringWriter(); 
        e.printStackTrace(new PrintWriter(sw)); 
        String exceptionAsString = sw.toString(); 
        statusTV.setText("Error"); 
       } 
      } 
     }); 

     stopPlaying.setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View view) { 
       try { 
        stopPlayback(); 
       } catch (Exception e) { 
        StringWriter sw = new StringWriter(); 
        e.printStackTrace(new PrintWriter(sw)); 
        String exceptionAsString = sw.toString(); 
        statusTV.setText("Error"); 
       } 
      } 
     }); 

    } 

    private void stopPlayback() throws Exception{ 
     if(mediaPLayer != null) 
      mediaPLayer.stop(); 
    } 
    private void playRecording() throws IOException { 
     ditchMediaPLayer(); 
     mediaPLayer = new MediaPlayer(); 
     mediaPLayer.setDataSource(OUTPUT_FILE); 
     mediaPLayer.prepare(); 
     mediaPLayer.start(); 

    } 

    private void ditchMediaPLayer() { 
     if (mediaPLayer != null) { 
      try{ 
       mediaPLayer.release(); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    private void stopRecording() { 
     if(recorder != null) 
      recorder.stop(); 
    } 
    private void beginRecording() throws Exception{ 
     ditchMediaRecorder(); 
     File outFile = new File(OUTPUT_FILE); 

     if (outFile.exists()) { 
      outFile.delete(); 
     } 

     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     record.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(OUTPUT_FILE); 
     recorder.prepare(); 
     recorder.start(); 
    } 

    private void ditchMediaRecorder() { 
     if(recorder != null) 
      recorder.release(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Le AndroidManifest ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.natalie.recorder"> 



     <uses-permission android:name="android.permission.CAMERA" /> 
     <uses-feature android:name="android.hardware.camera" /> 
     <uses-permission android:name="android.permission.RECORD_AUDIO" 
     /> 
     <uses-permission 
     android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

     <application 
      android:allowBackup="true" 
      android:icon="@mipmap/ic_launcher" 
      android:label="@string/app_name" 
      android:roundIcon="@mipmap/ic_launcher_round" 
      android:supportsRtl="true" 
      android:theme="@style/AppTheme"> 
      <activity 
       android:name=".MainActivity" 
       android:label="@string/app_name" 
       android:theme="@style/AppTheme.NoActionBar"> 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 

        <category 
    android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
     </application> 

    </manifest> 

Le content_main.xml vient ici:

   <Button 
        android:id="@+id/stopBtn" 
        android:layout_width="249dp" 
        android:layout_height="56dp" 
        android:background="@color/colorAccent" 
        android:text="Stop PLayback" 
        app:layout_constraintBottom_toBottomOf="parent" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintRight_toRightOf="parent" 
        app:layout_constraintTop_toBottomOf="@+id/playBtn" /> 

       <Button 
        android:id="@+id/playBtn" 
        android:layout_width="249dp" 
        android:layout_height="48dp" 
        android:background="@color/colorAccent" 
        android:text="Play Recording" 
        app:layout_constraintBottom_toTopOf="@+id/stopBtn" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintRight_toRightOf="parent" 
        app:layout_constraintTop_toBottomOf="@+id/finishBtn" /> 

       <Button 
        android:id="@+id/finishBtn" 
        android:layout_width="249dp" 
        android:layout_height="48dp" 
        android:background="@color/colorAccent" 
        android:text="Finish Recording" 
        app:layout_constraintBottom_toTopOf="@+id/playBtn" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintRight_toRightOf="parent" 
        app:layout_constraintTop_toBottomOf="@+id/startBtn" /> 

       <Button 
        android:id="@+id/startBtn" 
        android:layout_width="247dp" 
        android:layout_height="48dp" 
        android:background="@color/colorAccent" 
        android:text="Start Recording" 
        app:layout_constraintBottom_toTopOf="@+id/finishBtn" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintRight_toRightOf="parent" 
        app:layout_constraintTop_toTopOf="parent" /> 

       <TextView 
        android:id="@+id/statusTextView" 
        android:layout_width="246dp" 
        android:layout_height="22dp" 
        android:text="Status" 
        android:textAlignment="center" 
        android:textSize="24sp" 
        app:layout_constraintRight_toRightOf="parent" 
        app:layout_constraintLeft_toLeftOf="parent" 
        app:layout_constraintBottom_toTopOf="@+id/startBtn" 
        app:layout_constraintTop_toTopOf="parent" /> 

      </android.support.constraint.ConstraintLayout> 

Répondre

0

Vous avez demandé l'autorisation CAMERA, WRITE_STORAGE et RECORD_AUDIO mais vous n'avez pas demandé votre activité. jetez un oeil à this.

utilisation: ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) pour vérifier l'état de l'autorisation et la comparer avec PackageManager.PERMISSION_GRANTED qui signifie que votre autorisation est acceptée comme ceci:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); 
} 

et à l'intérieur du onRequestPermissionsResult faire quelque chose comme ceci:

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //do work 
     } 
    } 
+0

Merci pour la note. Il est logique que cela soit le problème. Je ne suis pas entièrement sûr de la façon de mettre en œuvre vos morceaux de code. Mais je fais des recherches pour ça maintenant et devenir intelligent. – Natalie