Android 检索具有音频焦点更改的应用程序名称

Android 检索具有音频焦点更改的应用程序名称,android,android-audiomanager,Android,Android Audiomanager,我似乎找不到任何与找出哪个应用程序获得音频焦点相关的东西。我可以从我的应用程序中正确地确定焦点更改的类型,但不能从任何其他应用程序中确定。有没有办法确定哪个应用程序收到了焦点 我想做什么? 我已经设法录制了内部声音,无论是音乐还是声音。如果我当前正在录制音频,无论音频的来源是什么,我想确定哪个应用程序占据了焦点,以确定我的应用程序下一步需要做什么 目前,我正在使用for我的应用程序在焦点改变后停止录制内部声音,但我需要获得焦点的应用程序的名称。简短回答:没有好的解决方案。。。安卓可能就是这么想的

我似乎找不到任何与找出哪个应用程序获得音频焦点相关的东西。我可以从我的应用程序中正确地确定焦点更改的类型,但不能从任何其他应用程序中确定。有没有办法确定哪个应用程序收到了焦点

我想做什么?

我已经设法录制了内部声音,无论是音乐还是声音。如果我当前正在录制音频,无论音频的来源是什么,我想确定哪个应用程序占据了焦点,以确定我的应用程序下一步需要做什么


目前,我正在使用for我的应用程序在焦点改变后停止录制内部声音,但我需要获得焦点的应用程序的名称。

简短回答:没有好的解决方案。。。安卓可能就是这么想的

说明: 看看源代码,AudioManager没有API(甚至隐藏的API)来检查谁有音频焦点。AudioManager封装对AudioService的调用,该服务保持真实的音频状态。当AudioManager绑定到AudioService时,AudioService通过其存根公开的API也没有用于查询当前音频焦点的API。因此,即使通过反射/系统级权限,您也无法获得所需的信息

如果您想知道焦点变化是如何跟踪的,您可以看看谁的实例是AudioService的成员变量

未经测试的黑客启发式: 通过查看时间戳,您可能会获得一些有用的信息。然后,一旦你的应用程序在失去AudioFocus的500毫秒内使用,你就可以对照具有音频权限的应用程序进行交叉检查。您可以按照以下步骤获取任何已安装应用程序的权限


这显然是一种启发,可能需要一些调整。它还要求用户授予您的应用程序访问使用情况统计数据的权限。里程数可能会有所不同。

查看MediaContorler类(棒棒糖中的新功能,可在旧版本的可比性库中找到)

有两种方法看起来很有趣:

getPackageName应该返回当前会话包名称:

getSessionActivity为您提供了一个PendingEvent,其中包含一个要启动的活动(如果提供了活动),您也可以从中获取包


与您的音频侦听器和用于手机状态的广播接收器一起使用,以检测手机当前是否正在鸣响。您可以使用此功能,以获得比当前更细粒度的检测。正如特雷弗·卡罗瑟斯(Trevor Carothers)在上文中指出的那样,无法获得具有音频焦点的通用应用程序。

您可以使用
dumpsys audio
查找使用音频焦点的用户。此外,您还可以查看
dumpsys media\u会话的结果


而且,如果您想找到播放音乐的人,可以选择
dumpsys media.audio\u flinger
。对于我自己,我切换到这个命令。

只是大声思考。。。如何获取当前运行任务的顶部?当然,刚刚获得音频焦点的应用程序在那里的排名肯定很高。仅供参考,getRecentTasks()在Android L中受到了严格限制。这似乎是一种错误的方法,即Android不想向应用程序公开的内容,可能是出于安全原因。也许有更好的方法,如果你确实找到了应用程序名,你会怎么做?如果你只瞄准棒棒糖,他可能能够截获媒体通知,并以这种方式获得软件包。感谢你提供的信息,这一切确实很有用。我真的很忙的工作和一些其他的事情,以回到这个线程。
MediaFocusControl
是我以前深入研究过的东西,但我不得不回到它来刷新我的思维。我调查了
UsageStats
,根据@JohanShogun的建议,我找到了一个迄今为止效果良好的有效解决方案。再次感谢你的帮助,我很感激!真棒,我从来没有真正使用过UsageStats,很高兴它们有实际用途。我认为当用户仅通过通知控制播放时,不可能获得统计数据。我发现你的帖子非常有趣,它让我想起了
MediaController
,这确实是我可以使用的。我使用了
UsageStats
(@Trevor Carothers解决方案)和
MediaController
来找到一个解决方案,到目前为止似乎还可以正常工作。再次感谢你,我感谢你的帮助和时间
MediaController
仅显示我的应用程序的程序包名称和活动好的,我已经通过使用
NotificationListenerService
并在方法
onNotificationPosted(通知:StatusBarNotification)
中读取额外的通知完成了此操作。但是
getPackageName
是无用的,
getSessionActivity
总是
null
因为meIt需要
android.permission.DUMP
具有系统保护级别