谷歌GDK:通过语音触发器或菜单影响相机服务来调用应用程序的差异?

时间:2013-11-22 20:04:14

标签: android camera google-glass google-gdk

我正在尝试创建一个使用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();
}

2 个答案:

答案 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);