更新:现在找到解决按home键再启动程序camera黑屏的方法了:需要将SurfaceView加载到FrameLayout中的代码写在onResume中
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (camera == null){
camera = getCameraInstance();
}
//必须放在onResume中,不然会出现Home键之后,再回到该APP,黑屏
mySurfaceView = new MySurfaceView(getApplicationContext(), camera);
FrameLayout preview = (FrameLayout) findViewById(.camera_preview);
preview.addView(mySurfaceView);
}
MainActivity有一个按钮,点按钮进入到CameraActivity,CameraActivity里有一个Camera的预览,调用的系统相机。CameraActivity类implements了SurfaceHolder.Callback, Camera.PreviewCallback。现在的问题是在CameraActivity界面Camera正常预览时,点击手机home键后再点应用图标进入应用,Camera就黑屏了。点手机返回键返回MainActivity再进入CameraActivity时Camera预览就正常了。
开启camera预览的方法:
private void preview() throws IOException {
if (hasFrontFacingCamera()) {//如果有前置摄像头
camera = Camera.open(1);
camera.setDisplayOrientation(90);
} else {
camera = Camera.open(0);
camera.setDisplayOrientation(270);
}
Camera.Parameters params = camera.getParameters();
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
Camera.Size selected = sizes.get(1);
width = selected.width;
height = selected.height;
params.setPreviewSize(640, 480);
// params.setPictureFormat(PixelFormat.RGB_565);
// params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
// params.setPreviewSize(width, height);
camera.setParameters(params);
camera.setPreviewDisplay(holder);
camera.startPreview();
}
这个问题貌似是因为按home键后Activity中的camera被release掉了,然后再点应用图标进入应用,camera没有启动。启动camera的方法preview()是写在了onCreate方法里。
刚开始想的是处理Activity的生命周期的方法,onPause时释放Camera,onRestart或onResume时调用preview()重新启动Camera。但是报错“app passed NULL surface”。查找了资料,看到这个博客Android调用相机预览黑屏app passed NULL surface解决,试了里面的方法,不起作用,报错。没能解决。放弃。
后来又试了在CameraActivity中屏蔽home键,这样就不能退回桌面了。自己写了onKeyDown方法屏蔽home键,发现不起作用。然后就上网搜屏蔽home键的方法,发现网上说的方法都无效,包括所谓的4.0以后能用的方法,包括GitHub上别人提供的第三方工具。据说谷歌为了安全,把屏蔽home键的方法写在了framework层而不再是application层,除非修改framework层的代码,否则屏蔽不了home键。搜了很多资料,发现这个有一点道理:Android 开发锁屏屏蔽Home键、原生锁屏界面,但是没源码,这个功能对我来说又不是必须的,就没好好搞。
再后来,想了个偷懒的办法。因为在我们这个APP中,CameraActivity界面中按home键基本是不会有的操作,属于非正常操作,所以我就想如果按了home键,那就把当前页销毁,返回上一页面,重新进入CameraActivity。于是在当前页失去焦点时finnish掉当前页。
@Override
protected void onPause() {
super.onPause();
finish();
}
经测试,可以使用。