Domanda

Io sto usando una previsione per visualizzare quello che la macchina vede del sullo schermo.

posso ottenere tutto funzionava bene, superficie creata, insieme superficie e viene visualizzata la superficie.

Comunque visualizza sempre l'immagine con un angolo di 90 gradi non corretta in modalità verticale.

Come ad esempio nella foto:

alt text

Sono consapevole che utilizzando il seguente codice imposterà l'immagine dritta:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Tuttavia ho l'anteprima all'interno di un'attività che ha altri elementi in esso e non ha senso per la mia attività da visualizzare in modalità orizzontale. (La sua disabilitato per impostazione predefinita)

Quindi mi chiedevo Esiste un modo per cambiare solo l'orientamento del Preview? E lasciare il resto della mia attività correttamente visualizzato in modalità Portrait?

o comunque per ruotare l'anteprima in modo che sia visualizzato correttamente?

È stato utile?

Soluzione

Questo problema è apparso per iniziare come un bug con alcuni hardware Vedi qui ma può essere superato utilizzando la chiamata a mCamera.setDisplayOrientation (gradi) disponibili in API 8. Quindi questo è come a implementare che:

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

Questa è stata su un HTC Desire e ho dovuto mettere inizialmente in registrazione dichiarazioni in ciascuno dei controlli di rotazione di dire ciò che la rotazione è stato e quindi il debug sul dispositivo e osservava l'uscita logcat mentre ho ruotato il dispositivo. Per l'HTC Desire, 0, e il telefono come si sarebbe aspettato (ritratto), 90 gradi è stato ruotando il telefono di 90 gradi in senso antiorario (Avevo pensato che sarebbe stato in senso orario). Nel codice vedrete che non avevo bisogno di fare alcuna rotazione del display quando il telefono era a 90 o 180 gradi - il dispositivo sembrava per gestire questa stessa. Solo un punto non funziona correttamente: La rotazione di 270 gradi è quando si accende il dispositivo 90 gradi in senso orario e contatori rotazione visualizzazione che ok ma se si ruota il dispositivo 270 gradi in senso antiorario, esso non pare compensare correttamente <. / p>

P.S. Notare la swapover di larghezza e altezza nelle opportune rotazioni.

Altri suggerimenti

cercare di impostare l'orientamento dello schermo. Si risolve il mio problema.

 mCamera.setDisplayOrientation(90);
 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();
     }
}

provare questo codice

I stava avendo un problema con la fotocamera frontale (problema giù Upside). Poi ho usato il seguente metodo documentato nel Android Docs -

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


    }

L'ho fatto prendere consigli di mCamera.setDisplayOrientation (90); ma anche ruotato il bitmap perché per qualche motivo gli altri approcci non funziona per me nella versione 2.3.3.

Per ruotare l'immagine bitmap ho fatto questo:

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

Ho confrontato il mio codice a quello tutorial e quello, infine, fissa stava mettendo il seguente codice nel mio AndroidManifext.xml: Nel tag <activity>:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
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();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top