2013-11-10 26 views
0

我想設置相機預覽大小和相機預覽類中的圖像大小。但是,我的Log.v顯示相機預覽尺寸和圖像大小不會在logcat中顯示任何內容。所以,我不知道相機預覽和圖像是否設置爲我想要的大小。我正在使用Eclipse。Log.v不顯示輸出設置相機預覽和圖像大小

我從Camera Preview構造函數調用setCamera()。

public CameraPreview(Context context, Camera camera) { 
    super(context); 
    mCamera = camera; 
    setCamera(mCamera); 
    // 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); 
} 

而我設置的相機有Log.v來顯示預覽的大小和圖像大小。

public void setCamera(Camera camera) { 
    if (mCamera == camera) { return; } 

    mCamera = camera; 

    if (mCamera != null) { 
     List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
     mSupportedPreviewSizes = localSizes; 
     //parameters.setPreviewSize(mSupportedPreviewSizes.get(0).width, mSupportedPreviewSizes.get(0).height); 
     parameters.setPreviewSize(640, 480); 
     mCamera.setParameters(parameters); 
     parameters.setPictureSize(640, 480); 
     mCamera.setParameters(parameters); 
     Log.v(preview, "get preview size: " + parameters.getPreviewSize() 
       + "get picture size: " +parameters.getPictureSize()); 
     requestLayout(); 


     try { 
      mCamera.setPreviewDisplay(mHolder); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     /* 
      Important: Call startPreview() to start updating the preview surface. Preview must 
      be started before you can take a picture. 
      */ 
     mCamera.startPreview(); 
    } 
} 
+0

重新啓動Eclipse –

+0

沒有工作.... – Jack

回答

4

試試這個工作。

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 

    private static final String TAG = "Camera Preview"; 
    private static final double PREVIEW_SIZE_FACTOR = 3.00; 
    private SurfaceHolder mHolder = null; 
    private Camera mCamera = null; 
    Camera.Parameters _parameters=null; 

    @SuppressWarnings("deprecation") 
    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 { 
      Camera.Parameters parameters = mCamera.getParameters(); 
      final Size mPreviewSize = getOptimalSize(); 
      parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); 
      requestLayout(); 
      mCamera.setParameters(parameters); 
      mCamera.setPreviewDisplay(holder); 
      mCamera.startPreview(); 
      //startContinuousAutoFocus(); 
     } catch (Exception e) { 
      Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
     } 
    } 
    public void surfaceDestroyed(SurfaceHolder holder) { 
    } 

    @SuppressLint("NewApi") 
    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 
     // set Camera parameters 

     // start preview with new settings 
     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

     } catch (Exception e){ 
      Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
     } 
     } 
    public void startPreview(){ 
     try{ 
      mCamera.startPreview(); 
     }catch (Exception e) { 
     } 
      } 
      private Size getOptimalSize() { 
     Camera.Size result = null; 
     final Camera.Parameters parameters = mCamera.getParameters(); 
     Log.i(CameraPreview.class.getSimpleName(), "window width: " + getWidth() + ", height: " + getHeight()); 
     for (final Camera.Size size : parameters.getSupportedPreviewSizes()) { 
      if (size.width <= getWidth() * PREVIEW_SIZE_FACTOR && size.height <= getHeight() * PREVIEW_SIZE_FACTOR) { 
       if (result == null) { 
        result = size; 
       } else { 
        final int resultArea = result.width * result.height; 
        final int newArea = size.width * size.height; 

        if (newArea > resultArea) { 
         result = size; 
        } 
       } 
      } 
     } 
     if (result == null) { 
      result = parameters.getSupportedPreviewSizes().get(0); 
     } 
     Log.i(CameraPreview.class.getSimpleName(), "Using PreviewSize: " + result.width + " x " + result.height); 
     return result; 
    } 
    } 
+0

非常感謝。 – Jack

0

你試圖打印Camera.Size,使用parameters.getPreviewSize().widthparameters.getPreviewSize().height來代替。 getPictureSize()相同。

或許日誌不顯示由於日誌級別或標籤過濾(什麼是preview變量的內容),嘗試改變它:

Log.d("CAMERA_PREVIEW", "get preview size: " 
    + parameters.getPreviewSize().height + " " 
    + parameters.getPreviewSize().width 
    + "get picture size: " 
    + parameters.getPictureSize().height + " " 
    + parameters.getPictureSize().width 
); 

,甚至只是爲了測試Log.e(這是誤導,因爲它的不是一個錯誤,但它只是暫時的,稍後再改回來),看看是否出現日誌(查找「CAMERA_PREVIEW」標籤)。

+0

還是什麼都沒有....有沒有使用登錄時在Eclipse中任何限制? – Jack

+0

你在日誌中得到什麼?文字「獲得預覽尺寸:」是否出現?或者什麼也沒有?您是否顯示詳細的日誌並過濾正確的標記? –

+0

不顯示文本「獲取預覽大小」。我正在過濾特定於我的應用程序的詳細消息,但只有像dalvikvm等Android標籤出現。我正在運行Nexus 4中的應用程序。 – Jack