简体   繁体   English

在Galaxy nexus中,相机意外坠毁

[英]camera crash unexpectedly in galaxy nexus

I have a strange issue in my camera app when tested with galaxy nexus..It simply crash when try to start the camera activity..But it works fine with almost all other devices.. These are my functions..... 我在使用galaxy nexus测试时在我的相机应用程序中有一个奇怪的问题。当尝试启动相机活动时它只是崩溃。但它几乎所有其他设备都能正常工作..这些是我的功能.....

@Override
public void surfaceCreated(SurfaceHolder holder) {
 // TODO Auto-generated method stub

     try {
        camera = Camera.open();
        camera.setPreviewDisplay(holder);

    Camera.Parameters parameters = camera.getParameters();
        if (Integer.parseInt(Build.VERSION.SDK) >= 8)
            setDisplayOrientation(camera, 90);
        else
            parameters.set("orientation", "portrait");
        parameters.setPictureFormat(PixelFormat.JPEG);
        camera.setParameters(parameters);



    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 


}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
  int height) {
 // TODO Auto-generated method stub
 if(previewing){
  camera.stopPreview();
  previewing = false;
 }

 if (camera != null){
  try {


   camera.setPreviewDisplay(surfaceHolder);
   camera.startPreview();
   previewing = true;
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

Can anyone help me ? 谁能帮我 ?

finally i got the answer..Nexus has both front and back end cameras.So the problem was the code which used to open the camera(need to set the camera id for the front end camera) and also we need to set the appropriate preview size..Here is the modified code.. 最后我得到了答案.Nexus有前后摄像头。所以问题是用于打开摄像头的代码(需要为前端摄像头设置摄像头ID),我们还需要设置相应的预览size..Here是修改后的代码..

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



    List<Size> sizes = parameters.getSupportedPreviewSizes();
    Size optimalSize = getOptimalPreviewSize(sizes, width, height);
    parameters.setPreviewSize(optimalSize.width, optimalSize.height);

    camera.setParameters(parameters);
    camera.startPreview();
     startPreview();

}


   @Override
public void surfaceCreated(SurfaceHolder holder) {


     try {

         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
              Camera.CameraInfo info=new Camera.CameraInfo();

              for (int i=0; i < Camera.getNumberOfCameras(); i++) {
                Camera.getCameraInfo(i, info);

                if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                  camera=Camera.open(i);
                  defaultCameraId = i;
                }
              }
            }

            if (camera == null) {
              camera=Camera.open();
            }




            try {
                camera.setPreviewDisplay(surfaceHolder);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Camera.Parameters parameters = camera.getParameters();
            android.hardware.Camera.CameraInfo info =
                    new android.hardware.Camera.CameraInfo();
            android.hardware.Camera.getCameraInfo(defaultCameraId, info);
            int rotation = this.getWindowManager().getDefaultDisplay()
                    .getRotation();
            if (Integer.parseInt(Build.VERSION.SDK) >= 8)
            {

                 int degrees = 0;
                 switch (rotation) {
                     case Surface.ROTATION_0: 
                         degrees = 0; break;
                     case Surface.ROTATION_90: 
                         degrees = 90; break;
                     case Surface.ROTATION_180: 
                         degrees = 180; break;
                     case Surface.ROTATION_270: 
                         degrees = 270; break;
                 }
                 int result;
                 if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
                     result = (info.orientation + degrees) % 360;
                     result = (360 - result) % 360;  
                 } else {  // back-facing
                     result = (info.orientation - degrees + 360) % 360;
                 }
                 camera.setDisplayOrientation(result);

            }
            else
            {
                parameters.set("orientation", "portrait");
            }


            camera.setParameters(parameters);



    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 


}


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

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

                int targetHeight = h;


                for (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);
                    }
                }


                if (optimalSize == null) {
                    minDiff = Double.MAX_VALUE;
                    for (Size size : sizes) {
                        if (Math.abs(size.height - targetHeight) < minDiff) {
                            optimalSize = size;
                            minDiff = Math.abs(size.height - targetHeight);
                        }
                    }
                }
                return optimalSize;
            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM