检测耳机Android

时间:2015-03-29 18:47:23

标签: android detect headphones

我近年来对Android进行编程,我想知道:

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

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

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

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

谢谢(对不起,如果我犯了拼写错误,我是法国人)

3 个答案:

答案 0 :(得分:1)

https://stackoverflow.com/a/19102661/4758255的@Phil回答是检测耳机的好方法。

我在这里引用他的回答。 请不要赞成他的回答!

提出答案: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;
    }

}

这是我的明显条目:

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

工作原理如下:

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

为了完整性,我应该指出我使用另一个类(未在此处显示)AudioPreferences来存储蓝牙和有线耳机状态的首选项,然后只要我需要知道耳机状态就可以访问它。 / p>

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

答案 1 :(得分:0)

AudioManager.isWiredHeadsetOn()似乎是正确的做法。根据Android开发人员doc:

Checks whether a wired headset is connected or not.

This is not a valid indication that audio playback is actually over the wired headset as audio routing depends on other conditions.

Returns
true if a wired headset is connected. false if otherwise

但是:

  • 您必须向清单添加相关权限(MODIFY_AUDIO_SETTINGS)
  • 根据this post,它与蓝牙耳机不兼容。

答案 2 :(得分:0)

如果你对Marshmallow表示满意,那么AudioDeviceCallback可能就是你想要的。它适用于AudioManager,并告诉您何时连接和断开连接。