2014-06-16 67 views
0

我剛開始進入android/Glass開發階段,我試圖添加基本的視頻錄製功能。目前玻璃限制你10秒,除非你再次點擊/按鈕,我想繞過這一點,只是有一個開放式錄像機。MediaRecorder啓動時處於無效狀態:4

我跟着兩個攝像頭API演練:

和引用的另一個project

到目前爲止,我的代碼如下所示:

private void startRecording() 
{ 
    try{ 
    camera = Camera.open(); 
    mediaRecorder = new MediaRecorder(); 
    surfaceView = new CamSurfaceView(this, camera); 

    try { 
     camera.setPreviewDisplay(surfaceView.getHolder()); 
    } catch (IOException e1) { 

    } 
    camera.startPreview(); 
    camera.unlock(); 
    mediaRecorder.setCamera(camera); 
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
    mediaRecorder.setProfile(CamcorderProfile.get(MediaRecorder.OutputFormat.MPEG_4)); 
    mediaRecorder.setOutputFile(getOutputMediaFile().toString()); 
    mediaRecorder.setPreviewDisplay(surfaceView.getHolder().getSurface()); 

    try{ 
    mediaRecorder.prepare(); 
    } 
    catch(IllegalStateException e){ 

    } 
    catch(IOException e){ 

    } 
    mediaRecorder.start(); //Code failure occurs here. 
    } 
    catch(Exception e) 
    { 
     if(mediaRecorder != null) 
      mediaRecorder.release(); 
     if(camera != null) 
      camera.release(); 
    } 
} 
private Uri getOutputMediaFile() 
{ 
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()+File.separator+"DCIM/Camera"); 

    File[] files =mediaStorageDir.listFiles(); 

    if(!mediaStorageDir.exists()) 
    { 
     if(!mediaStorageDir.mkdirs()) 
     { 
      Log.d("KarmaCam","Failed to create directory"); 
      return null; 
     } 
    } 

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File file = new File(mediaStorageDir.getPath() + File.separator+ "VID_"+timeStamp+".mp4"); 
    return Uri.fromFile(file); 

} 

我SurfaceView:

public class KarmaCamSurfaceView extends SurfaceView implements SurfaceHolder.Callback { 

private SurfaceHolder mHolder; 
private Camera mCamera; 

public CamSurfaceView(Context context, Camera camera) { 
    super(context); 
    mCamera = camera; 
    mHolder = getHolder(); 
    mHolder.addCallback(this);  
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int weight, int height) { 

    if(mHolder.getSurface() == null) 
     return;  
    try 
    { 
     mCamera.stopPreview(); 
    } 
    catch(Exception e) {} 

    try 
    { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } 
    catch(Exception e){}   
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    try 
    { 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } 
    catch(Exception e){} 

} 

@Override 
public void surfaceDestroyed(SurfaceHolder arg0) { 
    // TODO Auto-generated method stub 

} 

我見過其他類似的人問題/問題,它們通常圍繞不正確的輸出文件名格式發生。據我可以告訴我會很好,但我很好奇,如果目錄路徑是有效的。這是Glass視頻內置存儲的地方。

回答

0

更改您的位置:

Environment.getExternalStorageDirectory() + File.separator 
      + Environment.DIRECTORY_DCIM + File.separator + "FILE_NAME"; 

這爲我工作。希望能幫助到你!

2

嘗試添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />到AndroidManifest.xml

0

我遇到了一些Android設備同樣的問題。我使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) 作爲MediaRecorder實例的輸出。讀完is3av的回答後,我將輸出路徑更改爲Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),問題解決了。

似乎有些手機不允許將文件寫入Environment.DIRECTORY_MOVIES路徑或該路徑不存在。

+0

這看起來像一個小小的錯字,你的「之前」和「之後」是一樣的...... –

+0

好的。我編輯了我的答案。謝謝 – OrangeTree

相關問題