2016-02-12 91 views
3

我面临Camera.setParameters的一个问题,下面是我注意到,相机setParameters失败三星 - 安卓

在Nexus的SurfaceView(W,H)是1080年至1776年,最佳的尺寸为W :1600-H:1200,这是当我设定的参数

     --------Nexus-------- 
SurfaceView(w, h) 1080-1776 
Available cam sizes 
size 1920-1080 
size 1600-1200 
size 1280-960 
size 1280-768 
size 1280-720 
size 1024-768 
size 800-600 
size 800-480 
size 720-480 
size 640-480 
size 352-288 
size 320-240 
size 176-144 
optimalSize 1600-1200 

做工精细============================ ================================================== ====================

以下是三星,它在这里崩溃,我已经尝试在H中切换W在Camera.setPa rameters并crahsed还有,我想埃维单一尺寸提供,他们都crahsed

    --------Samsung Back camera-------- 
SurfaceView(w, h) 1080-1920 
Available cam sizes 
size 1920-1080 
size 1440-1080 
size 1280-720 
size 1056-864 
size 960-720 
size 720-480 
size 640-480 
size 320-240 
size 176-144 
optimalSize 1920-1080 

这里混乱的部分,

当我尝试Camera.open(1)替代Camera.open (0),前置摄像头,它的工作原理!

    --------Samsung front-facing camera-------- 
SurfaceView(w, h) 1080-1920 
Available cam sizes 
size 1920-1080 
size 1440-1080 
size 1280-720 
size 1056-864 
size 960-720 
size 720-480 
size 640-480 
size 320-240 
size 176-144 
optimalSize 1920-1080 

而且我使用的代码如下,可一些请告诉我这是怎么回事

class Preview extends ViewGroup implements SurfaceHolder.Callback { 
    private final String TAG = "Preview"; 

    SurfaceView mSurfaceView; 
    SurfaceHolder mHolder; 
    Camera.Size mPreviewSize; 
    List<Camera.Size> mSupportedPreviewSizes; 
    Camera mCamera; 
    Context mContext; 
    int screenWidth; 
    int screenHeight; 
    Preview(Context context, SurfaceView sv, int width, int height) { 
     super(context); 

     mSurfaceView = sv; 
//  addView(mSurfaceView); 

     mHolder = mSurfaceView.getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void setCamera(Camera camera) { 
     mCamera = camera; 
     if (mCamera != null) { 
      mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes(); 
      requestLayout(); 
      // get Camera parameters 
      Camera.Parameters params = mCamera.getParameters(); 
      List<String> focusModes = params.getSupportedFocusModes(); 
//   if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) { 
//    // set the focus mode 
//    params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
//    // set Camera parameters 
//    mCamera.setParameters(params); 
//   } 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     // We purposely disregard child measurements because act as a 
     // wrapper to a SurfaceView that centers the camera preview instead 
     // of stretching it. 
     final int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec); 
     final int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec); 
     setMeasuredDimension(width, height); 

     if (mSupportedPreviewSizes != null) { 
      mPreviewSize = getOptimalPreviewSize(mSupportedPreviewSizes, width, height); 
     } 
    } 

