2010-10-01 12 views
114

Używam podglądu, aby wyświetlić to, co kamera widzi na ekranie.Android - Podgląd kamery jest bokiem.

Mogę sprawić, że wszystko działa poprawnie, utworzona powierzchnia, zestaw powierzchni i wyświetlana powierzchnia.

Jednak zawsze wyświetla obraz pod nieprawidłowym kątem 90 stopni w trybie portretu.

Takie jak na zdjęciu:

alt text

Zdaję sobie sprawę, że za pomocą poniższego kodu będzie ustawić obraz prosto:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Jednak mam podgląd w ramach działalności, która ma inne elementy i nie ma sensu, aby moja aktywność była wyświetlana w trybie poziomym. (Domyślnie jest wyłączone)

Zastanawiam się, czy jest tak, aby zmienić orientację podglądu? Czy pozostała część mojej aktywności jest prawidłowo wyświetlana w trybie portretu?

Lub w każdym razie, aby obrócić podgląd, aby był wyświetlany poprawnie?

+0

Sprawdźcie - http://stackoverflow.com/questions/10259299/force-a-camera -to-zawsze-otwórz-w-trybie-portret-w-android/10259572 # 10259572 –

Odpowiedz

139

Ten problem pojawił się, jak rozpocząć z pewnym błędem sprzętu see here ale można przezwyciężyć za pomocą połączenia z mCamera.setDisplayOrientation (stopnie) dostępne API 8. Tak to jest jak zaimplementować go:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {    
    if (isPreviewRunning) { 
     mCamera.stopPreview(); 
    } 

    Parameters parameters = mCamera.getParameters(); 
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

    if(display.getRotation() == Surface.ROTATION_0) { 
     parameters.setPreviewSize(height, width);       
     mCamera.setDisplayOrientation(90); 
    } 

    if(display.getRotation() == Surface.ROTATION_90) { 
     parameters.setPreviewSize(width, height);       
    } 

    if(display.getRotation() == Surface.ROTATION_180) { 
     parameters.setPreviewSize(height, width);    
    } 

    if(display.getRotation() == Surface.ROTATION_270) { 
     parameters.setPreviewSize(width, height); 
     mCamera.setDisplayOrientation(180); 
    } 

    mCamera.setParameters(parameters); 
    previewCamera();      
} 

And the previewCamera method : 

public void previewCamera() {   
    try {   
     mCamera.setPreviewDisplay(mSurfaceHolder);   
     mCamera.startPreview(); 
     isPreviewRunning = true; 
    } catch(Exception e) { 
     Log.d(APP_CLASS, "Cannot start preview", e);  
    } 
} 

To było w HTC Desire i musiałem początkowo umieścić w każdej z kontroli rotacji instrukcje rejestrowania, aby powiedzieć, co było rotacją, a następnie debugować urządzenie i obserwowałem wyjście logCat podczas obracania urządzenia. Dla HTC Desire, 0 było telefonem, jak można się było spodziewać (portret), 90 stopni obracało telefon o 90 stopni COUNTER-CLOCKWISE (założyłem, że byłby zgodny z ruchem wskazówek zegara). W kodzie zobaczysz, że nie musiałem obracać wyświetlacza, gdy telefon był pod kątem 90 lub 180 stopni - urządzenie wydawało się to samo obsługiwać. Tylko jeden punkt nie działa poprawnie: Obrót o 270 stopni następuje po obróceniu urządzenia o 90 stopni zgodnie z ruchem wskazówek zegara, a obrót wyświetlacza jest prawidłowy, ale jeśli obrócisz urządzenie o 270 stopni w kierunku przeciwnym do ruchu wskazówek zegara, nie wydaje się, żeby to właściwie skompensować.

P.S. Zwróć uwagę na zamiany szerokości i wysokości w odpowiednich obrotach.

+7

ale setDisplayOrientation (stopień); metoda obsługuje formularz 2.2, a co z wersją niższą? parameters.setRotation (90); \t \t \t parameters.set ("orientacja", "portret"); nie działają. Jeśli masz jakieś rozwiązanie dla niższych wersji, pomóż mi. – Vikram

+1

Zaimplementowałem podgląd na mojej aplikacji, który zawsze będzie wyświetlany w trybie portretu. Zawsze obracałem ekran o 90 stopni i wydawało mi się, że działa na każdym urządzeniu, dopóki nie przetestowaliśmy go w HTC Desire C. Ponieważ nie liczę teraz na to urządzenie, aby przetestować to, chciałbym, abyś wyjaśnił, czy to naprawić. sugerują, że w końcu działały dobrze na chęci HTC. Dzięki! – Soflete

