RuntimeException sur Camera.setParameters () sur nexus one

J'ai copié le code de la réponse ici et j'ai toujours une erreur RuntimeException: setParameters échouée sur mon nexus. Mon fichier manifeste possède des autorisations de caméra et de wake_lock. Cela fonctionne sur l'émulateur, et sur le droïde, je n'ai pas l'erreur, mais il a un problème de rotation.

  • Comment passer params à mon application lorsqu'il est installé à partir de fichiers locaux ou de Google Play?
  • Retour et dernière activité
  • Comment créer dynamiquement une liste de tous les composants Android ui par programme? Par exemple, TextView, ImageView etc.
  • Comment ajouter une colonne booléenne dans Android SQlite
  • L'application n'est pas compatible avec la tablette
  • Différence entre bibliothèques statiques et partagées dans NDK d'Android?
  • Android - échec sur le chargement de la bibliothèque
  • Comment puis-je savoir si l'écran est activé sur Android?
  • Filtre Android LogCat pour plusieurs balises dans Eclipse
  • Comment créer une table dans Android avec plusieurs colonnes?
  • Viewable Viewable
  • Faire un appel téléphonique cliquer sur un bouton
  • 7 Solutions collect form web for “RuntimeException sur Camera.setParameters () sur nexus one”

    Vous recherchez probablement une taille d'aperçu non valide. Si vous vérifiez les résultats de adb logcat vous verrez probablement quelque chose comme ceci:

     E/QualcommCameraHardware(22732): Invalid preview size requested: 480x724 

    La solution consiste à demander la taille d'aperçu disponible la plus proche à celle que vous souhaitez; Vous pouvez obtenir une liste des tailles d'aperçu disponibles en appelant getSupportedPreviewSizes dans l'objet Camera.Parameters renvoyé par Camera.getParameters .

    J'ai corrigé cela en faisant ce que Roman a dit, avec le code:

      Camera.Parameters parameters = camera.getParameters(); List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); Camera.Size cs = sizes.get(0); parameters.setPreviewSize(cs.width, cs.height); camera.setParameters(parameters); 

    Pour ce qu'il vaut, la source de mon problème a fini par être que j'essayais d'appeler parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); Sans vérifier d'abord que les modes flash ont été pris en charge en vérifiant que parameters.getFlashMode() != null .

    Il y a plus d'une cause pour cette exception peu documentée, alors vérifiez tous vos paramètres et pas seulement que vous utilisez un supportedPreviewSize .

    Aucun de ces éléments n'a résolu cela pour moi. Ajout de ce code avant de définir les paramètres.

     // stop preview before making changes try { mCamera.stopPreview(); } catch (Exception e){ // ignore: tried to stop a non-existent preview } //now set your parameters 

    Pour moi, cela se produirait après avoir pris une photo et l'aperçu gelerait, jusqu'à ce que j'ai mis à jour mon appel pour que les paramètres soient les suivants. Il est toujours important avec cette erreur de vous assurer que vous vérifiez tous les paramètres que la caméra demande à configurer pour vous assurer que tous les paramètres auxquels vous demandez la caméra sont possibles pour la caméra.

     Camera.Parameters parameters = myCamera.getParameters(); 

    Avec la taille de l'aperçu:

     if (myCamera.getParameters().getSupportedPreviewSizes() != null){ Camera.Size previewSize = getOptimalPreviewSize(myCamera.getParameters().getSupportedPreviewSizes(), width, height);; parameters.setPreviewSize(previewSize.width, previewSize.height); } 

    Avec les modes flash / focus:

     if(parameters.getSupportedFocusModes() != null && parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){ parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); } if (parameters.getSupportedFlashModes() != null && parameters.getSupportedFlashModes().contains(Camera.Parameters.FLASH_MODE_AUTO)){ parameters.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); } myCamera.setParameters(parameters); 

    Etc. Tout cela enveloppé dans un bon essai {} catch () {} fonctionne très bien. Bonne chance.

    Voici la taille de GetOptimalPreview de ce grand tutoriel :

     private Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int width, int height) { // Source: http://stackoverflow.com/questions/7942378/android-camera-will-not-work-startpreview-fails Camera.Size optimalSize = null; final double ASPECT_TOLERANCE = 0.1; double targetRatio = (double) height / width; // Try to find a size match which suits the whole screen minus the menu on the left. for (Camera.Size size : sizes){ if (size.height != width) continue; double ratio = (double) size.width / size.height; if (ratio <= targetRatio + ASPECT_TOLERANCE && ratio >= targetRatio - ASPECT_TOLERANCE){ optimalSize = size; } } // If we cannot find the one that matches the aspect ratio, ignore the requirement. if (optimalSize == null) { // TODO : Backup in case we don't get a size. } return optimalSize; } 

    La solution de Sam est correcte, mais l'image de sortie est encore zoomée un peu sur plusieurs tablettes. L'une des meilleures pratiques que j'ai trouvées sur Internet, nous devrions configurer l'hôte Camera afin que les propriétés soient réutilisées chaque fois que la caméra est reprise. Voici méthode implémentée dans CameraHost:

     @Override public Parameters adjustPreviewParameters(Parameters parameters) { List<Camera.Size> sizes = parameters.getSupportedPreviewSizes(); Camera.Size cs = sizes.get(0); parameters.setPreviewSize(cs.width, cs.height); return super.adjustPreviewParameters(parameters); } 

    Certains projets de caméra open source comme opencamera utilisent toujours try-catch pour appeler Camera.setParameters:

     private void setCameraParameters(Camera.Parameters parameters) { if( MyDebug.LOG ) Log.d(TAG, "setCameraParameters"); try { camera.setParameters(parameters); if( MyDebug.LOG ) Log.d(TAG, "done"); } catch (RuntimeException e) { // just in case something has gone wrong if( MyDebug.LOG ) Log.d(TAG, "failed to set parameters"); e.printStackTrace(); count_camera_parameters_exception++; } } 

    En outre, obtenez toujours les derniers getParameters avant d'appeler setParameters comme ceci:

     void setRotation(int rotation) { Camera.Parameters parameters = this.getParameters(); parameters.setRotation(rotation); setCameraParameters(parameters); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.