我正在尝试创建一个使用Camera服务来显示预览的Glass GDK应用。不幸的是,我目前有一个错误,当尝试使用Camera.open()打开一个摄像头时会抛出RuntimeException。我只是在通过语音触发器打开活动时遇到此错误,而不是从“启动器”菜单中选择应用程序。
通过此菜单启动活动与语音触发器的比较是否存在差异?
下面是一些相关的代码。
@Override
public void onCreate(Bundle savedInstanceState) {
mGestureDetector = createGestureDetector(this);
super.onCreate(savedInstanceState);
ctx = this;
act = this;
setContentView(R.layout.activity_main);
preview = new Preview(this, (SurfaceView)findViewById(R.id.surfaceView));
((FrameLayout) findViewById(R.id.preview)).addView(preview);
preview.setKeepScreenOn(true);
}
@Override
protected void onResume() {
super.onResume();
try {
if (camera == null) {
Log.d(TAG, "Opening a camera on resume.");
camera = Camera.open();
preview.setCamera(camera);
camera.startPreview();
}
} catch(java.lang.RuntimeException e) {
Log.e(TAG, e.getMessage());
}
}
@Override
protected void onPause() {
if(camera != null) {
camera.stopPreview();
preview.setCamera(null);
Log.d(TAG, "Releasing a camera on pause.");
camera.release();
camera = null;
}
super.onPause();
}
@Override
protected void onDestroy() {
if(camera != null) {
camera.stopPreview();
preview.setCamera(null);
Log.d(TAG, "Releasing a camera on destory.");
camera.release();
camera = null;
}
super.onDestroy();
}
答案 0 :(得分:3)
由于在使用语音触发时它不起作用,因此听起来像是一种可能的竞争条件,当您的活动在屏幕上显示时,麦克风不会被释放。
你能尝试一种使用指数退避来捕捉相机的方法吗?基本上尝试捕捉相机,如果你遇到异常,请在很短的时间后再试一次,稍微增加等待时间一段时间。
请考虑在issue tracker上提交错误,特别是如果您能够可靠地了解在获取相机/麦克风之前需要多少延迟。
答案 1 :(得分:1)
问题是由语音识别器关闭事件和相机打开事件之间的延迟引起的,这会导致内存过载。 为了避免在启动将通过语音触发的应用程序时出现问题, 很快就打开相机暂停应用程序一段时间(1000毫秒就可以)。
在下面的代码中,我推迟了我的QR扫描仪打开1000毫秒。这对我来说很好。如果你想要一个,你可以增加时间间隔。
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, 0);
}
};
// sleeper time
handler.sendEmptyMessageDelayed(0, 1000);