3

我正在尝试创建一个使用相机服务来显示预览的 Glass GDK 应用程序。不幸的是,我目前有一个错误,在尝试使用 Camera.open() 打开相机时会引发 RuntimeException。我只在通过语音触发器打开活动时遇到此错误,而不是从“启动器”菜单中选择应用程序。

通过此菜单启动 Activity 的方式与通过语音触发器启动的方式有区别吗?

部分相关代码如下。

@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();
}
4

2 回答 2

3

由于在使用语音触发器时它不起作用,这听起来像是一种可能的竞争条件,即当您的活动显示在屏幕上时麦克风尚未释放。

您可以尝试使用指数退避来捕获相机的方法吗?基本上尝试捕获相机,如果出现异常,请在短时间内重试,稍微增加等待时间以获得固定次数的尝试。

还请考虑在问题跟踪器上提交错误,特别是如果您可以可靠地找出在获取相机/麦克风之前需要多少延迟。

于 2013-11-22T21:10:01.677 回答
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);  
于 2013-12-17T08:48:38.143 回答