jvh*_*she 9 camera android preview surfaceview
我已经看到了类似的问题,但我仍然无法找到解决方案.我对Android开发很新,所以我无法追踪我的问题.无论如何,我正在尝试使用我创建的CameraSurfaceView类来创建相机预览,该类扩展了SurfaceView并实现了SurfaceHolder.Callback.无论我在StartCamera类中尝试什么,都不会调用surfaceCreated()方法,因此我的相机永远不会启动.任何帮助都会很棒,谢谢!
StartCamera.java
import net.peterd.zombierun.R;
import android.hardware.Camera;
import android.os.Bundle;
import android.widget.FrameLayout;
public class StartCamera extends BaseActivity {
private Camera mCamera;
private CameraSurfaceView mView;
public void onCreate(Bundle state) {
// TODO Auto-generated constructor stub
super.onCreate(state);
setContentView(R.layout.start_camera);
}
public void onResume() {
super.onResume();
mView = new CameraSurfaceView(this);
FrameLayout preview = (FrameLayout) findViewById(R.id.cPreview);
preview.addView(mView);
}
public void onPause() {
mCamera.stopPreview();
mCamera.release();
}
}
Run Code Online (Sandbox Code Playgroud)
CameraSurfaceView.java
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback
{
private SurfaceHolder holder;
private Camera camera;
public CameraSurfaceView(Context context)
{
super(context);
//Initiate the Surface Holder properly
this.holder = this.getHolder();
this.holder.addCallback(this);
this.holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
try
{
//Open the Camera in preview mode
this.camera = Camera.open();
this.camera.setPreviewDisplay(this.holder);
}
catch(IOException ioe)
{
ioe.printStackTrace(System.out);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// Surface will be destroyed when replaced with a new screen
//Always make sure to release the Camera instance
camera.stopPreview();
camera.release();
camera = null;
}
public Camera getCamera() {
return camera;
}
}
Run Code Online (Sandbox Code Playgroud)
start_camera.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout android:id="@+id/cPreview"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
小智 6
显然这是因为FrameLayout是空的,因此不会创建任何类型的SurfaceView.您可以尝试手动强制父LinearLayout设置高度和宽度,或者只是在FrameLayout中添加imageView.由于FrameLayout可能包含许多小部件,但它只显示最后一个小部件,您可以在FrameLayout中放置一个ImageView,仅显示要创建的SurfaceView的小图像.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<FrameLayout android:id="@+id/cPreview"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- Adding small dummy image -->
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
src="@drawable/small_picture">
</FrameLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我曾经也有过一样的问题.对我来说,这是因为视图大小设置为0,因此从未创建表面.我通过设置一个特定的大小来检查这一点,并且突然调用了回调.(如果View在屏幕外布局,显然也是如此).
| 归档时间: |
|
| 查看次数: |
20497 次 |
| 最近记录: |