1

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

基本上这是完美的:

AudioSystem.isStreamActive(int stream, int inPastMs)

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

AudioSystem.isStreamActive(STREAM_VOICE_CALL, 0)

太糟糕了 AudioSystem 现在被AudioManager类取代了 :( (有关 AudioSystem 在这个其他线程Android 中的信息:有没有办法检测来自 SoundPool 的声音是否仍在播放

现在我们有了我尝试过的AudioManager.isMusicActive,它可以完美运行,但它当然是指 STREAM_MUSIC。

有什么建议吗?谢谢

4

1 回答 1

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

于 2021-07-11T11:18:17.560 回答