+0

Tak, to działało dobrze w HTC Desire, w moim przypadku. –

13
public void surfaceCreated(SurfaceHolder holder) { 
    mCamera = Camera.open(); 
    mCamera.setDisplayOrientation(90); 
    try { 
     mCamera.setPreviewDisplay(holder); 
     mCamera.setPreviewCallback(new PreviewCallback() { 

      @Override 
      public void onPreviewFrame(byte[] data, Camera camera) { 
      } 
     }); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

wypróbować ten kod

+0

miło dziękuję koleś –

+3

w momencie zapisywania go zapisuje portret w krajobrazie.Każde rozwiązanie? –

+0

@Akanksha, która prawdopodobnie ma związek z parametrami EXIF. – EpicPandaForce

2

Zrobiłem to biorąc rady mCamera.setDisplayOrientation (90); ale także obrócono bitmapę, ponieważ z jakiegoś powodu inne podejścia nie działają dla mnie w wersji 2.3.3.

Do obracania bitmapy zrobiłem tak:

Matrix matrix = new Matrix(); 
matrix.postRotate(90); 
imageView1 = new ImageView(this); 
Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath()); 
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true); 
imageView1.setImageBitmap(scaledBitmap); 
15

spróbuj ustawić orientację wyświetlacza. Rozwiązuje mój problem.

+5

w momencie zapisywania zapisuje zdjęcie portretowe w krajobrazie. Każde rozwiązanie? –

+0

@Akanksha: ta flaga ma zastosowanie tylko do wyświetlania podglądu. Nie zmienia orientacji bufora zwróconego w 'onPreviewFrame()' lub 'onPictureTaken()' –

1

Porównałem mój kod do tutoriala i ostatecznie naprawiłem wprowadzając poniższy kod do mojego AndroidManifext.xml: w tagu <activity>:

android:screenOrientation="landscape" 
android:configChanges="keyboardHidden|orientation"> 
1

Mam problem z przednią kamerę (Upside down numerze). Potem użyć tej metody

public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s) 
    { 
     CameraInfo cameraInfo = new CameraInfo(); 

     Camera.getCameraInfo(icameraId, cameraInfo); 

     int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); 

     int degrees = 0; // k 

     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 (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) 
     { 
      // cameraType=CAMERATYPE.FRONT; 

      result = (cameraInfo.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 

     } 
     else 
     { // back-facing 

      result = (cameraInfo.orientation - degrees + 360) % 360; 

     } 
     // displayRotate=result; 
     camera.setDisplayOrientation(result); 


    } 
+1

Ta metoda pochodzi z dokumentacji kamery: http://developer.android.com/reference/android/hardware/Camera.html #setDisplayOrientation (int) – VinceFior

0
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // If your preview can change or rotate, take care of those events here. 
    // Make sure to stop the preview before resizing or reformatting it. 

    if (mHolder.getSurface() == null) { 
     // preview surface does not exist 
     return; 
    } 

    try { 
     mCamera.stopPreview(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    Camera.Parameters parameters = mCamera.getParameters(); 
    Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 

    if (display.getRotation() == Surface.ROTATION_0) { 
     parameters.setPreviewSize(h, w); 
     mCamera.setDisplayOrientation(90); 
    } 

    if (display.getRotation() == Surface.ROTATION_90) { 
     parameters.setPreviewSize(w, h); 
     mCamera.setDisplayOrientation(0); 
    } 

    if (display.getRotation() == Surface.ROTATION_180) { 
     parameters.setPreviewSize(h, w); 
     mCamera.setDisplayOrientation(270); 
    } 

    if (display.getRotation() == Surface.ROTATION_270) { 
     parameters.setPreviewSize(w, h); 
     mCamera.setDisplayOrientation(180); 
    } 

    previewCamera(); 
} 

public void previewCamera() { 
    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 
    } catch (Exception e) { 
     //Log.d(APP_CLASS, "Cannot start preview", e); 
     e.printStackTrace(); 
    } 
} 
-2

Ten fragment wiersza pracował dla mnie idealnie

static { 
    ORIENTATIONS.append(Surface.ROTATION_0, 90); 
    ORIENTATIONS.append(Surface.ROTATION_90, 180); 
    ORIENTATIONS.append(Surface.ROTATION_180, 270); 
    ORIENTATIONS.append(Surface.ROTATION_270, 360); 
} 
+0

Co to oznacza i jak rozwiązuje problem? –

Powiązane problemy