27 votes

Android Appareil photo en mode Portrait sur SurfaceView

J'ai essayé plusieurs choses à essayer d'obtenir l'aperçu de la caméra à afficher en mode portrait sur un SurfaceView. Rien n'a fonctionné. Je suis en train de tester sur un Droid qui a 2.0.1. J'ai essayé:

1) forcer la mise à portrait par: this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

2) à l'aide de

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

Est-il autre chose que je peux essayer? Si c'est un bogue dans Android, ou le téléphone, comment puis-je m'assurer que c'est le cas, de sorte que j'ai la preuve d'informer le client?

Merci, Prasanna

50voto

Ed Jellard Points 611

Comme d'API lvl 8, il est disponible:

public final void setDisplayOrientation (int degrés)

c'est à dire avec le portrait dans le manifeste:

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

9voto

valientinx Points 61

j'ai une solution qui fonctionne en mode portrait de travail en 2.1 (testé sur le Désir) peut-être moins.

L'activité d'orientation de l'écran est réglé sur le portrait. (android:screenOrientation="portrait")

les paramètres de la caméra:

De la caméra.Paramètres p = mCamera.getParameters();

 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);

et l'image sera portrait.

SurfaceHolder vous utilisez pour la caméra doit être à une taille compatible avec le téléphone aperçu de la taille en général la résolution de l'écran.

Drôle à Souhait 2.2 n'est pas de travail... Voici le corrigé:

   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);

9voto

Mani Points 251

Vous pouvez essayer ceci (bon pour la 2.2 ou ci-dessous). Ici, j'ai fait pivoter l'image avant de l'enregistrer sur la carte sd. Mais c'est uniquement pour le mode portrait. Si vous aviez à faire pour la mode, alors vous devez vérifier l'orientation de l'appareil et de mettre la vérifier avant de capturer l'image.

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 {
    }
  }
};

2voto

Roman Nurik Points 18632

Il n'y a aucun moyen de le faire sur de nombreux appareils, y compris le G1 et le Droïde. Prendre un coup d'oeil au rapport de bug ici:

Voir également le commentaire de l'un des Android ingénieurs (Dave) ici:

0voto

Brenden Points 2320

Le lien Romaine a donné de la question thread a une solution que j'utilise maintenant.

Le trouver ici: http://code.google.com/p/android/issues/detail?id=1193#c26

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X