【问题标题】:Recording and Playing back audio not working录制和播放音频不起作用
【发布时间】:2014-05-27 18:21:34
【问题描述】:

我正在制作一个简单的测试应用程序,它有四个按钮,开始录制、停止录制、播放和停止。

问题是我听不到任何录音,我什至不确定录音是否正在保存。

这是我的活动代码

public class MainActivity extends Activity {

    private MediaPlayer mediaPlayer;
    private MediaRecorder recorder;
    private String OUTPUT_FILE;

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

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

    public void buttonTapped (View view){
        switch(view.getId()){

        case R.id.btn_start_recording:
            try{
                beginRecording();
            } catch (Exception e){
                e.printStackTrace();
            }

        case R.id.btn_stop_recording:
            try{
                stopRecording();
            } catch (Exception e){
                e.printStackTrace();
            }

        case R.id.btn_play:
            try{
                playRecording();
            } catch (Exception e){
                e.printStackTrace();
            }

        case R.id.btn_stop:
            try{
                stopPlayback();
            } catch (Exception e){
                e.printStackTrace();
            }       

        }
    }

    private void stopPlayback() {
        if(mediaPlayer != null)
            mediaPlayer.stop();
    }

    private void playRecording() throws Exception{
        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);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setAudioEncoder(MediaRecorder.getAudioSourceMax());
        recorder.setAudioEncodingBitRate(16);
        recorder.setAudioSamplingRate(44100);
        recorder.setOutputFile(OUTPUT_FILE);
        recorder.prepare();
        recorder.start(); 
    }

    private void ditchMediaRecorder() {
        //if we have the recorder, release it
        if(recorder != null)
            recorder.release();
    }

}

我遇到的错误类型

04-13 15:07:56.618: W/System.err(2542): java.io.IOException: Prepare failed.: status=0x1
04-13 15:07:56.618: W/System.err(2542):     at android.media.MediaPlayer.prepare(Native Method)
04-13 15:07:56.618: W/System.err(2542):     at com.appulse.audiomate.MainActivity.playRecording(MainActivity.java:70)
04-13 15:07:56.628: W/System.err(2542):     at com.appulse.audiomate.MainActivity.buttonTapped(MainActivity.java:46)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:07:56.628: W/System.err(2542):     at android.view.View$1.onClick(View.java:3818)
04-13 15:07:56.628: W/System.err(2542):     at android.view.View.performClick(View.java:4438)
04-13 15:07:56.628: W/System.err(2542):     at android.view.View$PerformClick.run(View.java:18422)
04-13 15:07:56.628: W/System.err(2542):     at android.os.Handler.handleCallback(Handler.java:733)
04-13 15:07:56.628: W/System.err(2542):     at android.os.Handler.dispatchMessage(Handler.java:95)
04-13 15:07:56.628: W/System.err(2542):     at android.os.Looper.loop(Looper.java:136)
04-13 15:07:56.628: W/System.err(2542):     at android.app.ActivityThread.main(ActivityThread.java:5017)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:07:56.628: W/System.err(2542):     at java.lang.reflect.Method.invoke(Method.java:515)
04-13 15:07:56.628: W/System.err(2542):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-13 15:07:56.628: W/System.err(2542):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-13 15:07:56.628: W/System.err(2542):     at dalvik.system.NativeStart.main(Native Method)
04-13 15:07:56.628: E/MediaPlayer(2542): stop called in state 0
04-13 15:07:56.628: E/MediaPlayer(2542): error (-38, 0)
04-13 15:07:56.628: E/MediaPlayer(2542): Error (-38,0)

【问题讨论】:

    标签: android audio android-mediaplayer audio-recording android-audiorecord


    【解决方案1】:

    你在这里遗漏了几件事,在函数 buttonTapped 的每个 case 之后添加 break 语句,

    public void buttonTapped (View view){
        switch(view.getId()){
    
        case R.id.btn_start_recording:
            try{
                beginRecording();
            } catch (Exception e){
                e.printStackTrace();
            }
            break;
    
        case R.id.btn_stop_recording:
            try{
                stopRecording();
            } catch (Exception e){
                e.printStackTrace();
            }
            break;
    
        case R.id.btn_play:
            try{
                playRecording();
            } catch (Exception e){
                e.printStackTrace();
            }
            break;
    
        case R.id.btn_stop:
            try{
                stopPlayback();
            } catch (Exception e){
                e.printStackTrace();
            } 
            break;
    
        }
    }
    

    并在清单文件中添加这些权限。

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

    【讨论】:

    • 谢谢!不敢相信我犯了这个错误,没有添加'break;'
    • 有时会发生.. 不提。
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2012-04-09
    • 1970-01-01
    相关资源
    最近更新 更多