【问题标题】:Problem with AudioRecord classAudioRecord 类的问题
【发布时间】:2011-07-26 09:05:08
【问题描述】:

我正在使用 AudioRecord 类录制音频。我想将音频录制到我的资产文件夹或资源文件夹中的特定文件中。我认为录制没有问题。但是在读取缓冲区时它显示了一些问题(它正在抛出NullPointerException)。谁能提出可能是什么问题?

【问题讨论】:

    标签: android audio-recording android-audiorecord


    【解决方案1】:

    您不能在 Asset 文件夹中保存文件。 Assets 文件夹是只读的,您必须将其保存在设备的内部或外部存储中

    下面有一个核心用来记录媒体文件。

    package com.example.media.record;
    
        import java.io.File;
        import java.io.IOException;
    
        import android.app.Activity;
        import android.media.MediaPlayer;
        import android.media.MediaPlayer.OnCompletionListener;
        import android.media.MediaPlayer.OnErrorListener;
        import android.media.MediaRecorder;
        import android.os.Bundle;
        import android.os.Environment;
        import android.os.Handler;
        import android.os.Handler.Callback;
        import android.os.Message;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.Button;
        import android.widget.ProgressBar;
        import android.widget.Toast;
    
        public class MediaRecorderActivity extends Activity implements OnClickListener {
            Button btnPlay;
            Button btnRecord;
            ProgressBar progress;
            MediaPlayer mPlayer;
            MediaRecorder mRecorder;
            String mFileName;
            boolean mStartRecording = true;
            boolean mStartPlaying = true;
            Thread mThreadProgress;
            int duration = 1;
            private void onRecord(boolean start) {
                if(start) {
                    startRecording();
                }else {
                    stopRecording();
                }
            }
    
            private void onPlay(boolean start) {
                if(start) {
                    startPlaying();
                }else {
                    stopPlaying();
                }
            }
    
            private void startRecording() {
                mRecorder = new MediaRecorder();
                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mRecorder.setOutputFile(mFileName);
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mRecorder.setOnErrorListener(errorListenerForRecorder);
    
                try {
                    mRecorder.prepare();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    mRecorder.start();
                } catch (Exception e) {
                    Toast.makeText(getApplicationContext(), "Error :: " + e.getMessage(), Toast.LENGTH_LONG).show();
                }
    
            }
    
    
            private void stopRecording() {
                if(mRecorder != null) {
                    mRecorder.stop();
                    mRecorder.release();
                    mRecorder = null;
                }
            }
    
            private void startPlaying() {
                mPlayer = new MediaPlayer();
                try {
                    mPlayer.setDataSource(mFileName);
                    mPlayer.setOnCompletionListener(completionListener);
                    mPlayer.setOnErrorListener(errorListenerForPlayer);
                    mPlayer.prepare();
                    mPlayer.start();
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
            }
            private void stopPlaying() {
                if(mPlayer != null) {
                    mPlayer.stop();
                    mPlayer.release();
                    mPlayer = null;
                }
            }
    
            OnCompletionListener completionListener = new OnCompletionListener() {
    
                @Override
                public void onCompletion(MediaPlayer mp) {
                    btnRecord.setEnabled(true);
                    btnPlay.setText("Start playing");
                    mStartPlaying = !mStartPlaying;
                }
            };
    
            OnErrorListener errorListenerForPlayer = new OnErrorListener() {
    
                @Override
                public boolean onError(MediaPlayer mp, int what, int extra) {
                    Toast.makeText(getApplicationContext(), "Error during playing file", 3000).show();
                    return false;
                }
            };
    
            android.media.MediaRecorder.OnErrorListener errorListenerForRecorder = new android.media.MediaRecorder.OnErrorListener() {
    
                @Override
                public void onError(MediaRecorder mr, int what, int extra) {
                    Toast.makeText(getApplicationContext(), "Error during recoding file", 3000).show();
    
                }
            };
            /** Called when the activity is first created. */
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                btnPlay = (Button)findViewById(R.id.btnPlay);
                btnRecord = (Button)findViewById(R.id.btnRecord);
                progress = (ProgressBar)findViewById(R.id.progressRecorder);
                mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
                mFileName += "/audiorecordtest.3gp";
                File file = new File(mFileName);
                if(!file.exists()) btnPlay.setEnabled(false); 
                btnPlay.setOnClickListener(this);
                btnRecord.setOnClickListener(this);
            }
    
            @Override
            protected void onPause() {
                super.onPause();
                if(mRecorder != null) {
                    mRecorder.stop();
                }
                if(mPlayer != null) {
                    mPlayer.pause();
                }
            }
    
    
            @Override
            protected void onResume() {
                super.onResume();
                if(mRecorder != null) {
                    mRecorder.start();
                }
                if(mPlayer != null) {
                    mPlayer.start();
                }
            }
    
            @Override
            protected void onStop() {
                super.onStop();
                if(mRecorder != null) {
                    mRecorder.stop();
                }
                if(mPlayer != null) {
                    mPlayer.stop();
                }
            }
    
            @Override
            protected void onDestroy() {
                super.onDestroy();
                if(mRecorder != null) {
                    mRecorder.release();
                    mRecorder = null;
                }
                if(mPlayer != null) {
                    mPlayer.release();
                    mPlayer = null;
                }
            }
    
            @Override
            public void onClick(View v) {
    
                if(v == btnPlay) {
    
                    onPlay(mStartPlaying);
                    if(mStartPlaying) {
                        duration = mPlayer.getDuration();
                        mThreadProgress = new ThreadProgress();
                        mThreadProgress.start();
                        ((Button)v).setText("Stop Playing");
                        btnRecord.setEnabled(false);
    
                    }
                    else {
                        ((Button)v).setText("Start Playing");
                        btnRecord.setEnabled(true);
                        if(mThreadProgress != null && !mThreadProgress.isAlive()) mThreadProgress.stop();
    
                        //  t.interrupt();
                    }
                    mStartPlaying = !mStartPlaying;
    
                } else if(v == btnRecord) {
                    onRecord(mStartRecording);
                    if(mStartRecording) {
                        mThreadProgress = new ThreadProgress();
                        mThreadProgress.start();
                        ((Button)v).setText("Stop Recording");
                        btnPlay.setEnabled(false);
                        //  t.start();
                    }
                    else {
                        ((Button)v).setText("Start Recording");
                        btnPlay.setEnabled(true);
                        //  t.interrupt();
                        if(mThreadProgress != null && !mThreadProgress.isAlive()) mThreadProgress.stop();
                    }
                    mStartRecording = !mStartRecording;
                }
            }
    
    
            Handler handler = new Handler(new Callback() {
    
                @Override
                public boolean handleMessage(final Message msg) {
                    if(msg.what == 0) {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                progress.setProgress(msg.arg1);
                            }
                        });
    
                    }
                    return false;
                }
            });
    
            public class ThreadProgress extends Thread implements Runnable {
    
                public int i = 0;
                @Override
                public void run() {
                    while((!this.isInterrupted() && mPlayer != null && mPlayer.isPlaying()) || (!this.isInterrupted() && mRecorder != null)) {
                        try {
                            if(duration == 1) i+=1;
                            else i += 100000 /duration;
                            Message message = new Message();
                            message.what = 0;
                            message.arg1 = i;
                            handler.sendMessage(message);
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }       
                    }
                }
    
            }
        }
    

    这是您可以录制音频以及播放音频的示例

    You can store recorded file in following places
    1) File directory of your app
    2) External directory(SD card)
    3) Network
    

    【讨论】:

    • 谢谢。但是你能告诉我如何设置输出文件吗?我想将录制的文件存储在 assets/record/a.wav 等资产文件夹中。我该怎么做。我不这样做: 录音机.setAudioSource(MediaRecorder.AudioSource.DEFAULT); recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);录音机.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recordPath="file:///android_asset/record/a.wav";记录器.setOutputFile(recordPath);记录器.prepare();记录器.start();
    • 我认为 Asset 文件夹是只读的,不能通过代码存储在 assets 中
    • ok.Allright.But 知道如何存储在资源文件夹内的原始文件夹中吗?
    • 您甚至无法通过编程方式在行文件夹中创建文件
    • no.让我明确一下,我将一个文件夹(明确创建,不是以编程方式创建)放在“res”文件夹中,那么我如何使用它来存储我录制的声音?
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 2012-09-28
    相关资源
    最近更新 更多