Question

I tried to bind some actions to a camera button:

videoPreview.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            switch(keyCode) {
                case KeyEvent.KEYCODE_CAMERA:
                    //videoPreview.onCapture(settings);
                    onCaptureButton();
...
            }
        }
        return false;
    }
});

Pressing the button however the application crashes because the original Camera application starts.

Does anyone know how to prevent Camera application start when the camera button is pressed?

Was it helpful?

Solution

In your example you need to return true to let it know you "consumed" the event. Like this:

videoPreview.setOnKeyListener(new OnKeyListener(){
    public boolean onKey(View v, int keyCode, KeyEvent event){
        if(event.getAction() == KeyEvent.ACTION_DOWN) {
            switch(keyCode) {
                case KeyEvent.KEYCODE_CAMERA:
                    //videoPreview.onCapture(settings);
                    onCaptureButton();
                    /* ... */
                    return true;
            }
        }
        return false;
    }
});

It will also only work if the videoPreview (or a child element) has focus. So you could either set it to have focus by default:

@Override
public void onResume() {
    /* ... */
    videoPreview.requestFocus();
    super.onResume();
}

or (prefered) put the listener on the top-level element (eg. a LinearLayout, RelativeLayout, etc).

OTHER TIPS

As soon as camera button is pressed a broadcast message is sent to all the applications listening to it. You need to make use of Broadcast receivers and abortBroadcast() function. You can find more details regarding this in the below link

http://suhassiddarth.blogspot.com/

a simple way to disable the camera button (or react on a click) is to add the following to your activity:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_CAMERA) {
        return true; // do nothing on camera button
    }
    return super.onKeyDown(keyCode, event);
}

You forgot to return true in your case KeyEvent.KEYCODE_CAMERA branch. If you return true, that signals to Android that you have consumed the key event, and the Camera application should not be launched. By returning false all the time, all the key events are passed upwards to the default handlers.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top