3

我有集成攝像頭在拍攝按鈕我在寫工具欄的隱藏我的app.When用戶的點擊,使相機預覽屏幕尺寸的增大。這使應用程序停止在線錄製 - mMediaRecorder.stop();了java.lang.RuntimeException:在android.media.MediaRecorder.stop(MediaRecorder.java)停止失敗

java.lang.RuntimeException: stop failed. 
     at android.media.MediaRecorder.stop(MediaRecorder.java) 

但是如果我不隱藏工具欄或從未顯示工具欄,然後就沒有crash.So問題是因爲相機PARAMS變化後,我隱藏toolbar.How可我解決呢?我有看到this回答並將該代碼添加到CameraPreview類。

private Camera mCamera; 
private CameraPreview mPreview; 
mCamera = getCameraInstance(); 
mCamera.setDisplayOrientation(90); 
mPreview = new CameraPreview(mActivity, mCamera); 
preview = (FrameLayout) view.findViewById(R.id.camera_preview); 
preview.addView(mPreview); 
capture.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
mToolbar.setVisibility(View.GONE); 
if (prepareVideoRecorder()) { 
    // Camera is available and unlocked, MediaRecorder is prepared, 
    // now you can start recording 
    mMediaRecorder.start(); 
} 
} 
}): 

stop.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
mMediaRecorder.stop(); // stop the recording 
releaseMediaRecorder(); // release the MediaRecorder object 
mCamera.lock(); 
} 
}): 

CameraPreview.class

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 
    private SurfaceHolder mHolder; 
    private Camera mCamera; 
    public CameraPreview(Context context, Camera camera) { 
     super(context); 
     mCamera = camera; 
     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     // deprecated setting, but required on Android versions prior to 3.0 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 
    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, now tell the camera where to draw the preview. 
     try { 
//   if(mCamera==null) 
//   mCamera = getCameraInstance(); 
      CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH); 
      Camera.Parameters parameters = mCamera.getParameters(); 
      parameters.setPreviewSize(profile.videoFrameWidth,profile.videoFrameHeight); 
      mCamera.setParameters(parameters); 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
     } catch (IOException e) { 
      Log.d("error", "Error setting camera preview: " + e.getMessage()); 
     } 
    } 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // empty. Take care of releasing the Camera preview in your activity. 
     Log.e("surfaceDestroyed issue","surfaceDestroyed called"); 
     if ((mCamera != null)&&(!CameraActivity.getInstance().getOnBackPressedListener().isPreview())) { 
      Log.e("surfaceDestroyed issue","surface destroyed"); 
      try { 
       mCamera.stopPreview(); 
       mCamera.release(); 
       mCamera = null; 
      }catch(Exception e){} 
     } 
    } 
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 
     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 
     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 
     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } catch (Exception e){ 
      Log.d("error", "Error starting camera preview: " + e.getMessage()); 
     } 
    } 
    public static Camera getCameraInstance() { 
     Camera c = null; 
     try { 
      c = Camera.open(); // attempt to get a Camera instance 
     } catch (Exception e) { 
      // Camera is not available (in use or does not exist) 
     } 
     return c; // returns null if camera is unavailable 
    } 

錯誤 -

java.lang.RuntimeException: stop failed. 
     at android.media.MediaRecorder.stop(MediaRecorder.java) 
     at xyzCameraFragment$5.onClick(CameraFragment.java:208) 
     at android.view.View.performClick(View.java:4761) 
     at android.view.View$PerformClick.run(View.java:19767) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5312) 
     at java.lang.reflect.Method.invoke(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
+1

安置自己的堆棧跟蹤! – JiTHiN

+0

@JiTHiN記錄錯誤發佈 – Programmer

+0

我認爲這個問題是因爲我需要在隱藏工具欄後更新攝像頭參數?但是我應該怎麼做? – Programmer

回答

1

在你捕捉單擊設置boolean變量

capture.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     mToolbar.setVisibility(View.GONE); 
     startCapture = true; 

}): 

隱藏ToolBar原因0撥打電話。

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     // If your preview can change or rotate, take care of those events here. 
     // Make sure to stop the preview before resizing or reformatting it. 
     if (mHolder.getSurface() == null){ 
      // preview surface does not exist 
      return; 
     } 
     // stop preview before making changes 
     try { 
      mCamera.stopPreview(); 
     } catch (Exception e){ 
      // ignore: tried to stop a non-existent preview 
     } 
     // set preview size and make any resize, rotate or 
     // reformatting changes here 
     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 
     } catch (Exception e){ 
      Log.d("error", "Error starting camera preview: " + e.getMessage()); 
     } 
//Check if capture is set and start recording 

if(startCapture) 
    { 
    if (prepareVideoRecorder()) { 
    mMediaRecorder.start(); 
    } 
    startCapture = false; 
    } 
} 
+0

如果我註釋掉'surfaceChanged'那麼它working..is的完整代碼,對於解決這個更好的辦法? – Programmer

+0

我不這麼認爲。當曲面變化時,您需要重新啓動相機預覽。 – JiTHiN

+0

您可以做的另一件事是將工具欄覆蓋在相機預覽上作爲覆蓋。因此,表面不會在隱藏工具欄 – JiTHiN

相關問題