2010-07-30 21 views
12

había establecido mi cámara a this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); y funciona bien, pero si lo cambio a PORTRAIT en lugar de LANDSCAPE entonces se bloquea con el siguiente error ...no se pueda conectar a servicios de la cámara

07-30 12:51:37.655: ERROR/AndroidRuntime(22069): FATAL EXCEPTION: main 
07-30 12:51:37.655: ERROR/AndroidRuntime(22069): java.lang.RuntimeException: Fail to connect to camera service 
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):  at android.hardware.Camera.native_setup(Native Method) 
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):  at android.hardware.Camera.<init>(Camera.java:110) 
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):  at android.hardware.Camera.open(Camera.java:90) 
07-30 12:51:37.655: ERROR/AndroidRuntime(22069):  at org.digital.com.CamLayer.surfaceCreated(CamLayer.java:3 

El método se se estrella en IS ..

public void surfaceCreated(SurfaceHolder holder) { 
    synchronized(this) { 
     mCamera = Camera.open(); 

     Camera.Parameters p = mCamera.getParameters(); 
     p.setPreviewSize(800, 480); 
     mCamera.setParameters(p); 

     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      Log.e("Camera", "mCamera.setPreviewDisplay(holder);"); 
     } 

     mCamera.startPreview(); 
     mCamera.setPreviewCallback(this); 
    } 
} 

se estrella en mCamera = Camera.open();

Mi archivo de manifiesto tiene <uses-permission android:name="android.permission.CAMERA"></uses-permission>

¿Cómo puedo solucionar esto para poder ver mi aplicación en Portrait?

+1

¿En qué dispositivo está trabajando y qué versión de SDK? La vista previa de la cámara Afaik solo funciona correctamente en modo paisaje, pero en retrato. También quería usarlo en modo retrato (en N1, en Samsung Galaxy S), pero sin éxito. Consulte también el rastreador de errores en http://code.google.com/p/android/issues/detail?id=1193; aunque nunca recibí un error como el mencionado anteriormente. –

+0

Estoy usando un Nexus One 2.2 – Skizit

+0

¿Tiene otro dispositivo para probarlo? Funciona en Emulator? si es una aplicación pequeña, puedo ayudarte a probarla en mi N1 y Galaxy S. ¿Tu 2.2 es el 2.2 FRF91 final? –

Respuesta

16

Para su referencia, esta es la clase interna SurfaceHolderCallBack que estoy usando en mi aplicación y que funciona muy bien en el Nexus One 2.2 en modo vertical - espero que ayude.

Editar: "que funciona" = "que no falla". Aunque no he descubierto cómo rotar la imagen de vista previa correctamente (ver mi primer comentario arriba). Es por eso que tuve que usar material de interfaz de usuario y convertir 'UI' que rodea la superficie de vista previa en modo paisaje. La vista previa de Afaik (con la rotación correcta de la imagen de vista previa) solo funciona en modo horizontal. Rotación & los parámetros de orientación que probé no ayudaron en absoluto.

class SurfaceHolderCallback implements SurfaceHolder.Callback { 
    private static final int IMAGE_WIDTH = 512; 
    private static final int IMAGE_HEIGHT = 384; 
    private static final String ORIENTATION = "orientation"; 
    private static final String ROTATION = "rotation"; 
    private static final String PORTRAIT = "portrait"; 
    private static final String LANDSCAPE = "landscape"; 

