在Android中监听硬件按钮点击事件

3
作为一个简单的测试,我试图创建一个广播接收器,在Android中当硬件按钮被点击时,通过Toast消息通知用户。
我在清单文件中创建了一个接收器标签,名称为.TestReceiver,它监听Action_CALL_BUTTON以便在用户点击绿色发送按钮时得到通知。
<receiver android:name=".TestReceiver" >
    <intent-filter>             
        <action android:name="android.intent.action.ACTION_CALL_BUTTON" />
    </intent-filter>            
</receiver>

接下来,我创建了一个扩展BroadcastReceiver并创建Toast的TestReceiver类。当我点击呼叫按钮时,我看不到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个回答

3
以下是关于任何BroadcastReceiver无法接收的原因:
  1. 在您的特定情况下,ACTION_CALL_BUTTON不是广播Intent操作。这是一个活动Intent操作,不会被BroadcastReceivers拦截。您可以通过此特定操作的文档中的“活动操作”语句来确定此操作。
  2. 广播Intent可能不适用于清单注册的接收器。 ACTION_BATTERY_STATUS就是这样的操作。这些只能由通过registerReceiver()在Java中注册的接收器接收。不幸的是,遵循此规则的操作仅偶尔有记录。
  3. 您可能需要特殊权限才能接收Intent。例如,ACTION_BOOT_COMPLETED仅在您持有RECEIVE_BOOT_COMPLETED权限时才起作用。这些通常在该操作的文档中提到。

0

嘿,你可以跟随这个链接。你可以通过点击按钮查看自定义Intent调用广播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"/>

你的答案不符合问题。他在谈论硬件按钮。 - Mehtab Ahmed

0

那我可以使用registerReceiver()注册到ACTION_CALL_BUTTON吗? 我没有看到需要任何权限。


正如我所写:“在您的特定情况下,ACTION_CALL_BUTTON不是广播Intent操作。它是一个活动Intent操作,不会被BroadcastReceivers拦截。您可以通过该特定操作的文档中的“Activity Action”语句来确定这一点。” - CommonsWare
那么你是说这是不可能的吗?我想编写一个接收此操作而非活动的服务。 - Greg Ennis

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接