2016-03-03 4 views
0

J'essaie de faire une application qui devrait d'abord enregistrer la voix de l'utilisateur, puis calculer différentes choses (par exemple le spectre) du fichier enregistré. Je ne peux pas lire le fichier enregistré (je ne trouve pas ce fichier - est-ce qu'il enregistre même?). Voici mon code:enregistrer la voix de l'utilisateur android

package com.example.annik.puhesovellus; 

import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.net.Uri; 
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.view.View; 
import java.io.File; 
import java.io.IOException; 


public class DisplayAanitysIkkuna extends AppCompatActivity { 
private String mFileName; 
private MediaRecorder mRecorder; 
private MediaPlayer mPlayer; 

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

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    mFileName = Environment.getExternalStorageDirectory()+"/audiorecorder.3gpp"; 

} 
public void ButtonTapped(View view) { 
    switch(view.getId()) { 
     case R.id.start: 
      try { 
       beginRecording(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      break; 
     case R.id.stop: 
      try { 
       stopRecording(); 
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
      break; 
     case R.id.play: 
      try { 
       playRecording(); 
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
      break; 
     case R.id.stopPlaying: 
      try { 
       stopPlaying(); 
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
      break; 

    } 

} 

private void stopPlaying() { 
    mPlayer.release(); 
    mPlayer = null; 
} 

private void playRecording() throws Exception{ 
    ditchMediaPlayer(); 
    MediaPlayer mPlayer = MediaPlayer.create(this, Uri.parse(mFileName)); 
    mPlayer.start(); 

} 

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

private void beginRecording() throws IOException { 
    ditchMediaRecorder(); 
    File outFile = new File(mFileName); 

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

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

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

    } 
} 

private void stopRecording() { 
    if(mRecorder != null) { 
     mRecorder.stop(); 
    } 

} 


} 

Et je sais que les tirets ne sont pas correctes parce que je collais le code mal ... Avez-vous des idées pour lesquelles ce code ne fonctionne pas? Il donne deux erreurs: "Faut-il déjà avoir un contrôleur de sous-titres" mais j'ai lu que je n'ai pas à m'en préoccuper et "QCMediaPlayer mediaplayer NOT présent" et j'ai lu que cela signifie que ma plateforme ne supporte pas QCMediaPlayer ..? Est-ce que ce code enregistre un fichier et ne peut pas le lire ou ne parvient-il pas à enregistrer un fichier? Comment puis-je enregistrer la voix de l'utilisateur et traiter le fichier enregistré?

Répondre

1

Je crois que ce problème est dans playRecording(). Lorsque vous tapez MediaPlayer mPlayer = ..., il crée une nouvelle variable avec la portée à l'intérieur de cette méthode. Vous n'utilisez pas votre variable de classe MediaPlayer. Essayez de changer

MediaPlayer mPlayer = MediaPlayer.create(this, Uri.parse(mFileName)); 

à

mPlayer = MediaPlayer.create(this, Uri.parse(mFileName)); 
+0

Il a fonctionné! Merci beaucoup! :) –