我正在使用 Android SDK 附带的 API 演示中的 CameraPreview。在相机预览运行时,如果我关闭屏幕并再次打开,相机预览会完全变黑。设备的相机应用程序以某种方式设法恢复相机预览,因此必须有一种方法。
并非我尝试过的所有设备都表现出这种行为。我无法确认,但似乎操作系统版本很重要。
我正在使用 Android SDK 附带的 API 演示中的 CameraPreview。在相机预览运行时,如果我关闭屏幕并再次打开,相机预览会完全变黑。设备的相机应用程序以某种方式设法恢复相机预览,因此必须有一种方法。
并非我尝试过的所有设备都表现出这种行为。我无法确认,但似乎操作系统版本很重要。
您需要在暂停/恢复中释放并重新获取相机。这是我的 CameraView 小部件中的一些代码:
public void onPause(){
if(camera != null){
camera.release();
camera = null;
}
}
public void onResume(){
//Need to release if we already have one, or we won't get the camera
if(camera != null){
camera.release();
camera = null;
}
try {
camera = Camera.open();
}
catch (Exception e){
}
}
对我有帮助的是 onResume() 中的 setContentView()。
它可以是
protected void onResume() {
super.onResume();
setContentView(R.layout.xxx);
// ...
}
或者
private View cachedContentView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
cachedContentView = doCreateContentView(getLayoutInflater());
// ...
}
protected void onResume() {
super.onResume();
setContentView(cachedContentView);
// ...
}
他们都工作。
我有同样的问题。也许,这不是最好的解决方案,但它对我有用。在 onPause() 方法中重新启动您的相机活动。
private boolean isBackPreesed = false;
@Override
public void onPause() {
if (camera != null) {
camera.release();
camera = null;
}
if (!isBackPreesed) {
finish();
Intent restart = new Intent(this, this.getClass());
startActivity(restart);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
isBackPreesed = true;
}
return super.onKeyDown(keyCode, event);
}
我的解决方案是在surfaceDestroyed 方法中释放相机,而不是在onPause 方法中,然后在surfaceCreated 方法中重新启动相机。结果很好。