Appareil photo Android inexplicable rotation sur la capture pour certains appareils (pas dans l'EXIF)
Ce que je fais semble que ce devrait être simple, mais je suis toujours perdu après j'ai lu tous les possibles Stackoverflow réponse que je peux trouver et Googlé chaque article que je peut trouver.
Je suis en utilisant un aperçu SurfaceView et la capture d'une image à partir d'une activité est définie pour screenOrientation="paysage" dans mon AndroidManifest.xml.
J'ai suivi l'exemple de la Caméra le code de l'application et de la pensée, les choses étaient de travail jusqu'à ce que j'ai essayé de mon application sur quelques appareils Motorola exécution 1.5.
J'ai le OrientationEventListener en cours d'exécution OK et j'ai utiliser la réflexion pour voir si la valeur de la rotation en tant que tel:
final int latchedOrientation = roundOrientation(mLastOrientation + 90);
Parameters parameters = preview.camera.getParameters();
JPLog.d("Setting camera rotation = %d", latchedOrientation);
try {
//if >= 2.0
Method method = Camera.Parameters.class.getMethod("setRotation",
int.class);
if(method != null) {
method.invoke(parameters, latchedOrientation);
}
} catch(Throwable t) {
//if < 2.0
parameters.set("rotation", latchedOrientation);
}
preview.camera.setParameters(parameters);
NexusOne (OS 2.2) - Fonctionne très bien. latchedOrientation = 0, image OK, sans aucune rotation dans l'en-tête EXIF.
T-Mobile G1 (OS 1.6) - fonctionne Également bien. latchedOrientation = 0, image OK.
Motorola Backflip (OS 1.5) - rotation de l'Image. latchedOrientation = 0, l'image n'a pas d'EXIF de rotation en elle.
Motorola CLIQ (OS 1.5) - rotation de l'Image. latchedOrientation = 0, l'image n'a pas d'EXIF de rotation en elle.
Ce qui se passe avec ces appareils Motorola? Je pensais que mon problème était le Motorola pilote de la caméra n'était pas la rotation de l'image, afin trouvé le Sanselan EXIF cours de lecture pour Android et se prépare à faire tourner moi-même. La chose drôle est, il est en-têtes EXIF mais pas de rotation de l'élément.
Si j'ai mis la rotation manuellement à 90 degrés, les images parfaites à la périphériques Motorola, mais maintenant, le G1 et le NexusOne avoir des images qui sont une rotation de 90 degrés (pas ce que je veux). Il y a quelque chose que je ne suis pas arriver ici.
Je suis douter c'est de 1,5 question, ou bien que quelqu'un l'ai posté des infos sur elle?
- Réponse ici stackoverflow.com/questions/14066038/...
Vous devez vous connecter pour publier un commentaire.
C'est en fait un problème spécifique au périphérique qui affecte principalement les appareils Motorola. Les devs google inclus un setDisplayOrientation appel de l'API de 8 à contourner le problème. Le principal bug est déposée ici.
Pour ceux qui ne peuvent pas aller à l'API 8, les deux solutions sont:
Remplacer onDraw
Remplacer onDraw à un niveau supérieur ViewGroup et tournez la toile de 90 degrés pour compenser la rotation. Remarque il y a une mise en garde ici que votre contact événements aurez aussi besoin d'être tourné.
Utilisation En Mode Paysage
Verrouillage de l'activité en mode paysage, mais dessiner des actifs comme si ils sont dans le portrait. Cela signifie que vous faites de votre mise en page et de la faire pivoter votre image actifs à regarder comme si vous êtes en mode portrait, de sorte que le point de vue semble normal. Cela rend malheureusement difficile l'utilisation du menu depuis le menu s'ouvre horizontalement.
J'ai aussi vu des gens utiliser un contrôleur d'animation pour faire pivoter la vue. L'inconvénient que je n'étais pas en mesure de surmonter, c'est que la rotation de la vue n'est pas de s'étirer pour remplir l'écran. Voir la réponse par Georg pour un exemple de mise en œuvre.
J'ai eu ce problème et j'ai utilisé cette méthode pour capturer l'image. (Sans la création d'un appareil personnalisé)
et a fait le reste en onActivityResult(int requestCode, int resultCode, Intent data) {}
Mais l'image d'origine (Réelle de l'image de la carte SD) était correct et Bitmap a été tourné lorsque je l'ai récupéré comme ça.
Bitmap bmp = BitmapFactory.decodeStream(..
La solution:
angle = 0
il n'est pas nécessaire de le décoder et de créer une seconde image avec une rotation de 0. Cela devrait, en cas d'exécution sur un non effectuée à l'appareil, de réduire la consommation de mémoire de 50% pour ce processus.code Matrix matrix = new Matrix(); matrix.postTranslate(-width / 2, -height / 2); matrix.postRotate(angle); matrix.postTranslate(width / 2, height / 2);
Voici le code que j'ai utilisé onActivityResult() dans mon activité. L'intention était retourné pour la sélection d'une image de type image/*. Fonctionne bien pour moi!
Il ressemble à la mode paysage suggestion est la seule chose qui fonctionne vraiment. Il semble que c'est ok pour que ce soit dans le manifeste, ou via un appel à
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
dans l'activité onCreate.