Android:检测来自STREAM_VOICE_CALL的声音是否正在播放

时间:2018-01-31 00:40:43

标签: android android-audiomanager tasker

我正在寻找一种方法来检查其他应用程序是否正在使用STREAM_VOICE_CALL(例如在通话过程中或在收听将手机放到耳边的whatsapp语音提示时)(但一般情况下我们应该找到一种方法选择要监控的任何流)。我需要这个在Tasker中使用,但这应该是无关紧要的(但应该帮助其他人找到同样的问题)。

基本上这是完美的:

AudioSystem.isStreamActive(int stream, int inPastMs)

可以与任何音频流一起使用......在我的情况下

AudioSystem.isStreamActive(STREAM_VOICE_CALL, 0)

太糟糕了,AudioSystem现在被替换为AudioManager class :((关于另一个帖子Android: Is there a way to detect if a sound from SoundPool is still playing中的AudioSystem的信息)

现在我们已经尝试了 AudioManager.isMusicActive ,它完美无瑕,但当然它指的是STREAM_MUSIC。

有什么建议吗? 感谢

1 个答案:

答案 0 :(得分:0)

AudioSystem 是隐藏的 API。您可能需要使用反射来访问它。为 AudioManager 创建扩展并将其用作:

audioManager.isStreamActive(AudioManager.STREAM_SYSTEM)

实施:

private val AUDIO_SYSTEM_IS_STREAM_ACTIVE: Method by lazy { Class.forName("AudioSystem").getDeclaredMethod("isStreamActive",
    Integer::class.javaPrimitiveType, Integer::class.javaPrimitiveType).also { it.isAccessible = true }
}

fun AudioManager.isStreamActive(stream : Int) : Boolean {
    require(stream in -1..11){
        "Stream type must be between -1 (DEFAULT) and 11 (ASSISTANT)"
    }
    return when (stream) {
        AudioManager.STREAM_MUSIC -> {
            isMusicActive
        }
        AudioManager.STREAM_RING -> {
            ringerMode != AudioManager.RINGER_MODE_SILENT
                    && AUDIO_SYSTEM_IS_STREAM_ACTIVE.invoke(this, stream, 0) as Boolean
        }
        else -> {
            AUDIO_SYSTEM_IS_STREAM_ACTIVE.invoke(this, stream, 0) as Boolean
        }
    }
}