In Android how do you register to receive headset plug broadcasts?

11,035

Solution 1

Here are two sites that may help explain it in more detail:

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

  1. Register the Service in the first Activity (here its called MainActivity.java).

  2. Switch over the result of the ACTION_HEADSET_PLUG action in the BroadCastReceiver.

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");
            }
        }
    }
}
Share:
11,035

Related videos on Youtube

shim
Author by

shim

Delphia

Updated on June 21, 2022

Comments

  • shim
    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
    shim over 11 years
    Thanks, 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
    twaddington over 11 years
    Ah I'm sorry, try exported="true". I believe the default value is false (if left undefined). If it's not set to true it won't be called by the system and can only be called by your application.
  • William
    William about 9 years
    You cannot use a manifest declaration to receive this intent. Your receiver needs to be defined via code. See stackoverflow.com/questions/6249023/…
  • WebViewer
    WebViewer over 7 years
    Also, 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
    Abdul Waheed about 5 years
    i 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
    Abdul Waheed about 5 years
    It seems with manifest registration it does not work at all. Do you have any update for manifest register working?
  • Eugen Pechanec
    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.