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

He creado un CaptureView clase que extiende SurfaceView y la colocó en el formulario principal.

Del formulario principal actividad ha onCreateOptionsMenu() método que crea un menú. El menú funcionaba bien, pero luego traté de 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ú no aparecerá más y el método no captura el evento onKeyDown.

¿Alguien sabe cuál podría ser la razón para este problema?

Si comentar la declaración si es que el menú todavía no se muestra?
Traté de comentar la declaración si pero como era de esperar nada ha cambiado.
Me acabo de enterar de que había alguna excepción, no relacionado con el código de arriba parar la ejecución.

OriginalEl autor Niko Gamulin | 2009-06-10

8 Comentarios

  1. 12

    Me encontré con que tenía que regresar a true para todos los eventos, donde debería haber sido sólo devolverlo con el código que yo estaba usando. He movido el retorno true dentro del ámbito de aplicación de la if declaración y volvió false de lo contrario, Que trajo a 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;
    }
    Lo siento que siempre devuelve false utiliza para trabajar en mayores SDK pero va a ocasionar problemas: cuando se compila con ICS, este enfoque se deshabilita la tecla atrás. por supuesto, en tu caso concreto es de trabajo como son precisamente consumming tecla atrás evento, pero en general no va a funcionar como se esperaba.
    -1. La mejor respuesta consiste en ‘return super.onKeyDown(keyCode, event);’, en lugar de que siempre devuelve false cuando no toque la tecla, como el publicado por rrabio.
    El onKeyDown() el método no es en absoluto llamada mientras presiona el botón de hardware buscar, en lugar de la búsqueda comportamiento por defecto se activa. Pero si presionas el botón atrás o el botón de menú activar este método. ¿Cómo puedo escuchar el android de hardware de búsqueda, haga clic con el botón.?

    OriginalEl autor

  2. 14

    He tenido un problema similar y resuelto por la adición de

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

    en el constructor de mi SurfaceView subclase.

    gracias, que trabajó para mí. Yo estaba usando un viewflipper para desplazarse entre los puntos de vista, y quería reemplazar el botón atrás para establecer un punto de vista de la vista actual. La adición de un webview para el VF dejado de disparar onKeyDown. Configuración de requestFocus y setFocusableInTouchMode en la VF ordenados. Gracias de nuevo

    OriginalEl autor Ciryon

  3. 6

    he resuelto retirar la declaración de si, como este:

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch(keyCode)
        {
            case KeyEvent.KEYCODE_CAMERA:
                videoPreview.TakePicture();
                return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    sí, buen punto. siempre devuelve false al final solía trabajar para mí, pero al compilar con la nueva ICS SDK, la tecla atrás no funciona más como el evento parece ser consumidos ahora en super.onKeyDown

    OriginalEl autor rrabio

  4. 4

    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 yo lo uso para una nueva aplicación, entonces no funciona.

    Pero yo 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;
    }

    OriginalEl autor enam

  5. 2

    Lo resuelto por la adición en el constructor de este código:

    setFocusable(true);
    requestFocus();

    gracias, Ciryon

    También cada vez que uso setContentView(myView); debo llamar myView.requestFocus();. Si hay una mejor solución, por favor dime.

    OriginalEl autor alaster

  6. 1

    Bien, mirando en la documentación de la API de la única cosa que se destaca es que el android:clickable atributo debe ser conjunto, así como la vista que se está habilitada para el onKeyDown(…) método de trabajo.

    OriginalEl autor Dean

  7. 1

    usted puede probar este

    this.setFocusable(true);

    OriginalEl autor zhujian

  8. 0

    Su Actividad podría estar comiendo el evento clave. Reemplazar onKeyDown en la actividad y tirar un punto de interrupción en allí.

    También: cuando usted dice que usted ha «colocado en el formulario principal» están utilizando el XML de diseño o de hacer en el código?

    OriginalEl autor haseman

Dejar respuesta

Please enter your comment!
Please enter your name here