【发布时间】:2014-07-18 15:30:35
【问题描述】:
让我的SurfaceView 显示我的相机预览有点麻烦。我在这里查看了一些问题,并在 Google 上搜索了一些 tuts,但我认为这可能是我没有看到的一个小错误。
代码
public class RoofPitchActivity extends Activity implements SensorEventListener {
...
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceHolder;
private Camera mCamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roof_pitch);
initViews();
}
private void initViews() {
...
Preview preview = new Preview(this);
mCamera = Camera.open();
preview.setCamera(mCamera);
}
...
...
class Preview extends ViewGroup implements SurfaceHolder.Callback {
public Preview(Context context) {
super(context);
mSurfaceView = (SurfaceView) findViewById(R.id.preview);
mSurfaceView = new SurfaceView(context);
addView(mSurfaceView);
mSurfaceHolder = mSurfaceView.getHolder();
mSurfaceHolder.addCallback(this);
}
public void setCamera(Camera camera) {
if (mCamera == camera) {
return;
}
stopPreviewAndFreeCamera();
mCamera = camera;
if (mCamera != null) {
requestLayout();
try {
mCamera.setPreviewDisplay(mSurfaceHolder);
} catch (IOException e) {
e.printStackTrace();
}
mCamera.startPreview();
}
}
private void stopPreviewAndFreeCamera() {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera.startPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(mSurfaceView.getWidth(), mSurfaceView.getHeight());
requestLayout();
mCamera.setParameters(parameters);
mCamera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
}
}
}
所以当活动启动时,SurfaceView 是黑色的。相机似乎没有将预览渲染到SurfaceView。我确定我缺少一些小东西,或者这可能只是对它的工作原理的根本误解。非常感谢有一点解释的新眼睛。谢谢
【问题讨论】:
-
你确定 SurfaceView 通过布局可见吗?它出现在其他一切的背后。 (尝试注释掉摄像头代码,然后使用 Canvas 将 Surface 填充为红色。)您当前对摄像头的处理会遇到一些问题——您真的希望它与 Activity 生命周期相关联,而不是与 Surface 生命周期相关联。 Grafika (github.com/google/grafika) 有几个例子;参见例如连续捕获。可以在source.android.com/devices/graphics/architecture.html#activity 找到讨论。
标签: android camera surfaceview