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 vérifier une application viole la politique d'usurpation d'identité de Google ou non
  • Utilisez les classes générées par JAXB (xjc) dans Android
  • Anime l'angle de balayage Android Ring Shape
  • Comment faire une application avec des chaînes vraiment multilingues?
  • Android Volley - Comment animer le chargement de l'image?
  • Java.lang.IllegalArgumentException: column'_data 'n'existe pas
  • OData Consumer pour Android - que OData tookit / framework devrait-je utiliser?
  • Voir au centre de la mise en page s'il y a suffisamment d'espace
  • Android 5.0 et BLE publicité de service personnalisé UUID
  • Android - Créer une application avec Java pur et sans XML?
  • Emulateur Android ABI
  • Gradle 0.9. + / 0.9.2 erreur: Impossible de charger la classe 'com.android.builder.testing.api.DeviceProvider'
  • 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.