在android中收听硬件按钮点击事件

时间:2009-11-19 00:25:54

标签: android broadcastreceiver

作为一个简单的测试,我正在尝试使用一个broadcastReceiver,它将通过Toast消息通知用户在android中单击了一个硬件按钮。

我在我的清单文件中创建了一个接收器标签,其名称为.TestReceiver,当用户点击绿色SEND按钮时,它会收听Action_CALL_BUTTON的通知:

<receiver android:name=".TestReceiver" >
    <intent-filter>             
        <action android:name="android.intent.action.ACTION_CALL_BUTTON" />
    </intent-filter>            
</receiver>

接下来,我创建了TestReceiver类,它扩展了BroadcastReceiver并创建了Toast。 当我点击通话按钮时,我没有看到Toast消息,但我在一个活动上测试了它并显示。 我在这里缺少什么?

package com.example.helloandroid;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class TestReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub

        CharSequence text = "Hello toast!";
        int duration = Toast.LENGTH_SHORT;

        Toast toast = Toast.makeText(context, text, duration);
        toast.show();

    }

}

由于

4 个答案:

答案 0 :(得分:3)

以下是导致任何BroadcastReceiver无法接收的原因:

  1. 在您的具体情况下,ACTION_CALL_BUTTON不是广播Intent操作。这是一项活动Intent操作,不会被BroadcastReceivers拦截。您可以通过documentation for this particular action
  2. 中的“活动操作”声明来说明这一点
  3. 广播Intent可能没有资格使用舱单注册的接收器。 ACTION_BATTERY_STATUS就是这样一个行动。这些只能由通过registerReceiver()在Java中注册的接收者接收。不幸的是,遵循这条规则只是偶尔记录在案。
  4. 您可能需要特殊权限才能收到Intent。例如,ACTION_BOOT_COMPLETED仅在您拥有RECEIVE_BOOT_COMPLETED权限时才有效。这些通常在该操作的文档中提到。

答案 1 :(得分:0)

所以我可以使用ACTION_CALL_BUTTON注册registerReceiver()? 我没有看到任何许可。

答案 2 :(得分:0)

嘿,您可以按照link进行操作。您可以通过点击按钮看到自定义Intent教程来调用广播意图

这是清单

<receiver android:name="MyReceiver">
  <intent-filter>
     <action android:name="com.tutorialspoint.CUSTOM_INTENT">
  </action>
  </intent-filter>

这是一个广播接收器类

public class MyReceiver extends BroadcastReceiver 
{

   @Override
   public void onReceive(Context context, Intent intent) {
   Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}

在主要活动中声明此方法

public void broadcastIntent(View view)
{
    Intent intent = new Intent();
    intent.setAction("com.tutorialspoint.CUSTOM_INTENT");
    sendBroadcast(intent);
}
}

最后是你的按钮

 <Button android:id="@+id/btnStartService"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="@string/broadcast_intent"
  android:onClick="broadcastIntent"/>

答案 3 :(得分:-1)

您可以使用 onKeyDown()方法

方法: -

@Override
public boolean onKeyDown(int keycode, KeyEvent e) {
    switch(keycode) {
        case KeyEvent.KEYCODE_MENU:
           // Your Task on hard menu click
            break;
        case KeyEvent.KEYCODE_BACK:
          // Your Task on hard back click
             break;

            return true;
    }

    return super.onKeyDown(keycode, e);
}