嗨,我正在开发一个应用程序,当手机从手机上移除时会生成一个事件。 我创建了一个带接收方法的广播接收器
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>
和许可
但这不起作用,任何人都可以指导我完成这个吗?
答案 0 :(得分:18)
这是棘手的一点,但你可以使用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();
}
然后在您的活动中声明您的BroadCast
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;
}
}
}
}
希望它是帮助,,,
答案 1 :(得分:2)
问题在于此广播设置了标志Intent.FLAG_RECEIVER_REGISTERED_ONLY。这意味着清单接收器不会捕获它。 Here是一个完整的解释。
答案 2 :(得分:1)
回答我的问题是这个..感谢您回复每个人
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 );
答案 3 :(得分:0)
我建议您在onReceive中切换断点并检查调试模式当您插入手机设备时接收的是哪种事件。 然后插入此事件而不是Intent.ACTION_HEADSET_PLUG 感谢。
答案 4 :(得分:0)
我认为注册具有相应意图的广播接收器存在问题。请参阅此post,看看是否有效。
我的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)
这是我在我的一个项目中注册广播接收器的方式:
的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>