注册耳机按钮单击Android中的BroadcastReceiver

时间:2011-06-09 01:25:43

标签: java android

我有一个带有单个按钮的耳机,并且在按下按钮时想要做一个简单的Toast。

现在我有以下代码:

public class MediaButtonIntentReceiver extends BroadcastReceiver {

public MediaButtonIntentReceiver() {
    super();
}

@Override
public void onReceive(Context context, Intent intent) {
    String intentAction = intent.getAction();
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
        return;
    }
    KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    if (event == null) {
        return;
    }
    int action = event.getAction();
    if (action == KeyEvent.ACTION_DOWN) {
    // do something
        Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); 
    }
    abortBroadcast();
}
}

我的主要活动如下:

public class mainActivity extends Activity {

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver();
    registerReceiver(r, filter); 

}
}

虽然按下按钮但没有任何反应。

我很清楚清单中的权限/ xml有问题。到目前为止,这是接收器XML:

    <receiver android:name=".MediaButtonIntentReceiver">
        <intent-filter>
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>

...

<uses-permission android:name="android.permission.BLUETOOTH" /> 

我在LogCat中注意到,当我按下按钮时,我从“BluetoothIntentReceiver”收到错误,说“onReceive()动作:android.intent.action.MEDIA_BUTTON”

5 个答案:

答案 0 :(得分:32)

只是想回答我自己的问题,以防其他人遇到类似的问题。

代码确实有效,只是我没有看到Toast,因为我安装了另一个耳机按钮控制器应用程序(并在后台运行),所以我想它优先于我的。但是,当我把

    IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON"
    MediaButtonIntentReceiver r = new MediaButtonIntentReceiver();
    filter.setPriority(1000); //this line sets receiver priority
    registerReceiver(r, filter);

即使安装了其他应用也能够正常工作。此外,您不需要上述和XML,一个或另一个可以作为注册意图接收器的方法。

答案 1 :(得分:5)

以下是我在Android 4.2.2中使用的内容

在我的manifest.xml中,我这样做:

<receiver android:name=".MediaButtonIntentReceiver">
<intent-filter>
    <action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>

注意:这是而不是调用registerReceiver

在我的主要活动onCreate中,我需要调用AudioManager:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(
    new ComponentName(
         getPackageName(), 
         MediaButtonIntentReceiever.class.getName()));

我发现它可以在没有AudioManager调用的情况下工作,但不会很长时间!

答案 2 :(得分:2)

您不应该使用setPriority

您在清单

中注册广播接收器

然后使用以下方式注册广播接收器:

AudioManager#registerMediaButtonEventReceiver

registerMediaButtonEventReceiver的参数是指向广播接收器的ComponentName。

答案 3 :(得分:2)

有关Android&gt; 4.0的完整文档答案,请查看此处:

BroadcastReceiver for ACTION_MEDIA_BUTTON not working

答案 4 :(得分:0)

如果您不想使用BroadcastReceiver,可以使用此处所述的MediaSession为Android&gt; 5.0(API级别21 LOLLIPOP)执行此操作:https://stackoverflow.com/a/39413753/1386969