2017-06-13 2 views
4

J'utilise l'API Android Camera2 pour prendre des photos pour une application et je ne peux pas obtenir le flash pour fonctionner correctement sur la plupart des appareils Samsung Galaxy (galaxy s6 edge, galaxy s7, galaxy j7). Je crois que j'ai implémenté correctement la logique du flash car l'application Appareil photo de Google qui était sur le Play Store présente également les mêmes comportements. La galaxie s8 semble aussi bien fonctionner avec le flash (bien que les résultats aient un éclairage incohérent)Android Camera2 API Flash ne fonctionne pas sur les appareils Galaxy

Le problème avec la galaxie j7 est que lorsque je prends une photo avec flash (soit avec le flash bloqué soit avec le flash automatique) une scène qui nécessite un flash) le flash restera allumé pendant une longue période, l'aperçu se verrouillera, et après environ 7 secondes l'image prendra, et le flash ne fait pas partie de l'image.

Je la manipulation des méthodes suivantes modes flash:

private void setAutoFlash(CaptureRequest.Builder requestBuilder) 
{ 
    switch (mFlashState) 
    { 
     case FLASH_STATE_AUTO: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH); 
      //requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      break; 
     case FLASH_STATE_ON: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON_ALWAYS_FLASH); 
      //requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE); 
      break; 
     case FLASH_STATE_OFF: 
      requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); 
      //requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
      break; 
    } 
} 

Cette logique flash est appelé à chaque fois qu'un CaptureRequest.Builder est nécessaire

Les 3 lignes commentées sont autre chose que j'ai lu qui a été suggéré pour aider à travailler flash correctement pour moi, mais il ne semble pas faire quelque chose

Samsung a sa propre API de caméra (http://developer.samsung.com/galaxy/camera) mais je lis qu'il est juste une enveloppe sur Camera2 et je Je suis inquiet que leur API ne réglera même pas mon problème.

Informations complémentaires:

  • J'ai essayé quelques applications de la caméra à partir du magasin de jeu, un peu de travail et d'autres DonT.
  • ZCamera fonctionne très bien avec le flash, ce qui me fait penser qu'ils utilisent Samsungs API de caméra pour le faire fonctionner, mais je remarque que le travail ne marche pas de mesure tactile ZCamera sur les appareils Samsung qui est un autre problème que je suis tombé lors du débogage de ma mise en œuvre de Camera2.
  • Flash ne semble fonctionner très bien si je colle avec l'API de caméra dépréciée

Toute aide sur la façon d'accomplir un flash de travail serait grandement appréciée

Répondre

1

Après avoir travaillé et désactiver cette fonction pour un peu je réalisé quelques choses. J'ai mentionné que ZCamera (du magasin de jeu) fonctionne avec le flash, et j'ai pensé qu'ils ont accompli ceci en utilisant le Samsung SDK. J'ai vérifié l'application et elle n'utilise pas le Samsung SDK.

J'ai également intégré le Samsung SDK dans mon application et cela n'a rien changé. Le Samsung SDK est vraiment juste une enveloppe autour de l'appareil photo 2 de Google, de sorte que vous pouvez ajouter des fonctionnalités spécifiques de Samsung, en l'ajoutant à votre projet ne corrigera pas les compatibilités de Samsung. Ce que j'ai finalement réalisé, c'est que le flux de mesure tactile que j'avais programmé moi-même (toucher pour faire la mise au point puis prendre une photo) fonctionnait très différemment de ma logique quand on prend une photo sans faire de mise au point. La logique photo normale a été empruntée à googles camera2 api exemple de code et ce n'était pas la propriété de travail. L'astuce pour obtenir le flash sur les appareils Samsung (ou du moins ce qui a fonctionné pour moi) était d'abord déclencher une vérification des niveaux d'AE, et une fois que cela converge, alors commencez le déclenchement de mise au point automatique.Si le flash est activé, le flash se déclenchera pour vérifier les niveaux AE et effectuer la mise au point, puis déclencher une nouvelle fois le flash pour prendre la photo

0

Actuellement, l'utilisation de l'API camera2 est très spéciale dans les appareils Android. Certaines méthodes peuvent ne pas être implémentées. Par exemple: this et this. Pour les autres, les modes de flash appropriés doivent être définis en fonction des autres propriétés. Ce code fonctionne pour moi dans la plupart des appareils Samsung qui prennent en charge camera2API:

if (mIsFlashSupported) { 
     switch (mFlashMode) { 
      case FLASH_MODE_ON: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE); 
       requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_FLUORESCENT); 
       break; 

      case FLASH_MODE_OFF: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_OFF); 
       requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT); 
       break; 

      case FLASH_MODE_AUTO: 
      default: 
       requestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON_AUTO_FLASH); 
       requestBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_SINGLE); 
       requestBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_DAYLIGHT); 
       break; 
     } 
    } 
0

Mon application prend une photo toutes les 5 secondes. Je (1) sélectionne la caméra, (2) acquiert une session puis à chaque boucle je crée une requête Capture dans laquelle je règle le mode Flash et appelle la méthode de capture sur la session.

Je n'ai pas eu de problème avec mon Samsung SM-G550T (version Android 6.01), mais j'avais quelques soucis avec le mode Flash sur mon Moto G4 (Android version 7.0). Je suis arrivé deux téléphones à Flash, mais seulement avec ce paramètre:

CaptureRequest.Builder requestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE); 
requestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_SINGLE); 

je rencontre actuellement un problème avec un appareil LG (de M210N) (version Android 7.0). En utilisant les paramètres que j'ai indiqués ci-dessus, je reçois l'appareil pour clignoter juste une fois. Si je réinitialise complètement l'appareil photo (comme décrit ci-dessus), l'appareil ne clignotera qu'une seule fois.

Si j'ajoute le paramètre CONTROL_AE_MODE_ON_ALWAYS_FLASH au RequestBuilder précédent, le LG ne clignote pas du tout. Donc j'ai dû enlever ce drapeau.

J'ai essayé de nombreux paramètres et combinaisons supplémentaires pour les paramètres et aucun d'entre eux n'a éliminé ce problème. Je me demande combien de périphériques sont concernés par ce problème.