    @Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     if (changed && getChildCount() > 0) { 
      final View child = getChildAt(0); 

      final int width = r - l; 
      final int height = b - t; 

      int previewWidth = width; 
      int previewHeight = height; 
      if (mPreviewSize != null) { 
       previewWidth = mPreviewSize.width; 
       previewHeight = mPreviewSize.height; 
      } 

      // Center the child SurfaceView within the parent. 
      if (width * previewHeight > height * previewWidth) { 
       final int scaledChildWidth = previewWidth * height/previewHeight; 
       child.layout((width - scaledChildWidth)/2, 0, 
         (width + scaledChildWidth)/2, height); 
      } else { 
       final int scaledChildHeight = previewHeight * width/previewWidth; 
       child.layout(0, (height - scaledChildHeight)/2, 
         width, (height + scaledChildHeight)/2); 
      } 
     } 
    } 

    public void surfaceCreated(SurfaceHolder holder) { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     try { 
      if (mCamera != null) { 
       mCamera.setPreviewDisplay(holder); 
      } 
     } catch (IOException exception) { 
      Log.e(TAG, "IOException caused by setPreviewDisplay()", exception); 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
     // Surface will be destroyed when we return, so stop the preview. 
     if (mCamera != null) { 
      mCamera.stopPreview(); 
     } 
    } 


    private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) { 
     final double ASPECT_TOLERANCE = 0.1; 
     double targetRatio = (double) w/h; 
     if (sizes == null) return null; 

     Camera.Size optimalSize = null; 
     double minDiff = Double.MAX_VALUE; 

     int targetHeight = h; 
     for (Camera.Size size : sizes) { 
      Log.d("CamSettings", "size "+ size.width +"-"+ size.height); 
     } 
     // Try to find an size match aspect ratio and size 
     for (Camera.Size size : sizes) { 
      double ratio = (double) size.width/size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight) < minDiff) { 
       optimalSize = size; 
       minDiff = Math.abs(size.height - targetHeight); 
      } 
     } 

     // Cannot find the one match the aspect ratio, ignore the requirement 
     if (optimalSize == null) { 
      minDiff = Double.MAX_VALUE; 
      for (Camera.Size size : sizes) { 
       if (Math.abs(size.height - targetHeight) < minDiff) { 
        optimalSize = size; 
        minDiff = Math.abs(size.height - targetHeight); 
       } 
      } 
     } 
     Log.d("CamSettings", "optimalSize "+ optimalSize.width +"-"+ optimalSize.height); 

     return optimalSize; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     if(mCamera != null) { 

      mCamera.setDisplayOrientation(90); 
      Camera.Parameters parameters = mCamera.getParameters(); 

      Log.d("CamSettings", "SurfaceView " + w + "-" + h); 
       Camera.Size sc = getOptimalPreviewSize(parameters.getSupportedPreviewSizes(), w, h); 

      parameters.setPreviewSize(sc.width, sc.height); 
      parameters.setPictureSize(sc.width, sc.height); 


//   Camera.Size captureSize = determineBestPictureSize(parameters); 


      requestLayout(); 
      mCamera.setParameters(parameters); 
      mCamera.startPreview(); 
     } 
    } 

和碰撞吸能是这个

E/AndroidRuntime: FATAL EXCEPTION: main 
Process: com.example.camtest1, PID: 21832 
java.lang.RuntimeException: setParameters failed 
    at android.hardware.Camera.native_setParameters(Native Method) 
    at android.hardware.Camera.setParameters(Camera.java:1701) 
    at com.example.camtest1.Preview.surfaceChanged(Preview.java:174) 
    at android.view.SurfaceView.updateWindow(SurfaceView.java:611) 
    at android.view.SurfaceView.access$000(SurfaceView.java:94) 
    at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183) 
    at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:895) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2222) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1267) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6638) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:613) 
    at android.view.Choreographer.doFrame(Choreographer.java:583) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5635) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
    at dalvik.system.NativeStart.main(Native Method) 

--- Update-- - 我刚试过禁用了这个

parameters.setPictureSize(sc.width, sc.height) 

,它不再崩溃,仍然试图看看是否会影响宽高比

回答

0

禁用解决我的问题。

parameters.setPictureSize(sc.width, sc.height) 

看起来像我得到的尺寸是用于预览,我不知道如何获取/设置图片的大小!

0

您还可以像预览尺寸一样获得支持的图片尺寸。

getSupportedPictureSizes()方法将返回设备摄像头支持的Camera.Size的列表。你可以将这个列表传递给getOptimalPreviewSize。如果您希望预览和照片具有相同的视角,则可以将getOptimalPreviewSize的参数设置为getSupportedPictureSizes,yourPreviewWidth,yourPreviewHeight。 所以它会返回一个一致的图片大小到您的预览。

+0

我已经做了,但没有奏效。 –

1

这里混乱的部分,

当我尝试Camera.open(1),而不是Camera.open的(0), 面临弗朗摄像头,它的作品!

这里是你的答案在这里。
当您使用Camera.open()它有一个超载方法,除了相机ID Camera.open(int cameraId)。对于每个摄像机ID,它都有自己的一套支持尺寸,这是唯一合理的,因为正面和背面摄像机获得不同的分辨率。这就是为什么您的代码使用Camera.open(0)而不是Camera.open(1)

使用这些方法在获得对相机的参考后找到适合您的设置。

camera.getParameters().getSupportedVideoSizes(); 
    camera.getParameters().getSupportedPictureSizes(); 
    camera.getParameters().getSupportedPreviewSizes()