2012-06-11 27 views
2

我在Android應用程序中使用視頻錄製。它在Android2.2Android2.3設備中正常工作,但應用程序在Android4.0中崩潰。Android - Android4.0中的MediaPlayer異常

這裏是我的代碼:

class VideoPreview extends SurfaceView implements SurfaceHolder.Callback 
    { 
    MediaRecorder recorder; 
    SurfaceHolder holder = null; 
    FileOutputStream fileout; 
public VideoPreview(Context context,MediaRecorder temprecorder) { 
super(context); 
    recorder= temprecorder; 
    holder= getHolder(); 
    holder.addCallback(this); 
    holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 
    public void surfaceCreated(SurfaceHolder holder){ 
    } 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     if(recorder!=null) 
     { 
    recorder.release(); 
    Log.d("Video Preview", "Exception1"); 
    recorder = null; 
     } 
    } 

    //surfaceChanged : This method is called after the surface is created. 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
    { 
    } 
    public void stop(){ 

     if(recorder!=null) 
     { 
     recorder.release(); 
     recorder = null; 
     }   
    } 
    @Override 
    public boolean onKeyDown (int keyCode, KeyEvent event){ 

     return false; 

    } 

    public boolean start() {  
     String state = android.os.Environment.getExternalStorageState(); 
     String path = Environment.getExternalStorageDirectory().getAbsolutePath() +"/myvideo.mp4"; 
     File fname = new File(path); 
     if (!state.equals(Environment.MEDIA_MOUNTED)) return false; 
     File directory = new File(path).getParentFile(); 
     if(!directory.exists() && !directory.mkdirs()) return false; 

      if (recorder == null)  
      recorder = new MediaRecorder();   

      int out_format = MediaRecorder.OutputFormat.MPEG_4; 
      //THREE_GPP; 
      recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);  
      recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
      recorder.setOutputFormat(out_format); 
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
      recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
      //recorder.setMaxDuration(20000); 
      //recorder.setVideoSize(352,288); // 352, 288 m_recorder.setVideoSize(320, 240); 176,144 
      recorder.setVideoFrameRate(15); 
      recorder.setOutputFile(fname.getPath());     
      /* videoview = (VideoView) findViewById(R.id.videosurface); 
      SurfaceHolder holder = videoview.getHolder(); 
      mediarecorder.setPreviewDisplay(holder.getSurface());*/    
      recorder.setPreviewDisplay(holder.getSurface()); 
      try { 
       Thread.sleep(6000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if (!Recorder_Prepare()) 
      return false; 
      else 
      return true; 
     }  

private boolean Recorder_Prepare() 
    { 

     try { 
      if (recorder != null){ 
      recorder.prepare(); 
      Log.d("Video Preview", "Exception2"); 
      recorder.start();  
      Log.d("Video Preview", "Exception3"); 
      } 
     } 
      catch (IllegalStateException e) { 
       return false; 
      } 
      catch (IOException e) { 
       return false; 
      } 
      return true;    
    }    
    } 

這是我logcatrecorder.start();如下拋出異常:

 06-11 13:54:54.926: E/MediaRecorder(22582): start failed: -19 
     06-11 13:54:54.961: E/AndroidRuntime(22582): FATAL EXCEPTION: Thread-2201 
     06-11 13:54:54.961: E/AndroidRuntime(22582): java.lang.RuntimeException: start failed. 
     06-11 13:54:54.961: E/AndroidRuntime(22582): at android.media.MediaRecorder.start(Native Method) 
     06-11 13:54:54.961: E/AndroidRuntime(22582): at com.Myapp.VideoPreview.Recorder_Prepare(VideoPreview.java:106) 
     06-11 13:54:54.961: E/AndroidRuntime(22582): at com.Myapp.VideoPreview.start(VideoPreview.java:94) 
     06-11 13:54:54.961: E/AndroidRuntime(22582): at com.Myapp.videoRecord$1.run(videoRecord.java:94) 
     06-11 13:54:54.961: E/AndroidRuntime(22582): at java.lang.Thread.run(Thread.java:856) 

Samsung Nexus S verfied的應用程序,它沒有SDCard支持。我搜索了4個小時解決問題,但無法找到解決方案。 上述程序中是否有任何棄用的方法?請幫我解決問題。

+0

堆棧跟蹤還有另外一個異常嗎?尋找「由...引發」,就在您發佈的異常堆棧跟蹤之下。 –

+0

@GrahamBorland沒有在Logcat中引起異常。我發佈的是onlu我得到的錯誤... –

+0

您是否已將添加到您的清單中? – Guykun

回答

1

Android 4.0引入了新的運行時檢查,以確保您沒有像在主線程中訪問網絡那樣執行某些操作。

你在做一些愚蠢的事情,就像在主線程上訪問網絡一樣嗎?您的媒體是通過網絡進行流式傳輸的,您打算從哪裏調用VideoPreview.start()方法?

+0

錄製的視頻附加到電子郵件中,並將郵件發送給電子郵件收件人。我沒有使用通過n/w流式傳輸的視頻。我在電話號碼調用功能之後調用VideoPreview.start()。 –

+0

這是否幫助您解決了您的問題? – Buksy