2016-03-03 70 views
0

我正在尝试制作一个应用程序,该应用程序应先记录用户的声音,然后从录制的文件中计算不同的事物(例如,频谱)。我无法播放录制的文件(我无法找到该文件 - 是否录制?)。这里是我的代码:录制用户语音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(); 
    } 

} 


} 

我知道缩进是不正确的,因为我非常粘贴代码...你有什么想法,为什么这个代码不工作?它给出了两个错误:“应该有字幕控制器已经设置”,但我读了,我不需要介意,“QCMediaPlayer媒体播放器不存在”,我读到这意味着我的平台不支持QCMediaPlayer ..? 这段代码是否记录了一个文件,它只是无法播放它,或者它无法记录文件?我如何记录用户声音并处理保存的文件?

回答

1

我认为问题出在playRecording()。当您键入MediaPlayer mPlayer = ...时,它会在该方法内创建一个范围为新的变量。你没有使用你的类MediaPlayer变量。尝试改变

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

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

它的工作!非常感谢! :) –