这里是我的CameraView类:Android相机预览错误
public class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {
private Camera camera=null;
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
SurfaceHolder holder = this.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public boolean isVisible(){
return this.getVisibility()==View.VISIBLE;
}
public void show(){
this.setVisibility(View.VISIBLE);
}
public void hide(){
this.setVisibility(View.GONE);
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
camera.setPreviewCallback(this);
try {
camera.setPreviewDisplay(holder);
}catch (IOException e) {
Log.e("Preview Exception", e.getMessage());
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null){
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera=null;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if(camera==null || !(w>0&&h>0))
return;
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
}
在我的活动我有两个按钮 - 其中之一显示相机预览,并且第二隐藏它(使用CameraView.show()和CameraView.hide ()) 方法。
它工作得很好,除了一种情况: 如果我使用CameraView.hide()隐藏预览,请按HOME按钮(应用程序将分叉到背景)并将应用程序再次置于前面,我无法启动预览了。 当我调用CameraView.show()(通过按下按钮)时,CameraView出现,但预览不启动。
对我来说,它看起来像android bug,因为在其他情况下,一切工作正常 - 我运行android 2.1。
有人可以帮助我吗? 谢谢!
PS。下面是更新类,根据mmeyer的帖子(仍然没有工作):
public class CameraView extends SurfaceView implements SurfaceHolder.Callback, PreviewCallback {
private Camera camera=null;
private SurfaceHolder holder;
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void initialize(){
camera=Camera.open();
holder = this.getHolder();
holder.addCallback(this);
holder.setSizeFromLayout();
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void release(){
holder.removeCallback(this);
if(camera!=null){
camera.stopPreview();
camera.setPreviewCallback(null);
camera.release();
camera=null;
}
}
public boolean isVisible(){
return this.getVisibility()==View.VISIBLE;
}
public void show(){
this.setVisibility(View.VISIBLE);
}
public void hide(){
this.setVisibility(View.GONE);
}
public void surfaceCreated(SurfaceHolder holder) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
if(camera!=null)
camera.stopPreview();
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
if(camera==null || !(w>0&&h>0))
return;
try {
camera.setPreviewDisplay(holder);
}catch (IOException e) {
Log.e("Preview Exception", e.getMessage());
}
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(w, h);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
}
我修改了类如你所说,但问题仍然存在。 – user1011446
如果您事先没有事先做好CameraView.hide()而回到家中,您会遇到同样的问题吗?如果隐藏似乎是问题,那么我会考虑让它也发布。 – mmeyer
如果我在将应用程序分配到背景之前没有隐藏预览,那么一切正常。 – user1011446