Pergunta

Eu gostaria de criar um aplicativo de captura de foto / vídeo.

Eu criei uma classe CaptureView que se estende SurfaceView e colocou-o no formulário principal.

A actividade do formulário principal tem método onCreateOptionsMenu() que cria um menu. O menu funcionou bem, mas então eu tentei implementar um onKeyDown método:

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

O menu não aparecer mais e o método não pega onKeyDown evento.

Alguém sabe o que poderia ser a razão para este problema?

Foi útil?

Solução

eu descobri que eu estava retornando true para todos os eventos, onde só deveria ter sido devolvê-lo para o código que eu estava usando. Mudei o return true dentro do âmbito do if declaração e voltou false caso contrário Isso trouxe meu menu de volta!

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

Outras dicas

Eu tive um problema semelhante e resolvido-lo adicionando

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

no construtor da minha SurfaceView subclasse.

i resolvido removendo a instrução 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);
}

Eu não sei por que às vezes não funciona, embora para um dos meus apps esta keyDown() está funcionando bem e novamente quando eu usá-lo para um novo aplicativo, em seguida, ele não funciona.

Mas eu tenho uma solução que sempre 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;
}

Eu resolvi isso adicionando para o construtor este código:

setFocusable(true);
requestFocus();

graças, Ciryon

Também cada tempo de uso I setContentView(myView); devo chamar myView.requestFocus();. Se não houver uma solução melhor por favor me diga.

Bem, olhando para a documentação da API a única coisa que se destaca é que o android:. Atributo clickable deve ser definido, bem como o ser vista habilitado para o método onKeyDown (...) para o trabalho

Você pode tentar este

this.setFocusable(true);

Sua atividade poderia estar comendo o evento chave. Substituir onKeyDown na atividade e jogar um ponto de interrupção lá.

Além disso: quando você diz que "colocou-o no formulário principal" você está usando o layout XML ou fazer em seu código

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top