Google GDK: различия в вызове приложения с помощью голосового триггера или меню, влияющие на работу камеры?

Я пытаюсь создать приложение Glass GDK, которое использует службу камеры для предварительного просмотра. К сожалению, в настоящее время у меня есть ошибка, из-за которой возникает исключение RuntimeException при попытке открыть камеру с помощью Camera.open(). Я сталкиваюсь с этой ошибкой только при открытии активности с помощью голосового триггера, а не при выборе приложения в меню «лаунчер».

Есть ли разница в том, как действие запускается через это меню по сравнению с голосовым триггером?

Часть соответствующего кода приведена ниже.

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

person Cole Gleason    schedule 22.11.2013    source источник


Ответы (2)


Поскольку это не работает при использовании голосового триггера, это звучит как возможное состояние гонки, когда микрофон не отключается к тому времени, когда ваша активность отображается на экране.

Можете ли вы попробовать подход, который использует экспоненциальную отсрочку для захвата камеры? По сути, попробуйте захватить камеру, и если вы получите исключение, повторите попытку через короткий промежуток времени, немного увеличив время ожидания для фиксированного количества попыток.

Также рассмотрите возможность регистрации ошибки в системе отслеживания ошибок, особенно если вы можете достоверно узнать, какая задержка требуется, прежде чем камера/микрофон могут быть приобретены.

person Tony Allevato    schedule 22.11.2013
comment
Спасибо за предложение! Я обнаружил, что для успешного открытия камеры обычно требуется около 400 мс. Я отправил проблему здесь: code.google.com /p/google-glass-api/issues/detail?id=259 - person Cole Gleason; 23.11.2013

Проблема вызвана задержкой между событием закрытия распознавателя голоса и событием открытия камеры, что вызывает перегрузку памяти. Чтобы избежать проблемы при запуске приложения, которое будет запускаться с помощью голоса, приостановите приложение на определенное время (достаточно 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);  
person Amalan Dhananjayan    schedule 17.12.2013