Je veux définir l'orientation de la caméra en fonction de l'orientation de l'appareil dans 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. Il faudrait que je le fasse pivoter de 90 degrés dans le sens des aiguilles d'une montre pour qu'il soit correct. Voici le code que j'utilise actuellement et qui fonctionne uniquement 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();
}
};
6 votes
Pour l'instant, l'aperçu de la caméra ne fonctionne réellement qu'en mode paysage, du moins pour les versions 2.2 et antérieures. Je suppose que c'est la raison pour laquelle les activités qui ont un aperçu de l'appareil photo ont tendance à cacher la barre de notification du système et n'ont pas de titres... bien qu'elles soient apparemment en mode portrait, je pense qu'elles sont "vraiment" en mode paysage.