2010-03-30 12 views
36

Próbowałem wykonać kilka czynności, aby uzyskać podgląd aparatu, aby pokazać go w rozmiarze na SurfaceView. Nic nie działało. Testuję na Droidu, który ma 2.0.1. Próbowałem:Aparat z Androidem w trybie Portret na SurfaceView

1) zmuszając układ będzie portret przez: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2) za pomocą

Camera.Parameters parameters = camera.getParameters(); 
parameters.set("orientation", "portrait"); 
parameters.setRotation(90); 
camera.setParameters(parameters); 

Czy coś jeszcze mogę spróbować? Jeśli to błąd w Androidzie lub telefonie, w jaki sposób mogę się upewnić, że tak jest, więc mam dowód na poinformowanie klienta?

Dzięki Prasanna

+0

Sprawdźcie - http://stackoverflow.com/questions/10259299/force-a-camera-to-always-open-in-portrait-mode-in-android/10259572#10259572 –

+0

może każdy jedna pomoc http://stackoverflow.com/questions/28379130/how-to-set-camera-image-orientation –

Odpowiedz

10

Mam rozwiązanie do pracy w trybie pionowym pracującym w wersji 2.1 (testowane na Desire) może mniej.

Orientacja ekranu aktywności jest ustawiona na portret. (Mobile: screenOrientation = "pionowa")

parametrów kamery:

Camera.Parameters mCamera.getParameters (P =);

p.set("jpeg-quality", 100); 
p.set("orientation", "landscape"); 
p.set("rotation", 90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w);// here w h are reversed 
mCamera.setParameters(p); 

a zdjęcie będzie portretem.

Nośnik powierzchni używany w aparacie musi mieć rozmiar zgodny z rozmiarem podglądu telefonu o rozmiarze zwykle z rozdzielczością ekranu.

Funny pożądania na 2.2 nie działa ... Oto dylemat:

At surfaceCreated(..) or when you have this line 
camera = Camera.open(); 
     add 
camera.setDisplayOrientation(90);//only 2.2> 

Camera.Parameters p = camera.getParameters(); 
    p.set("jpeg-quality", 100); 
p.setRotation(90); 
p.setPictureFormat(PixelFormat.JPEG); 
p.setPreviewSize(h, w); 
camera.setParameters(p); 
0

Nie ma potrzeby trzeba ustawić wszelkie parametry orientacji aż trzeba zrobić jawnie. Domyślnie obsługuje to urządzenie. W moim przypadku mam działanie i powyżej tego działania mam widok z kamery, więc nie ustawiłem żadnej orientacji dla właściwości kamery, zamiast tego dla aktywności ustawiam orientację jako portret w pliku manifestu. teraz aplikacja wygląda i działa dobrze. Może być pomocny dla kogoś ..

Dzięki.

61

Jak API lvl 8, jest dostępny:

public final void setDisplayOrientation (int stopni)

tj portait w manifeście:

public void surfaceCreated(SurfaceHolder holder) { 
    mCamera = Camera.open(); 
    mCamera.setDisplayOrientation(90); 
+12

Zrobiłem to, ale bajt [] Dostaję wciąż daje mi zdjęcie krajobrazu. – tasomaniac

+3

Zestaw mCamera.setDisplayOrientation (90); widok kamery Ok, ale wynik wideo nie jest taki sam Widok kamery, nie obrót 90. Dlaczego? – mum

+0

Hej, możesz użyć do tego metody param.setRotation (..). Nadal próbuję zrozumieć, jak to działa. To jest zajebiste! – sunlover3

10

można spróbować to (dobra dla 2.2 lub poniżej). Tutaj obracam obraz przed zapisaniem go na karcie SD. Ale dotyczy to tylko trybu portretowego. Jeśli musisz zrobić to dla obu trybów, powinieneś sprawdzić orientację kamery i sprawdzić przed zrobieniem zdjęcia.

PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
     imageFilePath = getFilename(); 
     InputStream is = new ByteArrayInputStream(data); 
     Bitmap bmp = BitmapFactory.decodeStream(is); 
     // Getting width & height of the given image. 
     if (bmp != null){ 
      int w = bmp.getWidth(); 
      int h = bmp.getHeight(); 
      // Setting post rotate to 90 
      Matrix mtx = new Matrix(); 
      mtx.postRotate(90); 
      // Rotating Bitmap 
      Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, w, h, mtx, true); 
      ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
      rotatedBMP.compress(Bitmap.CompressFormat.PNG, 100, stream); 
      byte[] byteArray = stream.toByteArray(); 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(byteArray); 
      outStream.close(); 
     } else { 
      outStream = new FileOutputStream 
           (String.format(imageFilePath,System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close();   
     }  

     preview.camera.startPreview(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
    } 
    } 
}; 
+1

Ten kod służy do obracania obrazu, a nie podglądu. –

Powiązane problemy