2012-11-21 7 views
11

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

+1

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

+0

Utilizzare ExifInterface per ottenere l'orientamento .. sta funzionando bene per me, ma non ho testato il mio codice in qualsiasi dispositivo HTC. – Biplab

+0

2 tipi di dispositivi: http://stackoverflow.com/a/35431231/192373 –

risposta

0

i fattori che devi considerare sono: l'orientamento del dispositivo, il grado tra lo schermo e la fotocamera, assumendo che stai usando la fotocamera posteriore e se abiliti l'attività a percepire il cambiamento di orientamento.

E una cosa importante è se il codice HAL della telecamera implementato dal produttore è conforme al protocollo di Google.