3

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

2 に答える 2

3

音声トリガーを使用している場合は機能しないため、アクティビティが画面に表示されるまでにマイクが解放されない競合状態の可能性があるように聞こえます.

指数バックオフを使用してカメラをキャプチャするアプローチを試すことができますか? 基本的にカメラのキャプチャを試み、例外が発生した場合は、一定の試行回数の待機時間を少し増やして、しばらくしてから再試行します。

特に、カメラ/マイクを取得する前に必要な遅延を確実に把握できる場合は、Issue Trackerにバグを報告することも検討してください。

于 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 に答える