2016-02-15 32 views
10

Sono una specie di principiante nello sviluppo di Android, quindi mi scuso in anticipo se la mia domanda è banale. In una parte della mia app ho bisogno di un'anteprima live della mia fotocamera posteriore, quindi ho creato una classe personalizzata che estende SurfaceView e implementa SurfaceHolder.Callback (ho seguito fondamentalmente le istruzioni nella documentazione di Android).Correzione del sensore di paesaggio retromarcia Nexus 5x in una app di anteprima per fotocamera Android

Sfortunatamente, sto testando la mia app in un Nexus 5x, che ho appena realizzato che ha installato il sensore della fotocamera in modo inverso. Per questo motivo, l'anteprima della fotocamera della mia app quando è in esecuzione sul mio Nexus 5x appare sottosopra, il che è qualcosa che non desidero.

Sembra che la nuova API android.hardware.camera2 sia in grado di gestire questo problema automaticamente. Alla fine avrò bisogno di aggiornare tutto il mio codice usando questa nuova API, ma per ora quello di cui ho bisogno è una soluzione rapida durante l'utilizzo della vecchia API della fotocamera.

Così stavo leggendo là fuori e ho trovato un pezzo di codice che avrei dovuto introdurre nel metodo SurfaceChanged per risolvere il problema. Eccolo:

Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

     if(display.getRotation() == Surface.ROTATION_0) 
     { 
      parameters.setPreviewSize(capHeight, capWidth);       
      camera.setDisplayOrientation(90); 
     } 

     if(display.getRotation() == Surface.ROTATION_90) 
     { 
      parameters.setPreviewSize(capWidth, capHeight);       
     } 

     if(display.getRotation() == Surface.ROTATION_180) 
     { 
      parameters.setPreviewSize(capHeight, capWidth);    
     } 

     if(display.getRotation() == Surface.ROTATION_270) 
     { 
      parameters.setPreviewSize(capWidth, capHeight); 
      camera.setDisplayOrientation(180); 
     } 

     camera.setParameters(parameters);*/ 

     camera.startPreview(); 

Il problema è che non vedo che qualcosa è cambiato.

Qualche idea?

risposta

0

Lo stesso qui. Poiché camera2 non supporta i dispositivi < API 21 e non vuole implementare le due API, sarebbe bello avere una soluzione rapida.

sto cercando somthing come:

if (Build.MODEL.equals("Nexus 5x")){ 
    // rotate camera 180° 
    mCamera.setDisplayOrientation(180); 
} 

ma non può ruotare il display della fotocamera. Verifichi se c'è qualcosa a che fare con PreviewCallback

È una brutta cosa usare le 2 apis? Come in questo argomento, non è raccomandato: How to use Android's camera or camera2 API to support old and new API versions without deprecation notes?

+1

E il Nexus 6P? – innich

9

La fotocamera 5X non è "indietro"; lo fa segnalare l'orientamento della fotocamera corretto nei suoi parametri, quindi non sono necessarie soluzioni speciali, basta assicurarsi che si sta impostando l'orientamento dello schermo in modo corretto:

public static void setCameraDisplayOrientation(Activity activity, 
    int cameraId, android.hardware.Camera camera) { 
android.hardware.Camera.CameraInfo info = 
     new android.hardware.Camera.CameraInfo(); 
android.hardware.Camera.getCameraInfo(cameraId, info); 
int rotation = activity.getWindowManager().getDefaultDisplay() 
     .getRotation(); 
int degrees = 0; 
switch (rotation) { 
    case Surface.ROTATION_0: degrees = 0; break; 
    case Surface.ROTATION_90: degrees = 90; break; 
    case Surface.ROTATION_180: degrees = 180; break; 
    case Surface.ROTATION_270: degrees = 270; break; 
} 

int result; 
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
    result = (info.orientation + degrees) % 360; 
    result = (360 - result) % 360; // compensate the mirror 
} else { // back-facing 
    result = (info.orientation - degrees + 360) % 360; 
} 
camera.setDisplayOrientation(result); 
} 

Da http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29

+4

Questo è corretto per l'anteprima ma quando si desidera elaborare l'immagine è necessario considerare la rotazione della fotocamera che è 270 rispetto a 90 sulla maggior parte dei dispositivi (ovvero l'immagine è capovolta). –

+5

@EmanuelMoecklin Sì il codice precedente corregge il display della videocamera ma le immagini mostrate sono ancora capovolte, come posso risolvere questo problema? – user2056563

+0

Ho ruotato l'immagine usando OpenCV4Android – Heribert

3
if (Build.MODEL.equals("Nexus 5X")){ 
    // rotate camera 180° 
    mCamera.setDisplayOrientation(180); 
} 

Change 5x a 5X andrà bene.