Ho creato una app per fotocamera e voglio che la mia app venga ruotata in tutti i 4 possibili orientamenti e che aggiorni l'anteprima della fotocamera di conseguenza. per questo ho usato il seguente metodo che ho copiato da: Android - Camera preview is sidewaysAndroid: Orientamento schermo/Rotazione per anteprima fotocamera
public void updateCameraDisplay(int w, int h) {
// set preview size and make any resize, rotate or
// reformatting changes here
Log.i("CameraPreviews", "Updating camera orientation with w=" + w
+ " and h=" + h);
Parameters parameters = camera.getParameters();
Display display = getActivity().getWindowManager()
.getDefaultDisplay();
int rotation = getActivity().getResources().getConfiguration().orientation;
Log.i("CameraPreviews", "rotation is " + display.getRotation());
if (display.getRotation() == Surface.ROTATION_0) {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(0);
}
if (display.getRotation() == Surface.ROTATION_90) {
parameters.setPreviewSize(w, h);
camera.setDisplayOrientation(270);
}
if (display.getRotation() == Surface.ROTATION_180) {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(180);
}
if (display.getRotation() == Surface.ROTATION_270) {
parameters.setPreviewSize(w, h);
camera.setDisplayOrientation(90);
}
try {
camera.setParameters(parameters);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ho tweeked i valori, testarli sul Galaxy Tab2 Samsung per ottenere finalmente gli orientamenti giusti e tutto funziona. Quando ho provato su htc il telefono di uno s non funziona affatto !!!!! Tutti gli orientamenti sono totalmente sbagliati! Quindi sono arrivato alla conclusione che devono essere 2 tipi di dispositivi (o più ... per favore no!) Perché la rotazione rappresenta di quanti gradi lo schermo è stato ruotato dalla sua posizione "predefinita", quindi alcuni dispositivi hanno una posizione predefinita e altri ancora. Come posso scoprire questa rotazione predefinita e agire di conseguenza nel mio codice? ej: defaultOrientation = codice se (defaultOrientation == 0) ... altro ....
bloccare l'orientamento dello schermo è fuori discussione. bersaglio api> = 11 grazie mille
EDIT: ho modificato il mio codice a:
public void updateCameraDisplay(int w, int h) {
// set preview size and make any resize, rotate or
// reformatting changes here
Log.i("CameraPreviews", "Updating camera orientation with w=" + w
+ " and h=" + h);
Parameters parameters = camera.getParameters();
Display display = getActivity().getWindowManager()
.getDefaultDisplay();
int rotation = getActivity().getResources().getConfiguration().orientation;
Log.i("CameraPreviews", "screen rotation is " + rotation);
Log.i("CameraPreviews", "display rotation is " + display.getRotation());
if (display.getRotation() == Surface.ROTATION_0) {
if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(0);
} else {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(90);
}
}
else if (display.getRotation() == Surface.ROTATION_90) {
if (rotation == Configuration.ORIENTATION_PORTRAIT) {
parameters.setPreviewSize(w, h);
camera.setDisplayOrientation(270);
} else {
parameters.setPreviewSize(w, h);
//camera.setDisplayOrientation(0);
}
}
else if (display.getRotation() == Surface.ROTATION_180) {
if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(180);
}else {
parameters.setPreviewSize(h, w);
camera.setDisplayOrientation(270);
}
}
else if (display.getRotation() == Surface.ROTATION_270) {
if (rotation == Configuration.ORIENTATION_PORTRAIT) {
parameters.setPreviewSize(w, h);
camera.setDisplayOrientation(90);
} else {
parameters.setPreviewSize(w, h);
camera.setDisplayOrientation(180);
}
}
try {
camera.setParameters(parameters);
} catch (Exception e) {
e.printStackTrace();
}
}
funziona meglio su HTC One s e Samsung Galaxy Tab finché non ruotare il telefono in modalità verticale sottosopra
Penso che per la corretta implementazione sia necessario calcolare anche l'altezza/larghezza del dispositivo ... Usando la combinazione di angolo e altezza corrente del dispositivo, sarà possibile determinare la posizione esatta della vista – dreamcoder
Utilizzare ExifInterface per ottenere l'orientamento .. sta funzionando bene per me, ma non ho testato il mio codice in qualsiasi dispositivo HTC. – Biplab
2 tipi di dispositivi: http://stackoverflow.com/a/35431231/192373 –