Pregunta

Me gustaría crear una aplicación de captura de fotos/vídeo.

he creado un CaptureView clase que se extiende SurfaceView y lo colocó en el formulario principal.

La actividad de la forma principal tiene onCreateOptionsMenu() Método que crea un menú.El menú funcionó bien pero luego intenté implementar un método. onKeyDown:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if(event.getAction() == KeyEvent.ACTION_DOWN) {
        switch(keyCode) {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
        }
    }

    return super.onKeyDown(keyCode, event);
}

El menú ya no aparece y el método no detecta el evento onKeyDown.

¿Alguien sabe cuál podría ser el motivo de este problema?

¿Fue útil?

Solución

Me di cuenta de que me estaba volviendo true para todos los eventos, donde sólo debería haber estado devolverlo para obtener el código que yo estaba usando. Moví el retorno verdadera dentro del alcance de la if declaración y regresé false de lo contrario Eso trajo mi menú de vuelta!

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        dba.close();
        Intent result = new Intent("Complete");
        setResult(Activity.RESULT_OK, result);
        finish();
        return true;
    }
    return false;
}

Otros consejos

He tenido un problema similar y lo resolvió mediante la adición

this.requestFocus();
this.setFocusableInTouchMode(true);

En el constructor de mi subclase SurfaceView.

He resuelto retirar la sentencia if, como esto:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch(keyCode)
    {
        case KeyEvent.KEYCODE_CAMERA:
            videoPreview.TakePicture();
            return true;
    }
    return super.onKeyDown(keyCode, event);
}

No sé por qué a veces no funciona, aunque para una de mis aplicaciones de este keyDown() está trabajando muy bien y de nuevo cuando lo uso para una nueva aplicación, entonces no funciona.

Sin embargo, tengo una solución que siempre funciona:

@Override
public boolean dispatchKeyEvent (KeyEvent event) {
    if (event.getAction()==KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_BACK) {
        Toast.makeText(this, "Back button pressed", Toast.LENGTH_LONG).show();
        return true;
    }
    return false;
}

He resuelto esto añadiendo al constructor de este código:

setFocusable(true);
requestFocus();

gracias, Ciryon

Además, cada vez que lo uso setContentView(myView); Debo llamar myView.requestFocus();. Si hay una mejor solución por favor dígame.

Bueno, en el estudio de la documentación de la API lo único que destaca es que el androide: se puede hacer clic atributo se debe establecer, así como la vista que se está habilitado el método onKeyDown (...) para trabajar

.

puedes probar esto

this.setFocusable(true);

Su actividad podría estar comiendo el evento clave. OnKeyDown anular en la actividad y lanzar un punto de interrupción en ese país.

También: cuando usted dice que han "colocado en el formulario principal" está usando el diseño XML o hacer en el código

?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top