Вопрос

Я использую предварительный просмотр, чтобы отобразить то, что видит камера на экране.

Я могу получить все, что работает нормально, создано поверхность, набор поверхности и отображается поверхность.

Однако он всегда отображает изображение в неверном угле 90 градусов в портретном режиме.

Например, на картинке:

alt text

Я знаю, что использование следующего кода установит изображение прямо:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

Однако у меня есть предварительный просмотр в рамках деятельности, в которой в нем есть другие элементы, и для моей деятельности не имеет смысла отображаться в ландшафтном режиме. (Его отключено по умолчанию)

Поэтому мне было интересно, есть ли в любом случае, чтобы просто изменить ориентацию предварительного просмотра? И оставьте остальную часть своей активности правильно отображаются в портретном режиме?

Или в любом случае, чтобы повернуть предварительный просмотр, чтобы он был отображен правильно?

Это было полезно?

Решение

Эта проблема появилась, чтобы начать как ошибку с определенным оборудованием посмотреть здесь Но можно преодолеть, используя вызов на mcamera.setdisplayorientation (градусы), доступных в API 8. Так вот как я его реализую:

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

Это было на HTC Hesire, и мне пришлось первоначально поместить в лесозаготовки в каждом из проверок вращения, чтобы сказать, что было вращение, а затем отлажена на устройстве и наблюдала за выходом Logcat, пока я повернул устройство. Для HTC Desire, 0 был телефон, как вы ожидали (портрета), 90 градусов поворачивали телефон на 90 градусов против часовой стрелки (я предположил бы, что было бы по часовой стрелке). В коде вы увидите, что мне не нужно было делать какое-либо отображение вращения, когда телефон был на 90 или 180 градусах - устройство, казалось, справимо это. Только одна точка не работает должным образом: вращение 270 градусов - это при включении устройства на 90 градусов по часовой стрелке и причем отображаются счетчики вращения, которые ok, но если вы вращаете устройство 270 градусов против часовой стрелки, он не компенсирует его правильно.

PS обратите внимание на свопульную широту и высоту в соответствующих вращениях.

Другие советы

Попробуйте установить ориентацию дисплея. Это решает мою проблему.

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

попробуйте этот код

У меня возникла проблема с передней камерой (с ног на голову выпуска). Затем я использовал следующий метод, документированный в 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);


    }

Я сделал это, принял совет Mcamera.SetDisplayorientation (90); Но также повернул растровое изображение, потому что по какой-то причине остальные подходы не работают для меня в версии 2.3.3.

Для вращения растрового изображения я сделал это:

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

Я сравнил свой код в учебное пособие по одному, и что, наконец, исправило, он ставил следующий код в мой AndroidManifext.xml: в <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();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top