Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 检测何时通过耳机扬声器播放声音 背景_Android_Audio_Speaker - Fatal编程技术网

Android 检测何时通过耳机扬声器播放声音 背景

Android 检测何时通过耳机扬声器播放声音 背景,android,audio,speaker,Android,Audio,Speaker,我正在开发一个监控接近传感器的应用程序。但是,我不想在用户通过电话耳朵扬声器收听内容时监视传感器。这是因为用户可能会将他的/她的头靠在手机上听,这反过来会触发接近传感器,而我不会尝试检测头部接近 问题: 我如何检测声音何时通过手机耳朵扬声器播放?当然,回拨是更好的选择,但我愿意调查这是否是唯一的方法。我不知道这是否是正确的解决方案,但我认为您至少应该尝试一下,看看。 通常,如果其他人正在使用您手机的扬声器,您将无法获得焦点。您可以通过定期轮询并进行以下检查来近似此情况: 检查是否不在 检查是否

我正在开发一个监控接近传感器的应用程序。但是,我不想在用户通过电话耳朵扬声器收听内容时监视传感器。这是因为用户可能会将他的/她的头靠在手机上听,这反过来会触发接近传感器,而我不会尝试检测头部接近

问题:
我如何检测声音何时通过手机耳朵扬声器播放?当然,回拨是更好的选择,但我愿意调查这是否是唯一的方法。

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

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

  • 检查是否不在
  • 检查是否正在将音频传输至听筒
我在安卓4.3中测试了这个功能,它似乎可以与系统手机应用程序Viber和Skype配合使用。然而,它似乎无法检测通过耳机播放的音乐或非电话声音。我不认为这是一个很大的问题,因为不管怎样,耳机通常只用于电话

例子
基本解决方案,您可以扩展它


}

这里可能的答案是:即使您知道用户是否在播放某些东西,也没有人会说他的声音不反对扬声器。最好是检查用户是否正在通话。否则,当用户以非常低的音量播放音乐时,您可以再次减少停用检测的原因headphones@TheRedFox,如果可能,检查用户是否正在通话是一个很好的解决方案,但似乎很难检测用户是否正在进行非系统通话,如Viber或Skype通话。另外,如果用户正在通过耳朵扬声器听音乐或有声读物呢?@TheRedFox,我不明白你的最后一句话。你能换一种说法吗?@Sam是的,很难说到底发生了什么,因为你也有可能有人在使用扬声器,但仍然有人对扬声器有反感,:-)看起来可能有效,但接收音频焦点更改的唯一方法似乎是请求焦点。但是,请求focus可能会导致另一个应用程序的现有播放停止。实际上,您可以请求focus,如果您得到它,只需尽快删除请求并执行代码。一旦我有了focus,我怎么知道我是从另一个应用程序中获取的,还是没有使用过?如果某个应用程序正在使用扬声器,我想你不会从阅读文档中获得焦点,我得到的印象是,请求音频焦点会使它从其他应用程序中消失。
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()
        );
    }

}
 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
    )
}