BroadcastReceiver for disconnecting headphones

Hi, I am working on an application that generates an event when the headphones are removed from a mobile phone. I created a broadcast receiver with a receive method like

public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); Log.i("Broadcast Receiver", "Hello"); if( (action.compareTo(Intent.ACTION_HEADSET_PLUG)) == 0) //if the action match a headset one { int headSetState = intent.getIntExtra("state", 0); //get the headset state property int hasMicrophone = intent.getIntExtra("microphone", 0);//get the headset microphone property if( (headSetState == 0) && (hasMicrophone == 0)) //headset was unplugged & has no microphone { //do whatever } } } 

Call this method as follows

  IntentFilter receiverFilter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); HeadSetBroadCastReceiver receiver = new HeadSetBroadCastReceiver(); registerReceiver( receiver, receiverFilter ); 

I also registered this in the manifest as

  <receiver android:name=".HeadsetBroadCastReceiver"> <intent-filter> <action android:name="android.intent.action.ACTION_HEADSET_PLUG"/> </intent-filter> </receiver> 

and resolution

But it doesn’t work, can anyone guide me through this?

+7
source share
5 answers

The problem is that this broadcast has the flag Intent.FLAG_RECEIVER_Rector_ONLY . This means that demonstrators will not understand this. Here is a complete explanation.

+2
source

this is a tricky point, but you can use BroadCast, as the following work well with me in Activities

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new HeadSetReceiver(); } 

and in onResume () the method will register your broadcast

 public void onResume() { IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); registerReceiver(myReceiver, filter); super.onResume(); } 

then announce your BroadCast in your activity

 private class HeadSetReceiver 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 unplugged"); break; case 1: Log.d(TAG, "Headset plugged"); break; } } } } 

Hope this helps,

+17
source

Answer my question ... Thanks for the answer to everyone

 class NoisyAudioStreamReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { // pause(); Log.d("Mesage","Unplug"); Toast.makeText(context, "Heello",Toast.LENGTH_LONG).show(); } } } IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); NoisyAudioStreamReceiver receiver = new NoisyAudioStreamReceiver(); registerReceiver( receiver, intentFilter ); 

+1
source

I recommend that you switch the breakpoint inside onReceive and check the debug mode, what event you get when you connect the device to the handset. And then insert this event instead of Intent.ACTION_HEADSET_PLUG Thanks.

0
source

I believe that there is a problem with registering a broadcast receiver with the corresponding intention. Refer to this post and see if it works.

Exception in my logcat

 07-30 12:41:01.448: E/ActivityThread(321): Activity com.example.test.MainActivity has leaked IntentReceiver com.example.test.BroadcastsHandler@44ee81d8 that was originally registered here. Are you missing a call to unregisterReceiver()? 07-30 12:41:01.448: E/ActivityThread(321): android.app.IntentReceiverLeaked: Activity com.example.test.MainActivity has leaked IntentReceiver com.example.test.BroadcastsHandler@44ee81d8 that was originally registered here. Are you missing a call to unregisterReceiver()? 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread$PackageInfo$ReceiverDispatcher.<init>(ActivityThread.java:939) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread$PackageInfo.getReceiverDispatcher(ActivityThread.java:734) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:791) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ContextImpl.registerReceiver(ContextImpl.java:778) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ContextImpl.registerReceiver(ContextImpl.java:772) 07-30 12:41:01.448: E/ActivityThread(321): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318) 07-30 12:41:01.448: E/ActivityThread(321): at com.example.test.MainActivity.onCreate(MainActivity.java:19) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 07-30 12:41:01.448: E/ActivityThread(321): at android.os.Handler.dispatchMessage(Handler.java:99) 07-30 12:41:01.448: E/ActivityThread(321): at android.os.Looper.loop(Looper.java:123) 07-30 12:41:01.448: E/ActivityThread(321): at android.app.ActivityThread.main(ActivityThread.java:4627) 07-30 12:41:01.448: E/ActivityThread(321): at java.lang.reflect.Method.invokeNative(Native Method) 07-30 12:41:01.448: E/ActivityThread(321): at java.lang.reflect.Method.invoke(Method.java:521) 07-30 12:41:01.448: E/ActivityThread(321): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 07-30 12:41:01.448: E/ActivityThread(321): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 07-30 12:41:01.448: E/ActivityThread(321): at dalvik.system.NativeStart.main(Native Method) 

So I registered a broadcast receiver in one of my projects:

OnCreate:

 $////////////////broadcast reciever///////////// IntentFilter iFilter = new IntentFilter(); iFilter.addAction(handler.ACTION); iFilter.addCategory(Intent.CATEGORY_DEFAULT); handler = new HandleTime(); registerReceiver(handler, iFilter); 

Manifest.xml:

 <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> 
0
source

All Articles