J'utilise un aperçu pour afficher ce que la caméra voit à l'écran.
Je peux tout faire fonctionner correctement, créer une surface, définir la surface et afficher la surface.
Cependant, il affiche toujours l'image à un angle incorrect de 90 degrés en mode portrait.
Comme dans l'image:
Je suis conscient que l'utilisation du code suivant rétablira l'image:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Cependant, j'ai l'aperçu dans une activité qui contient d'autres éléments et cela n'a pas de sens que mon activité soit affichée en mode paysage. (Il est désactivé par défaut)
Alors je me demandais s'il y avait de toute façon simplement changer l'orientation de l'aperçu? Et laisser le reste de mon activité correctement affiché en mode Portrait?
Ou de toute façon faire pivoter l'aperçu pour qu'il s'affiche correctement?
Réponses:
Ce problème semble avoir commencé comme un bogue avec certains matériels voir ici mais peut être surmonté en utilisant l'appel à mCamera.setDisplayOrientation (degrés) disponible dans l'API 8. Voici donc comment je l'implémente:
C'était sur un HTC Desire et j'ai d'abord dû mettre des instructions de journalisation dans chacun des contrôles de rotation pour dire ce qu'était la rotation, puis débogué sur l'appareil et regardé la sortie logCat pendant que je faisais pivoter l'appareil. Pour le HTC Desire, 0 était le téléphone comme on pouvait s'y attendre (portrait), 90 degrés tournait le téléphone à 90 degrés dans le sens inverse des aiguilles d'une montre (j'avais supposé que cela aurait été dans le sens des aiguilles d'une montre). Dans le code, vous verrez que je n'avais pas besoin de faire de rotation d'affichage lorsque le téléphone était à 90 ou 180 degrés - l'appareil semblait gérer cela lui-même. Un seul point ne fonctionne pas correctement: la rotation de 270 degrés se produit lorsque vous tournez l'appareil de 90 degrés dans le sens des aiguilles d'une montre et que la rotation de l'affichage est correcte, mais si vous faites pivoter l'appareil de 270 degrés dans le sens inverse des aiguilles d'une montre, cela ne semble pas le compenser correctement.
PS Notez la permutation de la largeur et de la hauteur dans les rotations appropriées.
la source
mCamera.setParameters(parameters);
instruction plante mon application, car les dimensions de la surface ne sont pas une taille d'aperçu valide pour mon téléphone (peut-être parce que je garde la barre d'état visible?). Cependant, je trouve que l' utilisationmCamera.setDisplayOrientation(90)
puismCamera.setPreviewDisplay(mSurfaceHolder);
sans régler les paramètres travaillaient aussi!essayez de définir l'orientation de l'affichage. Cela résout mon problème.
la source
onPreviewFrame()
ouonPictureTaken()
essayez ce code
la source
J'avais un problème avec la caméra frontale (problème à l'envers). Ensuite, j'ai utilisé la méthode suivante documentée dans Android Docs -
la source
Je l'ai fait en suivant les conseils de mCamera.setDisplayOrientation (90); mais aussi fait pivoter le bitmap parce que pour une raison quelconque, les autres approches ne fonctionnent pas pour moi dans la version 2.3.3.
Pour faire pivoter le bitmap, j'ai fait ceci:
la source
J'ai comparé mon code à celui du didacticiel et ce qui a finalement résolu le problème a été de mettre le code suivant dans mon AndroidManifext.xml
<activity>
:la source
la source
Je pense que la valeur SENSOR_ORIENTATION expliquera la valeur à utiliser pour la rotation au lieu du codage en dur à 90 degrés
la source