这是我的收件人档案
package com.example.tony.headsetplug;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class MusicIntentReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
Log.i("Tag","got receiver");
}
}
我正在尝试实现静态广播以插入耳机,我的清单文件中定义了静态广播。
<?xml version="1.0" encoding="utf-8"?>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver
android:name=".MusicIntentReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.headset_plug" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
它无法正常工作,甚至没有收到广播。
答案 0 :(得分:1)
ACTION_HEADSET_PLUG
的值为"android.intent.action.HEADSET_PLUG"
(请注意大写字母)。同时查看documentation。
p.s。 :此外,您必须以编程方式注册接收方(例如检查this post),例如:
IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
HeadsetStateReceiver receiver = new HeadsetStateReceiver();
registerReceiver( receiver, receiverFilter );
答案 1 :(得分:0)
您必须通过代码注册接收器,这是必须的:
stackoverflow.com/questions/6249023/detecting-whether-a-headset-is-plugged-into-an-android-device-or-not
如果你想让你的听众永远在场,你应该听取系统启动意图并在听众中注册。
答案 2 :(得分:0)
来自AudioManager.ACTION_HEADSET_PLUG上的官方API文档:
广播操作:有线耳机已插入或拔出。 您无法通过清单中声明的组件接收此内容,只能通过使用Context.registerReceiver()显式注册它。
意图将具有以下额外值:
- 状态 - 0表示未插入,1表示已插入。
- name - 耳机类型,人类可读的字符串
- 麦克风 - 如果耳机有麦克风,则为1,否则为
这应该解释为什么定义为静态时它不能正常工作。我认为,由于音乐应用程序通常依赖于此广播,因此当用户实际上没有听音乐或做任何与音频相关的事情时接收这样的广播是没有意义的。
修改:
如果您想在插入耳机时启动音乐应用,但您的活动未运行,该怎么办?
考虑使用后台服务,除了注册处理ACTION_HEADSET_PLUG的接收器之外,它不会做太多事情。为了在重新启动设备时启动服务,您可以添加一个静态接收器,监听ACTION_BOOT_COMPLETED,然后启动该服务。
顺便说一句:如果您想知道是否可以在安装应用程序后立即启动服务,则不能。至少根据这个post。
希望这会有所帮助。