Le rappel de l'autofocus de la caméra ne se produit pas

J'utilise l'API Camera sur Android et j'ai mis mon code sur plusieurs plates-formes, y compris les Samsung Galaxies et HTC Desire. Jusqu'à présent, je n'ai qu'un problème sur le HTC Desire Z, ce qui est intermittent.

Dans mon code, j'appelle les instructions suivantes

  • Comment puis-je avoir une ombre portée sur mon ActionBar (ActionBarSherlock)?
  • Compiler, Fournir, APK - Période de dépendance Android
  • Comment puis-je savoir quand un changement de configuration se produit à Froyo?
  • Transmettre et lancer le flux .m4a (URL d'aperçu Itunes) dans Android
  • La barre d'action s'affiche de manière incorrecte lors du retour du mode immersif
  • Android ActionBar Personnaliser la vue de recherche
  • camera.startPreview(); camera.autoFocus(autoFocusCallback); 

    Où j'ai déjà créé la classe autoFocusCallback requise. J'aimerais souligner à nouveau que ce code fonctionne sur les téléphones, y compris celui avec lequel j'ai des problèmes, alors n'oubliez pas d'examiner le code. 🙂 Après que le rappel est appelé, mon code continue ensuite à prendre la photo, mais cette partie n'est pas pertinente pour l'instant.

    Le problème intermittent est que pour une certaine image aléatoire (se produit une sur 20-100 fois), le rappel ne se produit pas. J'ai vérifié avec mon propre Log.i () que c'est la dernière commande effectuée (c'est-à-dire que le code n'atteint pas le rappel). Debug montre également qu'aucune erreur n'est signalée.

    Juste pour régler votre esprit à l'aise, mon rappel ressemble à quelque chose comme ça

     AutoFocusCallback autoFocusCallback = new AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { Log.i("tag","this ran"); ... ... } }; 

    Les résultats Logcat pour une exécution réussie ressemblent à cela

     07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): startPreview X 07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus E 07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus X 07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): runAutoFocus E 07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): af start (fd 49) 07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): native_set_afmode: ctrlCmd.status == 0 07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): af done: 1 07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): runAutoFocus X 07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): takePicture(479) 

    Mais la course problématique est comme ça

     07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): startPreview X 07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus E 07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus X 07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): runAutoFocus E 07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): af start (fd 49) 

    Et puis il se bloque.

    J'aimerais savoir si quelqu'un a des idées sur ce problème, ou si vous avez connu quelque chose de similaire? Je n'ai réussi à trouver qu'un thread sur le net avec des problèmes similaires, voici http://groups.google.com/group/android-developers/browse_thread/thread/75ecb8db0ae02bdb

  • Comment puis-je afficher la commande CLI exécutée par une tâche Gradle dans Android Studio?
  • Comment appeler une fonction javascript directement à partir d'une activité dans Android?
  • Incohérence lors du réglage de la taille de police TextView dans le code et dans les ressources
  • Comment afficher le symbole enregistré Ⓡ ou trademark ™ dans la boîte de dialogue?
  • Liste des téléphones Android les plus populaires?
  • Que se passe-t-il si un gestionnaire publie un message sur un thread après Looper.prepare () mais avant que Looper.loop () ne soit appelé?
  • 2 Solutions collect form web for “Le rappel de l'autofocus de la caméra ne se produit pas”

    Les appels de mise au point automatique n'ont pas de délai d'attente. J'ai rencontré certains périphériques où l'autofocus appelle sporadiquement échouer à rappeler (même dans des conditions parfaites). Lorsque le même code fonctionne très bien sur d'autres périphériques.

    Ma solution était de rouler mon propre mécanisme de délai d'expiration pour l'autofocus. Je l'ai fait avec un avenir planifié, mais la meilleure exécution de délai d'attente peut dépendre de votre cas d'utilisation spécifique.

     final ScheduledFuture<?> focusTimeoutFuture = mScheduledExecutorService.schedule(new Runnable() { @Override public void run() { takePictureAndCancelAutoFocus(); } }, 3, TimeUnit.SECONDS);// add a 3 second timeout to autofocus mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean b, Camera camera) { // cancel the timeout future if it didn't run already boolean canceledFuture = focusTimeoutFuture.cancel(false); if(canceledFuture) { takePictureAndCancelAutoFocus(); } } } 

    Pas une solution à votre problème spécifique, mais la question en général est que vous pouvez appeler la mise au point automatique avant la mise en route. Dans ce cas également, aucun autofocus ne se produit lorsque l'aperçu est activé.

    De la documentation

    "Cette méthode n'est valable que lorsque l'aperçu est actif (entre startPreview() et avant stopPreview() )".

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.