5

我试图将一些动作绑定到相机按钮:

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

然而,按下按钮应用程序崩溃,因为原始相机应用程序启动。

有谁知道如何防止按下相机按钮时启动相机应用程序?

4

4 回答 4

6

在您的示例中,您需要返回true以让它知道您“消费”了该事件。像这样:

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

它也仅在videoPreview(或子元素)具有焦点时才有效。因此,您可以将其设置为默认具有焦点:

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

或(首选)将监听器放在顶级元素上(例如 a LinearLayoutRelativeLayout等)。

于 2009-06-13T01:34:43.587 回答
4

一旦按下相机按钮,就会向所有监听它的应用程序发送广播消息。您需要使用广播接收器和 abortBroadcast() 函数。您可以在以下链接中找到有关此的更多详细信息

http://suhassiddarth.blogspot.com/

于 2010-12-07T17:43:08.930 回答
3

禁用相机按钮(或对点击做出反应)的一种简单方法是将以下内容添加到您的活动中:

@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);
}
于 2010-03-29T16:30:02.863 回答
2

您忘记返回true您的案例KeyEvent.KEYCODE_CAMERA分支。如果您返回 true,则向 Android 发出您已使用该键事件的信号,并且不应启动 Camera 应用程序。通过一直返回 false,所有关键事件都向上传递给默认处理程序。

于 2009-06-12T23:41:03.017 回答