我在Android 2.1中工作,我想检测耳机插入/取出的时间。我对android很新。
我认为这样做的方法是使用广播接收器。我放弃了这个,我还在AndroidManifest.xml中添加了以下内容。但你是否必须在其他方面注册接收器,就像在活动中一样?我知道这有很多线索,但我真的不明白他们在谈论什么。另外,在AndroidManifest.xml中注册与在活动中动态注册之间的区别是什么?
<receiver android:enabled="true" android:name="AudioJackReceiver" >
<intent-filter>
<action android:name="android.intent.action.HEADSET_PLUG" >
</action>
</intent-filter>
</receiver>
这是该类的实现(加上导入)
public class AudioJackReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.w("DEBUG", "headset state received");
}
}
我只是想看看它是否有效,但在运行应用程序时拔下/插入耳机时没有任何显示。
编辑:文档没有说明这一点,但是如果在清单中注册,这个文件可能无效吗?当我在我的一个应用程序中注册接收器时,我能够让它响应(或者你还必须这样做吗?)
答案 0 :(得分:9)
只是补充Greg的答案,以下是您需要分为两部分的代码
在第一个活动(此处称为MainActivity.java
)中注册服务。
切换ACTION_HEADSET_PLUG
中BroadCastReceiver
操作的结果。
这就是:
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");
}
}
}
}
答案 1 :(得分:2)
以下是两个可能有助于更详细解释的网站:
你必须定义你的意图;否则它将无法访问系统功能。广播接收器;将提醒您的应用程序您想要收听的更改。
每个接收器都需要进行子类化;它必须包含onReceive()
。要实施onReceive()
,您需要创建一个包含两个项目的方法:上下文&amp;的意图强>
更有可能服务是理想的;但是你将创建一个服务并通过它定义你的上下文。在上下文中;你会定义你的意图。
一个例子:
context.startService
(new Intent(context, YourService.class));
非常基本的例子。然而;您的特定目标是利用系统范围的广播。您希望您的应用程序收到Intent.ACTION_HEADSET_PLUG
的通知。
如何通过清单订阅:
<receiver
android:name="AudioJackReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.HEADSET_PLUG" />
</intent-filter>
</receiver>
或者您可以通过您的应用程序进行简单定义;但。你的特殊要求;如果您打算检测蓝牙MODIFY_AUDIO_SETTINGS
,则需要用户权限。
答案 2 :(得分:1)
您需要enable the broadcast receiver并将exported
属性设置为true
:
<receiver
android:name="AudioJackReceiver"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.HEADSET_PLUG" />
</intent-filter>
</receiver>