Je souhaite définir l'orientation de la caméra en fonction de l'orientation de l'appareil sous Android, mais rien ne semble fonctionner. J'ai essayé de faire pivoter la Surface ainsi que les paramètres de l'appareil photo, mais l'aperçu de l'appareil photo en mode portrait est toujours à l'envers. J'aurais besoin de le faire pivoter de 90 degrés dans le sens des aiguilles d'une montre pour que ce soit correct. Voici le code que j'utilise actuellement qui ne fonctionne qu'en mode paysage.
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
camera = null;
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCamera();
}
private Size getOptimalPreviewSize(List<Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.2;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for (Size size : sizes) {
Log.d(TAG, "Checking size " + size.width + "w " + size.height
+ "h");
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the
// requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
List<Size> sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, width, height);
Log.d(TAG, "Surface size is " + width + "w " + height + "h");
Log.d(TAG, "Optimal size is " + optimalSize.width + "w " + optimalSize.height + "h");
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
// parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
};
android
camera
orientation
surfaceview
Abhinav
la source
la source
Réponses:
De l'autre membre et mon problème:
Le problème de rotation de la caméra dépend de différents appareils et de certaines versions.
Version 1.6: pour résoudre le problème de rotation, et c'est bon pour la plupart des appareils
Version 2.1: dépend du type de périphérique, par exemple, impossible de résoudre le problème avec XPeria X10, mais c'est bon pour X8 et Mini
Version 2.2: pas pour tous les appareils
http://code.google.com/p/android/issues/detail?id=1193#c42
la source
À partir des Javadocs pour
setDisplayOrientation(int)
(nécessite le niveau d'API 9):la source
CameraInfo
n'a pas été introduite avant le niveau d'API 9, donc la méthode que j'ai publiée nécessite le niveau d'API 9.result = (360 - result) % 360; // compensate the mirror
devraient être supprimées , les images de la caméra frontale sont sinon tournées incorrectementCette solution fonctionnera pour toutes les versions d'Android. Vous pouvez utiliser la réflexion en Java pour le faire fonctionner sur tous les appareils Android:
Fondamentalement, vous devez créer un wrapper de réflexion pour appeler Android 2.2 setDisplayOrientation, au lieu d'appeler la méthode spécifique.
La méthode:
Et au lieu d'utiliser camera.setDisplayOrientation (x), utilisez setDisplayOrientation (camera, x) :
la source
Camera.Parameters
. Essayez d'ajouter la ligne suivante:Camera.Parameters p = camera.getParameters();
J'ai rencontré le problème lorsque j'utilisais ZBar pour la numérisation dans les onglets. Problème d'orientation de la caméra. En utilisant le code ci-dessous, j'ai pu résoudre le problème. Il ne s'agit pas de l'extrait de code complet, veuillez ne prendre que de l'aide.
la source
J'ai finalement résolu ce problème à l'aide de l'application appareil photo de Google. Il obtient l'orientation du téléphone à l'aide d'un capteur, puis définit la balise EXIF de manière appropriée. Le JPEG qui sort de l'appareil photo n'est pas orienté automatiquement.
En outre, l'aperçu de l'appareil photo ne fonctionne correctement qu'en mode paysage. Si vous avez besoin que votre disposition d'activité soit orientée en portrait, vous devrez le faire manuellement en utilisant la valeur du capteur d'orientation.
la source
Ce problème a été résolu il y a longtemps mais j'ai rencontré quelques difficultés pour assembler toutes les pièces donc voici ma solution finale, j'espère que cela aidera les autres:
la source
découvrez cette solution
la source