Как я могу реализовать камеру Android, чтобы делать фотографии в любой ориентации экрана? - PullRequest
1 голос
/ 22 марта 2011

Хотелось бы, чтобы ориентация камеры не менялась при повороте телефона, чтобы камера могла делать вертикальное изображение в любой ориентации. В настоящее время изображение поворачивается неправильно во всех ориентациях, кроме одной. Протестировано на HTC Incredible под управлением 2.2:

  • В портретном режиме изображение поворачивается на 90 градусов по часовой стрелке относительно того, что должно быть.
  • Устройство, повернутое против часовой стрелки от портрета, дает изображение, повернутое на 180 градусов.
  • Устройство, повернутое по часовой стрелке от портрета, дает изображение с правильной ориентацией.

Вот соответствующий код для реализации камеры:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera);

    // Set up camera's SurfaceView and SurfaceHolder
    surfaceView = (SurfaceView) findViewById(R.id.camera_surface);
    surfaceHolder = surfaceView.getHolder();
    surfaceHolder.addCallback(this);
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    Camera.Parameters p = camera.getParameters();
    p.setPreviewSize(width,height);
}

public void surfaceCreated(SurfaceHolder holder) {
    camera = Camera.open();
    try {
        camera.setPreviewDisplay(surfaceHolder);
    } catch (IOException e) {
        camera.release();
    }
    camera.startPreview();
}

Поскольку я хотел бы, чтобы приложение было совместимо с любым уровнем API, равным или превышающим 4, для обеспечения максимальной пользовательской базы, я бы предпочел, чтобы в ответах не использовалось ничего конкретного для более высоких уровней API. Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Если вы не хотите, чтобы предварительный просмотр также вращался, установите ориентацию в альбомный или альбомный режим в файле манифеста.

Чтобы получить правильно повернутые изображения, необходимо вызвать setRotation () (уровень API).5) в параметре камеры, а затем установите этот параметр непосредственно перед вызовом API takePicture.Вам также нужно будет использовать directionEventListener

Пример кода здесь

0 голосов
/ 26 марта 2014

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

// Set camera rotation (consider display orientation)
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int displayOrientation = display.getRotation();

int rotation = cameraInfo.orientation;
if (Surface.ROTATION_0 != displayOrientation)
{
    if (CameraInfo.CAMERA_FACING_BACK == cameraInfo.facing)
    {
        if (Surface.ROTATION_90 == displayOrientation)
        {
            rotation -= 90;
        }
        else if (Surface.ROTATION_180 == displayOrientation)
        {
            rotation -= 180;
        }
        if (Surface.ROTATION_270 == displayOrientation)
        {
            rotation -= 270;
        }

        if (rotation < 0)
        {
            rotation += 360;
        }
    }
    else
    {
        if (Surface.ROTATION_90 == displayOrientation)
        {
            rotation += 90;
        }
        else if (Surface.ROTATION_180 == displayOrientation)
        {
            rotation += 180;
        }
        if (Surface.ROTATION_270 == displayOrientation)
        {
            rotation += 270;
        }

        rotation %= 360;
    }
}

Log.d(TAG, "Camera orientation (" + cameraInfo.orientation + ", " + displayOrientation + ", " + rotation + ")");

cameraParams.setRotation(rotation);
0 голосов
/ 22 марта 2011

Попробуйте, но я думаю, что это ошибка.У меня тоже есть эта проблема, но в моей ситуации я ничего не могу найти.

Этот код может быть правильным и, возможно, должен помочь вам при использовании предварительного просмотра камеры.

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

public void surfaceCreated(SurfaceHolder holder)  
{
    try
    {
        camera.setPreviewDisplay(holder);
        camera.setPreviewCallback(this);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    Size previewSize = camera.getParameters().getPreviewSize();
    float aspect = (float) previewSize.width / previewSize.height;

    int previewSurfaceWidth = preview.getWidth();
    int previewSurfaceHeight = preview.getHeight();

    LayoutParams lp = preview.getLayoutParams();


    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
    {
        // ïîðòðåòíûé âèä
        camera.setDisplayOrientation(90);
        lp.height = previewSurfaceHeight;
        lp.width = (int) (previewSurfaceHeight / aspect);
    }
    else
    {
        camera.setDisplayOrientation(0);
        lp.width = previewSurfaceWidth;
        lp.height = (int) (previewSurfaceWidth / aspect);
    }

    preview.setLayoutParams(lp);
    camera.startPreview();


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...