1

背景

我正在开发一个监控接近传感器的应用程序。但是,我不想在用户通过手机耳机听东西时监控传感器。这是因为用户可能会将他/她的头靠在听筒上听,这反过来会触发接近传感器,而我并没有尝试检测头部接近度。

问题

如何检测声音是否通过听筒耳机播放?当然,回调是可取的,但如果这是唯一的方法,我愿意进行投票。

4

3 回答 3

1

您可以通过定期轮询并进行以下检查来近似此值:

我在 Android 4.3 中对此进行了测试,它似乎可以在系统电话应用 Viber 和 Skype 上正常工作。但是,它似乎没有检测到通过听筒播放的音乐或非电话声音。我认为这不是什么大问题,因为听筒通常似乎只用于电话。

例子

public class EarpieceSpeakerState {

    private AudioManager audioManager;

    public EarpieceSpeakerState(AudioManager audioManager) {
        this.audioManager = audioManager;
    }
    
    public boolean usingEarpieceSpeaker() {
        return playingSound()
            && routingToEarpiece();
    }

    private boolean playingSound() {
        return audioManager.getMode() != AudioManager.MODE_NORMAL;
    }
    
    private boolean routingToEarpiece() {
        return !(
            audioManager.isSpeakerphoneOn()
            || audioManager.isBluetoothScoOn()
            || audioManager.isBluetoothA2dpOn()
            || audioManager.isWiredHeadsetOn()
        );
    }

}
于 2014-12-18T08:57:56.850 回答
0

我不知道这是否是正确的解决方案,但我认为您至少应该尝试一下,看看这个链接。理论上,如果其他人正在使用您手机的扬声器,您将不会获得焦点。

于 2014-12-17T10:31:06.720 回答
0

基本解决方案,您可以扩展它链接

 private fun initOnAudioFocusChangeListener() {
val afChangeListener: AudioManager.OnAudioFocusChangeListener =
    AudioManager.OnAudioFocusChangeListener { focusChange ->
        when (focusChange) {
            AudioManager.AUDIOFOCUS_GAIN -> {
                viewModel.isAppLostAudioFocusLiveData.value = false
            }
            else -> {
                viewModel.isAppLostAudioFocusLiveData.value = true
            }
        }
    }

val audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    audioManager.requestAudioFocus(
        AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
            .setOnAudioFocusChangeListener(afChangeListener).build()
    )
} else {
    audioManager.requestAudioFocus(
        afChangeListener,
        AudioManager.STREAM_MUSIC,
        AudioManager.AUDIOFOCUS_GAIN
    )
}

}

于 2020-09-10T15:51:28.757 回答