Android MediaRecorder无法正常工作

时间:2014-05-31 07:47:46

标签: android surfaceview mediarecorder

Android MediaRecorder无法在我的应用中运行我添加了以下代码,但在调用mediarecorder.start()方法时应用崩溃了。 我的录音机类代码是 -

 public class RecoedVideoActivity  extends Activity  implements SurfaceHolder.Callback{

  @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    private SurfaceHolder surfaceHolder;
    private SurfaceView surfaceView;
    public MediaRecorder mrec = new MediaRecorder();    
    private Camera mCamera;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera_view);
        surfaceView = (SurfaceView) findViewById(R.id.camera_preview);
        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        try {
            startRecording();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        menu.add(0, 0, 0, "Start");
        return super.onCreateOptionsMenu(menu);
    }

    @Override
   public boolean onOptionsItemSelected(MenuItem item){
        if(item.getTitle().equals("Start")){
            try {
                startRecording();
                mrec.start();
                item.setTitle("Stop");

            } catch (Exception e) {
                String message = e.getMessage();
                Log.i(null, "Problem " + message);
                mrec.release();
            }
        }

        else if(item.getTitle().equals("Stop")){
             try{
                 if(mrec!=null){
                     mrec.release();
                     mrec.release();
                     mrec = null;
                     mCamera.lock();
                 }
             item.setTitle("Start");
             }
             catch(Exception e){
                 e.printStackTrace();
             }
        }
        return super.onOptionsItemSelected(item);
    }

    protected void startRecording() throws IOException {
        if(mCamera==null)
            mCamera = Camera.open();
         String filename;
         String path;
         path= Environment.getExternalStorageDirectory().getAbsolutePath().toString();
         Date date=new Date();
         filename="/rec"+date.toString().replace(" ", "_").replace(":", "_")+".mp4";
         //create empty file it must use
         File file=new File(path,filename);
         if(file.isFile()){
             Toast.makeText(this, "file ", Toast.LENGTH_SHORT).show();
         }
        mrec = new MediaRecorder(); 
        mCamera.lock();
        mrec.setCamera(mCamera);    
        mrec.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        mrec.setAudioSource(MediaRecorder.AudioSource.MIC);     
        mrec.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mrec.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        mrec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mrec.setPreviewDisplay(surfaceHolder.getSurface());
        mrec.setOutputFile(path+filename);
        mrec.setMaxDuration(10000);     //10 sec
    mrec.setOnInfoListener(new OnInfoListener() {   
        @Override  
        public void onInfo(MediaRecorder mr, int what, int extra) {  
            if (what == MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED) {   
                onStop();    

                Toast.makeText(getApplicationContext(), "video of 10 sec is completed", Toast.LENGTH_SHORT).show();

            }  
        }
    }
    ); 

    }



    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {      
        Camera.Parameters parameters = mCamera.getParameters();  
           List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
           Camera.Size cs = sizes.get(0);  // You need to choose the most appropriate previewSize for your app. So select one from the list
           parameters.setPreviewSize(cs.width, cs.height);  
           mCamera.setParameters(parameters);
        try {
            mCamera.setPreviewDisplay(surfaceHolder);
        } catch (IOException e) {
            e.printStackTrace();
        }
        mCamera.startPreview(); 
        mrec.start();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {       
        try{      
            if(mCamera==null)
               mCamera = Camera.open(); 
             try {
            mrec.prepare();
            ;
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
            }              
          catch(Exception ioe){          
             ioe.printStackTrace(System.out);          
          } 
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mCamera.stopPreview();
        mCamera.release();       
    }

    public void onStop(){
        mrec.stop();
        mrec.release();
        mrec = null;
      //  item.setTitle("Start");
    }}

你可以帮我解决录音机中的问题。

记录消息

FATAL EXCEPTION: main
java.lang.IllegalStateException
android.media.MediaRecorder.native_start(Native Method)
android.media.MediaRecorder.start(MediaRecorder.java:727)
at com.android.example.CameraActivity$1.onClick(RecoedVideoActivity.java:168)
android.view.View.performClick(View.java:3571)
android.view.View$PerformClick.run(View.java:14247)
android.os.Handler.handleCallback(Handler.java:605)
android.os.Handler.dispatchMessage(Handler.java:92)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4517)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
dalvik.system.NativeStart.main(Native Method)
E/Status Code <><><<><><>(6305): cod = 200

1 个答案:

答案 0 :(得分:0)

明确许可

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

private MediaRecorder recorder ;
public static final int SAMPLING_RATE = 44100;

在startRecording方法中使用

recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setAudioSamplingRate(SAMPLING_RATE);

File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/Recorder");
        try{
          if(dir.mkdir()) {
             System.out.println("Directory created");
          } else {
             System.out.println("Directory alreadt exist");
          }
        }catch(Exception e){
          e.printStackTrace();
        }

        //String str = Environment.getExternalStorageDirectory().getAbsolutePath();
        recorder.setOutputFile(dir + "/recorded_" + System.currentTimeMillis() + ".mp3");

        try {
            recorder.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        recorder.start();
    } catch (Exception e) {
        e.getMessage();
    }