Вот мой класс CameraView:
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, потому что в других случаях все работает нормально - яработает андроид 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) {
}
}