尽管设置尺寸为

时间:2015-04-26 13:43:18

标签: android android-camera

我正在尝试正确显示相机预览SurfaceView。但是,尽管尝试getSupportedPictureSizes()并将pictureSizepreviewSize同时设置为列表中的某个值,预览仍然非常非常紧张。

我决定我希望尺寸为1280 x 720像素,并且我已将此值设置到任何地方(并且再次,它位于getSupportedPictureSizes()上,以及getSupportedPreviewSizes()

我已经浏览了所有关于这个问题的Stackoverflow帖子,我似乎无法解决它。任何帮助表示赞赏。

我的SurfaceHolder的

surfaceCreated():

public void surfaceCreated(SurfaceHolder holder)
{
    Camera.Parameters parameters = camera.getParameters();

    parameters.setPictureSize(1280, 720);
    parameters.setPreviewSize(1280, 720);

    Log.d("SurfaceView", surfaceView.getWidth() + ", " + surfaceView.getHeight());

    camera.setParameters(parameters);
    camera.setDisplayOrientation(90);

    previewCamera();
}

SurfaceView设计XML:

<SurfaceView
    android:layout_width="1280px"
    android:layout_height="720px"
    android:layout_gravity="center_horizontal"
    android:id="@+id/surfaceViewCamera"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"/>

整个活动类:

package org.ownzone.security_droid;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;

public class AuthenticatedActivity extends ActionBarActivity
{
    private ServerConnection sc = ServerConnection.getServerConnectionInstance();
    private boolean active;

    private Camera camera;
    private SurfaceView surfaceView;
    private SurfaceHolder surfaceHolder;
    private boolean isPreviewRunning;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_authenticated);

        active = false;
        isPreviewRunning = false;

        TextView headline = (TextView) findViewById(R.id.textViewHeadLine);
        headline.setText(getIntent().getStringExtra("cardholder") + " authenticated");

        Switch activeSwitch = (Switch) findViewById(R.id.switchActive);
        activeSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {
                active = isChecked;
            }
        });

        surfaceView = (SurfaceView) findViewById(R.id.surfaceViewCamera);

        camera = Camera.open();

        for (Camera.Size size : camera.getParameters().getSupportedPictureSizes())
        {
            Log.d("Size", size.width + ", " + size.height);
        }

        surfaceHolder = surfaceView.getHolder();
        surfaceHolder.addCallback(surfaceHolderCallback);
        //camera.setPreviewDisplay(surfaceView.getHolder());
        //camera.startPreview();

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    private void takePhoto()
    {
        camera.takePicture(shutterCallback, rawPictureCallback, jpegPictureCallback);
    }

    SurfaceHolder.Callback surfaceHolderCallback = new SurfaceHolder.Callback()
    {
        @Override
        public void surfaceCreated(SurfaceHolder holder)
        {
            Camera.Parameters parameters = camera.getParameters();

            parameters.setPictureSize(1280, 720);
            parameters.setPreviewSize(1280, 720);

            Log.d("SurfaceView", surfaceView.getWidth() + ", " + surfaceView.getHeight());

            camera.setParameters(parameters);
            camera.setDisplayOrientation(90);

            previewCamera();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
        {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder)
        {

        }
    };

    public void previewCamera()
    {
        try
        {
            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();
            isPreviewRunning = true;
        }
        catch (Exception e)
        {
            Log.d("AuthenticatedActivity", "Cannot start preview", e);
        }
    }


    Camera.ShutterCallback shutterCallback = new Camera.ShutterCallback()
    {
        public void onShutter()
        {

        }
    };

    Camera.PictureCallback rawPictureCallback = new Camera.PictureCallback()
    {
        public void onPictureTaken(byte[] data, Camera camera)
        {

        }
    };

    Camera.PictureCallback jpegPictureCallback = new Camera.PictureCallback()
    {
        public void onPictureTaken(byte[] data, Camera camera)
        {
            Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, data.length);
            Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, 0, 0, bitmapPicture.getWidth(), bitmapPicture.getHeight(), null, true);

        }
    };
}

1 个答案:

答案 0 :(得分:0)

没有截图,这是一个猜测,但我怀疑你调用setDisplayOrientation。

硬编码值可能适用于单个设备或一组设备,但一般情况下,您需要考虑几个因素 - 请参阅此处的文档:http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)

一般来说,在大多数设备上(但不是全部!),如果手机上有横向应用,你最终会调用setDisplayOrientation(0),而不是90.

您的应用是面向风景还是以肖像为导向(或灵活?)?截图将有助于排除各种问题。

相关问题