Problema onKeyDown ()

Me gustaría crear una aplicación de captura de foto / video.

He creado una clase CaptureView que extiende SurfaceView y la coloco en el formulario principal.

La actividad del formulario principal tiene onCreateOptionsMenu() método onCreateOptionsMenu() que crea un menú. El menú funcionó 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ú ya no aparece y el método no captura el evento onKeyDown.

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

Descubrí que estaba devolviendo verdadero para todos los eventos, donde sólo debería haber sido devolverlo por el código que estaba usando. Me trasladé la vuelta verdad dentro del alcance de la 'si' y devuelto falso … 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;** } 

Tuve un problema similar y lo resolví agregando

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

En el constructor de mi subclase SurfaceView.

I resuelto la eliminación de la declaración if, 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); } 

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

Pero 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 en constructor este código:

 setFocusable(true); requestFocus(); 

Gracias, Ciryon

También cada vez que uso setContentView(myView); Debo llamar a myView.requestFocus(); . Si hay una mejor solución por favor dígame.

Bueno, al mirar la documentación de la API lo único que destaca es que el atributo android: clickable se debe establecer así como la vista que está habilitada para que el método onKeyDown (…) funcione.

Puedes probar esto

 this.setFocusable(true); 

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

También: cuando dices que lo has "colocado en el formulario principal", ¿estás usando el diseño XML o haciendo en tu código?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.