2010-07-30 2 views
12

j'avais mon appareil photo réglé sur this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); et il fonctionne très bien, mais si je change à PORTRAIT au lieu de LANDSCAPE puis il se bloque avec l'erreur suivante ...Echec de la connexion au service de la caméra

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 

La méthode, il les accidents dans .. est-

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

Il se bloque à mCamera = Camera.open();

Mon fichier Manifest a <uses-permission android:name="android.permission.CAMERA"></uses-permission>

Comment résoudre ce problème afin que je puisse voir mon application dans Portrait?

+1

Sur quel périphérique travaillez-vous et quelle version du SDK? Afaik aperçu de la caméra ne fonctionne correctement en mode paysage, mais en portrait. Je voulais aussi l'utiliser en mode portrait (sur N1, sur Samsung Galaxy S), mais sans succès. Consultez également le suivi des bogues à l'adresse http://code.google.com/p/android/issues/detail?id=1193; bien que je n'ai jamais eu une erreur comme celle que vous avez mentionnée ci-dessus. –

+0

J'utilise un Nexus One 2.2 – Skizit

+0

Avez-vous un autre appareil pour le tester? Cela fonctionne-t-il dans Emulator? si c'est une petite apk, je peux vous aider à tester sur ma N1 et Galaxy S. Votre 2.2 est le 2.2 final FRF91? –

Répondre

16

À titre de référence, c'est la classe interne SurfaceHolderCallBack que j'utilise dans mon application et qui fonctionne très bien sur Nexus One 2.2 en mode portrait - espérons que cela aide.

Modifier: "qui fonctionne" = "qui ne plante pas". Bien que je n'ai pas compris comment faire pivoter l'image d'aperçu correctement (voir mon premier commentaire ci-dessus). C'est pourquoi j'ai dû utiliser le paysage et convertir les éléments de l'interface utilisateur qui entourent la surface d'aperçu en mode paysage. L'aperçu Afaik (avec une rotation correcte de l'image d'aperçu) ne fonctionne qu'en mode paysage. Rotation & paramètres d'orientation que j'ai essayé n'a pas aidé du tout.

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 ... pouvez-vous s'il vous plaît m'aider concernant http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk

+0

Où avez-vous implémenter la méthode de finition (dans le bloc catch) et qu'est-ce qu'il fait? –

13

Avez-vous ce jeu dans AndroidManifest.xml?

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

Ouais, j'ai cet ensemble. – Skizit

+2

Merci d'avoir posté cela, même si c'est évident, c'est un conseil utile pour certaines personnes qui recherchent cela (comme moi). – Dimitris

+0

Romain Hippeau ... pouvez-vous s'il vous plaît m'aider concernant http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk

0

Je vois que vous avez défini votre zone de prévisualisation défini comme 800 x 480. En mode portrait, cette taille est invalide et il pourrait y avoir un bogue dans l'API qui fait planter.

essayez de définir une zone d'aperçu de 200x200

+1

J'ai essayé 800x480 previewSize dans l'échantillon de code ci-dessus, fonctionne bien sur Nexus One 2.2. En fait 800x480 est la taille par défaut que vous obtenez sur N1 lors de l'appel: p.getSupportedPreviewSizes(). Get (0); - Par conséquent, il s'agit d'une taille d'aperçu correcte. –

+0

Oui, ça ne règle rien. Ça casse mes params. – Skizit

+1

vous devez trouver la taille de prévisualisation optimale obtenir toutes les tailles comparer et obtenir le plus grand et il va travailler, – Toshe

24

Il y a un problème de concurrence dans la plate-forme: http://code.google.com/p/android/issues/detail?id=6201

La solution consiste à effacer le rappel avant de relâcher la came, c'est je recommande la suite code de nettoyage:

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

Kangur ... pouvez-vous s'il vous plaît m'aider concernant http://stackoverflow.com/questions/26714771/android-camera-take-picture-failed-issue – koutuk

+0

Désolé, je n'ai pas été androiding depuis 3 ans .. Aucune idée comment ça marche maintenant :) – Kangur

0

Je pense votre problème est que lorsque vous faites pivoter la caméra, elle n'est pas libérée correctement ou pas du tout. Si vous passez de landscape à portrait, l'intention est à nouveau lancée. Si la caméra n'est pas relâchée et que vous recommencez, vous essayez d'ouvrir une caméra déjà ouverte, ce qui génère une erreur.

2

Au lieu d'utiliser:

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

Essayez d'utiliser:

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

et ne pas oublier d'ajouter l'autorisation pour la caméra:

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

Il semble m'avoir aidé sur Nexus 7 (Android 5.0). Quelle est la signification des lignes supplémentaires 'group' et' level'? –

0

Une autre possibilité si vous utilisez un émulateur Android peut être que les caméras avant et arrière sont définies comme "none" dans les paramètres Android Virtual Device.

Questions connexes