我正在尝试正确显示相机预览SurfaceView
。但是,尽管尝试getSupportedPictureSizes()
并将pictureSize
和previewSize
同时设置为列表中的某个值,预览仍然非常非常紧张。
我决定我希望尺寸为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);
}
};
}
答案 0 :(得分:0)
没有截图,这是一个猜测,但我怀疑你调用setDisplayOrientation。
硬编码值可能适用于单个设备或一组设备,但一般情况下,您需要考虑几个因素 - 请参阅此处的文档:http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
一般来说,在大多数设备上(但不是全部!),如果手机上有横向应用,你最终会调用setDisplayOrientation(0),而不是90.
您的应用是面向风景还是以肖像为导向(或灵活?)?截图将有助于排除各种问题。