    public void surfaceCreated(SurfaceHolder holder) { 
     try { 
      // This case can actually happen if the user opens and closes the camera too frequently. 
      // The problem is that we cannot really prevent this from happening as the user can easily 
      // get into a chain of activites and tries to escape using the back button. 
      // The most sensible solution would be to quit the entire EPostcard flow once the picture is sent. 
      camera = Camera.open(); 
     } catch(Exception e) { 
      finish(); 
      return; 
     } 

     //Surface.setOrientation(Display.DEFAULT_DISPLAY,Surface.ROTATION_90); 
     Parameters p = camera.getParameters(); 
     p.setPictureSize(IMAGE_WIDTH, IMAGE_HEIGHT); 

     camera.getParameters().setRotation(90); 

     Camera.Size s = p.getSupportedPreviewSizes().get(0); 
     p.setPreviewSize(s.width, s.height); 

     p.setPictureFormat(PixelFormat.JPEG); 
     p.set("flash-mode", "auto"); 
     camera.setParameters(p); 

     try { 
      camera.setPreviewDisplay(surfaceHolder); 
     } catch (Throwable ignored) { 
      Log.e(APP, "set preview error.", ignored); 
     } 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
           int height) { 
     if (isPreviewRunning) { 
      camera.stopPreview(); 
     } 
     try { 
      camera.startPreview(); 
     } catch(Exception e) { 
      Log.d(APP, "Cannot start preview", e);  
     } 
     isPreviewRunning = true; 
    } 

    public void surfaceDestroyed(SurfaceHolder arg0) { 
     if(isPreviewRunning && camera != null) { 
      if(camera!=null) { 
       camera.stopPreview(); 
       camera.release(); 
       camera = null; 
      } 
      isPreviewRunning = false; 
     } 
    } 
} 
+0

Mathias Lin ... ¿me pueden ayudar con respecto a http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk

+0

¿Dónde implementó el método de acabado? (en el bloque catch) y ¿qué hace? –

13

¿Tiene este conjunto en AndroidManifest.xml?

uses-permission android:name="android.permission.CAMERA" 
+0

Sí, tengo ese conjunto. – Skizit

+2

Gracias por publicar esto, incluso si es obvio, es un consejo útil para algunas personas que buscan esto (como yo). – Dimitris

+0

Romain Hippeau ... ¿me pueden ayudar con respecto a http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk

0

veo que haya establecido la zona de previsión establece como 800 x 480. En el modo vertical, este tamaño no es válido y que puede haber un error en la API que hace que choque.

intente configurar un área de vista previa de 200x200

+1

Traté de 800x480 previewSize en la muestra del código anterior, funciona bien en Nexus One 2.2. De hecho, 800x480 es el tamaño predeterminado que obtienes en N1 cuando llamas: p.getSupportedPreviewSizes(). Get (0); - por lo tanto, es un tamaño de vista previa correcto. –

+0

Sí, esto no soluciona nada. Rompe mis parámetros establecidos. – Skizit

+1

tiene que encontrar el tamaño de vista previa óptimo obtener todos los tamaños comparar y obtener el más grande y va a funcionar, – Toshe

24

Hay algún problema de concurrencia en la plataforma: http://code.google.com/p/android/issues/detail?id=6201

La solución es limpiar devolución de llamada antes de soltar la leva, es decir que recomendaría siguiente limpieza de código:

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    if (mCam != null) { 
     mCam.stopPreview(); 
     mCam.setPreviewCallback(null); 
     mCam.release(); 
     mCam = null; 
    } 
} 
+0

Kangur ... ¿me pueden ayudar con respecto a http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk

+0

Lo siento, no he estado androiding desde hace 3 años .. No tengo idea cómo funciona ahora :) – Kangur

0

pienso su problema es que cuando gira la cámara no se suelta correctamente o no se abre. Si cambia de landscape a portrait, la intención se inicia nuevamente. Si luego la cámara no se suelta y se vuelve a conectar, intente abrir una cámara que ya esté abierta, lo que arroja un error.

2

En lugar de utilizar:

<uses-permission 
    android:name="android.permission.FLASHLIGHT"/> 

Trate de usar:

<uses-permission 
    android:name="android.permission.FLASHLIGHT" 
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS" 
    android:protectionLevel="normal" /> 

y no se olvide de agregar el permiso para la cámara:

<uses-permission android:name="android.permission.CAMERA" /> 
+0

Parece que me ha ayudado en Nexus 7 (Android 5.0). ¿Cuál es el significado de las líneas adicionales de "grupo" y "nivel"? –

0

Otra posibilidad si está utilizando un emulador de Android puede ser que las cámaras frontal y posterior se definan como "ninguna" en la configuración del dispositivo virtual de Android.

Cuestiones relacionadas