BroadcastReceiver用于拔出耳机

嗨,我正在处理一个应用程序,当耳机从手机中删除时生成一个事件。 我用接收方法创build了一个广播接收器

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 } } } 

调用这个方法如下

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

我也注册这在清单中

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

和许可

但这不工作任何人都可以引导我通过这个?

Solutions Collecting From Web of "BroadcastReceiver用于拔出耳机"

这里的问题是这个广播有标志Intent.FLAG_RECEIVER_REGISTERED_ONLY设置。 这意味着明显的接收者不会理解这一点。 这里是一个完整的解释。

这是棘手的问题,但您可以使用BroadCast作为以下在您的活动中与我很好地工作

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

并在onResume()方法注册您的广播

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

然后在您的活动中声明您的广播

 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; } } } } 

希望这是帮助,,,

回答我的问题是这个..谢谢你回复每个人和每个人

 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 ); 

我build议您在onReceive内部切换断点,并在Debug模式下检查插入手机设备时收到的事件。 然后插入此事件而不是Intent.ACTION_HEADSET_PLUG谢谢。

我想在广播接收机的注册方面存在一个问题。 参考这篇文章 ,看看它是否工作。

在我的logcatexception

 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) 

这是我在我的一个项目中注册了一个广播接收机:

的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>