In Android how do you register to receive headset plug broadcasts?
Solution 1
Here are two sites that may help explain it in more detail:
- http://www.grokkingandroid.com/android-tutorial-broadcastreceiver/
- http://www.vogella.com/articles/AndroidBroadcastReceiver/article.html
You have to define your intent; otherwise it won't access the system function. The broadcast receiver; will alert your application of changes that you'd like to listen for.
Every receiver needs to be subclassed; it must include a onReceive()
. To implement the onReceive()
you'll need to create a method that will include two items: Context & Intent.
More then likely a service would be ideal; but you'll create a service and define your context through it. In the context; you'll define your intent.
An example:
context.startService
(new Intent(context, YourService.class));
Very basic example. However; your particular goal is to utilize a system-wide broadcast. You want your application to be notified of Intent.ACTION_HEADSET_PLUG
.
How to subscribe through manifest:
<receiver
android:name="AudioJackReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.HEADSET_PLUG" />
</intent-filter>
</receiver>
Or you can simply define through your application; but. Your particular request; will require user permissions if you intend to detect Bluetooth MODIFY_AUDIO_SETTINGS
.
Solution 2
Just complementing Greg`s answer, here is the code that you need divided in two parts
Register the Service in the first Activity (here its called
MainActivity.java
).Switch over the result of the
ACTION_HEADSET_PLUG
action in theBroadCastReceiver
.
Here it goes:
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private MusicIntentReceiver myReceiver;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MusicIntentReceiver();
}
@Override public void onResume() {
IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
registerReceiver(myReceiver, filter);
super.onResume();
}
private class MusicIntentReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
switch (state) {
case 0:
Log.d(TAG, "Headset is unplugged");
break;
case 1:
Log.d(TAG, "Headset is plugged");
break;
default:
Log.d(TAG, "I have no idea what the headset state is");
}
}
}
}
Related videos on Youtube
Comments
-
shim almost 2 years
I am working in Android 2.1, and I want to detect when the headset is plugged in/taken out. I'm pretty new to android.
I think the way to do it is using a Broadcast receiver. I sublcassed this, and I also put the following in my AndroidManifest.xml. But do you have to register the receiver somehwere else, like in the activity? I'm aware there are lots of threads on this, but I don't really understand what they're talking about. Also, what's the difference between registering in AndroidManifest.xml versus registering dynamically in your activity?
<receiver android:enabled="true" android:name="AudioJackReceiver" > <intent-filter> <action android:name="android.intent.action.HEADSET_PLUG" > </action> </intent-filter> </receiver>
And this was the implementation of the class (plus imports)
public class AudioJackReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.w("DEBUG", "headset state received"); }
}
I was just trying to see if it works, but nothing shows up when I unplug/plug in the headset while running the application.
EDIT: the documentation doesn't say this, but is it possible that this one won't work if registered in the manifest? I was able to get it to respond when I registered the receiver in one of my applications (or do you have to do that anyway?)
-
shim over 11 yearsThanks, but I have since added that (edited response just now as update), but still doesn't seem to work. What does exported="false" do?
-
twaddington over 11 yearsAh I'm sorry,
try exported="true"
. I believe the default value isfalse
(if left undefined). If it's not set totrue
it won't be called by the system and can only be called by your application. -
William about 9 yearsYou cannot use a manifest declaration to receive this intent. Your receiver needs to be defined via code. See stackoverflow.com/questions/6249023/…
-
WebViewer over 7 yearsAlso, I cannot understate how confusing it is for beginners to think that one needs both manifest registration and code registration. This answer correctly uses "Or you can simply define through your application". It's either the manifest or the code, not both. In the case of HEADSET_PLUG William is right: You cannot use a manifest declaration to receive this intent. So only the code option remains.
-
Abdul Waheed about 5 yearsi did exactly what you have mentioned but in my case it is not working. When I am registring in java code it is working
-
Abdul Waheed about 5 yearsIt seems with manifest registration it does not work at all. Do you have any update for manifest register working?
-
Eugen Pechanec over 3 years
android:exported
is implicitly true whenever you also define an intent filter (typical for broadcast receivers and main activity). Otherwise it's false.