我似乎无法找到与查找哪些应用程序获得音频焦点有关的任何内容。我可以从我的应用程序中正确地确定它是什么类型的焦点更改,但不是从任何其他应用程序。有没有办法确定哪些应用程序受到关注?
"我想做什么?"
我设法记录内部声音,无论是音乐还是声音。如果我目前正在录制音频而不管来源,我想确定哪些应用程序将重点放在了以确定我的应用程序下一步需要做什么。
目前我正在使用AudioManager.OnAudioFocusChangeListener我的应用程序在焦点更改后停止录制内部声音,但我希望应用程序的名称得到关注。
答案 0 :(得分:3)
简答:没有好的解决方案...... Android可能就是这样想的。
<强>说明:强> 查看源代码,AudioManager没有用于检查谁拥有Audio Focus的API(甚至是隐藏的API)。 AudioManager包含对AudioService的调用,该调用保持真实的音频状态。当AudioManager绑定它时,AudioService通过它发出的API也没有用于查询当前音频焦点的API。因此,即使通过反射/系统级权限,您也无法获得所需的信息。
如果您对如何跟踪焦点更改感到好奇,可以查看MediaFocusControl,其实例是AudioService here的成员变量。
未经测试的Hacky Heuristic: 您可以通过查看UsageStats时间戳来获取一些有用的信息。然后,如果您在使用AudioFocus失去了大约500毫秒的时间内使用了应用,则可以使用音频权限对应用进行交叉检查。您可以按this post获取已安装任何应用的权限。
这显然是一种启发式方法,可能需要进行一些调整。它还要求用户授予您的应用程序权限以访问使用情况统计信息。里程可能会有所不同。
答案 1 :(得分:2)
查看MediaContorller类(棒棒糖中的新功能,旧版本的可比性库中提供)。
这两种方法看起来很有趣:
https://developer.android.com/reference/android/media/session/MediaController.html#getPackageName()
getPackageName应该返回当前的会话包名称: http://androidxref.com/5.1.1_r6/xref/frameworks/base/media/java/android/media/session/MediaController.java#397
getSessionActivity为您提供了一个PendingIntent,其中包含一个要启动的活动(如果提供了一个活动),您也可以获取该包。
与您的音频监听器和电话状态的广播接收器一起使用,以检测手机当前是否正在振铃,您可以使用此功能以获得比目前更精细的检测。正如Trevor Carothers上面指出的那样,没有办法让音频聚焦的普通应用程序。
答案 2 :(得分:2)
您可以使用dumpsys audio
查找使用音频焦点的人。而且,您还可以查看dumpsys media_session
的结果。
而且,如果您想查找谁在播放音乐,您可以选择dumpsys media.audio_flinger
。对于我自己,我切换到这个命令。