Ich möchte die Kameraausrichtung entsprechend der Geräteausrichtung in Android einstellen, aber nichts scheint zu funktionieren. Ich habe versucht, die Oberfläche sowie die Kameraparameter zu drehen, aber die Kameravorschau im Hochformat steht immer auf dem Kopf. Ich müsste es um 90 Grad im Uhrzeigersinn drehen, damit es korrekt ist. Hier ist der Code, den ich gerade verwende und der nur im Querformat funktioniert.
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
quelle
quelle
Antworten:
Von einem anderen Mitglied und meinem Problem:
Das Problem mit der Kameradrehung hängt von verschiedenen Geräten und bestimmten Versionen ab.
Version 1.6: Behebung des Rotationsproblems, das für die meisten Geräte geeignet ist
Version 2.1: Abhängig von der Art der Geräte, z. B. Cannt behebt das Problem mit XPeria X10, aber es ist gut für X8 und Mini
Version 2.2: nicht für alle Geräte
http://code.google.com/p/android/issues/detail?id=1193#c42
quelle
Aus den Javadocs für
setDisplayOrientation(int)
(erfordert API-Level 9):quelle
CameraInfo
wurde erst auf API-Ebene 9 eingeführt, daher erfordert die von mir veröffentlichte Methode API-Ebene 9.result = (360 - result) % 360; // compensate the mirror
sollte gelöscht werden , werden die Bilder von der Frontkamera sonst falsch gedrehtDiese Lösung funktioniert für alle Versionen von Android. Sie können Reflection in Java verwenden, damit es für alle Android-Geräte funktioniert:
Grundsätzlich sollten Sie einen Reflection-Wrapper erstellen, um Android 2.2 setDisplayOrientation aufzurufen, anstatt die spezifische Methode aufzurufen.
Die Methode:
Und anstatt camera.setDisplayOrientation (x) zu verwenden, verwenden Sie setDisplayOrientation (camera, x) :
quelle
Camera.Parameters
. Versuchen Sie, die folgende Zeile hinzuzufügen:Camera.Parameters p = camera.getParameters();
Ich hatte das Problem, als ich ZBar zum Scannen in Registerkarten verwendete. Problem mit der Kameraausrichtung. Mit dem folgenden Code konnte ich das Problem beheben. Dies ist nicht das gesamte Code-Snippet. Bitte nehmen Sie nur Hilfe davon.
quelle
Ich habe dies schließlich mit der Kamera-App von Google behoben. Mithilfe eines Sensors wird die Ausrichtung des Telefons ermittelt und das EXIF-Tag entsprechend festgelegt. Das JPEG, das aus der Kamera kommt, wird nicht automatisch ausgerichtet.
Außerdem funktioniert die Kameravorschau nur im Querformat ordnungsgemäß. Wenn Sie möchten, dass Ihr Aktivitätslayout im Hochformat ausgerichtet ist, müssen Sie dies manuell anhand des Werts des Orientierungssensors tun.
quelle
Dieses Problem wurde vor langer Zeit gelöst, aber ich hatte einige Schwierigkeiten, alle Teile zusammenzusetzen. Hier ist meine endgültige Lösung. Ich hoffe, dies wird anderen helfen:
quelle
Schauen Sie sich diese Lösung an
quelle