我正在寻找一种方法来检查其他应用程序是否正在使用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。
有什么建议吗? 感谢
答案 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
}
}
}