gpt4 book ai didi

android - 检测耳机安卓

转载 作者:行者123 更新时间:2023-11-29 17:39:16 25 4
gpt4 key购买 nike

我最近几年在 Android 上编程,我想知道一些事情:

如何检测耳机是否存在?
有一种方法:isWiredHeadsetOn() 但它不起作用。

我已经试过了,但它不起作用:

AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
Log.i("am.isWiredHeadsetOn()", am.isWiredHeadsetOn() + "");

if (am.isWiredHeadsetOn()) {
//code
}

谢谢(如果我拼错了,我很抱歉,我是法国人)

最佳答案

@Phil 在 https://stackoverflow.com/a/19102661/4758255 回答是一个很好的检测耳机的实现。

这里我引用他的回答。 请为他的回答点赞,而不是这个!

为答案点赞:https://stackoverflow.com/a/19102661/4758255


三年来,我在商店里有一个应用程序可以同时监控有线耳机和蓝牙状态,而且从来没有人提示电池耗尽。但那是因为我成功地使用单个服务和广播接收器来检测来自两者的事件。这是两个关键类:

public class HeadsetStateBroadcastReceiver extends BroadcastReceiver {

public static final String[] HEADPHONE_ACTIONS = {
Intent.ACTION_HEADSET_PLUG,
"android.bluetooth.headset.action.STATE_CHANGED",
"android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED"
};

@Override
public void onReceive(final Context context, final Intent intent) {

boolean broadcast = false;

// Wired headset monitoring
if (intent.getAction().equals(HEADPHONE_ACTIONS[0]) {
final int state = intent.getIntExtra("state", 0);
AudioPreferences.setWiredHeadphoneState(context, state > 0);
broadcast = true;
}

// Bluetooth monitoring
// Works up to and including Honeycomb
if (intent.getAction().equals(HEADPHONE_ACTIONS[1])) {
int state = intent.getIntExtra("android.bluetooth.headset.extra.STATE", 0);
AudioPreferences.setBluetoothHeadsetState(context, state == 2);
broadcast = true;
}

// Works for Ice Cream Sandwich
if (intent.getAction().equals(HEADPHONE_ACTIONS[2])) {
int state = intent.getIntExtra("android.bluetooth.profile.extra.STATE", 0);
AudioPreferences.setBluetoothHeadsetState(context, state == 2);
broadcast = true;
}

// Used to inform interested activities that the headset state has changed
if (broadcast) {
LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("headsetStateChange"));
}

}

}

这是我用来注册广播接收器的服务:

public class HeadsetMonitoringService extends Service {

HeadsetStateBroadcastReceiver headsetStateReceiver;

@Override
public void onCreate() {

headsetStateReceiver = new HeadsetStateBroadcastReceiver();
final IntentFilter filter = new IntentFilter();
for (String action: HeadsetStateBroadcastReceiver.HEADPHONE_ACTIONS) {
filter.addAction(action);
}

registerReceiver(headsetStateReceiver, filter);

}

@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
return START_STICKY;
}

@Override
public void onDestroy() {
unregisterReceiver(headsetStateReceiver);
}

@Override
public IBinder onBind(final Intent intent) {
return null;
}

}

这是我的 list 条目:

    <service
android:name=".services.HeadsetMonitoringService"
android:enabled="true"
android:exported="false" >
<intent-filter>
<action android:name="initialiseHeadsetService" />
</intent-filter>
</service>

其工作原理如下:

我使用启动广播接收器向 HeadsetMonitoringService 发送启动服务消息(您不必以这种方式执行,您可以在应用程序启动时执行此操作)。 HeadsetMonitoringService 依次注册一个广播监听器实例,该监听器监听我感兴趣的所有耳机​​事件 - 它们保存在 HEADPHONE_ACTIONS 数组中。因为服务是粘性的,所以它会一直存在——广播监听器也是如此。但是因为服务和广播监听器都是事件驱动的,所以在耳机状态发生变化之前它们不会消耗任何电量。此外,由于该服务是粘性的,如果它意外死亡,它会被操作系统重新启动。
每当我收到耳机状态更改事件时,我也会触发本地广播,以便感兴趣的 Activity 可以检查新状态并在需要时采取行动。

为了完整起见,我应该指出我使用了另一个类(此处未显示)AudioPreferences 来存储蓝牙和有线耳机状态作为首选项,然后我可以在需要了解耳机状态时访问它。

如果您对蓝牙耳机的状态感兴趣,您的应用程序将需要 android.permission.BLUETOOTH 权限。如果没有,只需从 HEADPHONE_ACTIONS 数组中取出蓝牙相关的操作,并从 onReceive 方法中删除关联的 if block 。

关于android - 检测耳机安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29333340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com