2012-09-24 41 views
12

Tengo un problema extraño en mi aplicación de cámara cuando se prueba con Galaxy Nexus ... simplemente se bloquea cuando intento iniciar la actividad de la cámara ... Pero funciona bien con casi todos los demás dispositivos ... Estos son mis funciones .....cámara accidente inesperadamente en 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(); 
    } 
} 
} 

¿alguien puede ayudar mí?

+4

Coloque el logcat Exception/Crash también. –

+0

@AdilSoomro sorry..unfortunately no tengo que now..i no tiene el teléfono Nexus también .. – hacker

+0

probablemente becoz va a iniciar y detener la cámara en surfaceChanged. Es mejor startPreview en onResume() y stopPreview en onPause(). Su trabajo para mi aplicación sobre Galaxy Nexus. –

Respuesta

11

finalmente recibí la respuesta..Nexus tiene cámaras tanto frontales como posteriores. Así que el problema fue el código que solía abrir la cámara (necesitamos establecer la identificación de la cámara para la cámara frontal) y también necesitamos establezca el tamaño de vista previa adecuado ... Aquí está el código modificado ...

@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; 
      } 
Cuestiones relacionadas