【问题标题】:Log.v doesn't show show output for setting Camera preview and image sizeLog.v 不显示设置相机预览和图像大小的显示输出
【发布时间】:2013-11-22 03:00:25
【问题描述】:

我正在尝试设置相机预览大小以及相机预览类中的图像大小。但是,我的 Log.v 显示相机预览大小和图像大小在 logcat 中没有显示任何内容。所以,我不知道相机预览和图像是否设置为我想要的大小。我正在使用 Eclipse。

我正在从 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();
    }
}

【问题讨论】:

    标签: android eclipse image logging android-camera


    【解决方案1】:

    试试这个,它工作正常。

     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;
        }
        }
    

    【讨论】:

      【解决方案2】:

      您正在尝试打印Camera.Size,请改用parameters.getPreviewSize().widthparameters.getPreviewSize().heightgetPictureSize() 也一样。

      可能由于日志级别或标签过滤导致日志未显示(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”标签)。

      【讨论】:

      • 你在日志中得到了什么?是否出现文本“获取预览大小:”?还是什么都没有?您是否显示详细日志并过滤正确的标签?
      • 文本“获取预览大小”没有出现。我正在过滤特定于我的应用程序的详细消息,但仅出现 dalvikvm 等 Android 标签。我在 Nexus 4 中运行该应用程序。
      • 请注意您输入了Log.v(preview,…preview 包含什么?尝试将其更改为常量并更改日志级别。我将编辑我的答案以澄清这一点。
      • 嗯..仍然无法正常工作..但找到了解决方法,只是拍了张照片并检查了画廊中的大小。
      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多