检索具有音频焦点更改的应用程序名称
Retrieving the application name that has audio focus change
我似乎找不到任何与找出哪个应用程序获得音频焦点相关的信息。我可以从我的应用程序中正确地确定它是什么类型的焦点变化,但不能从任何其他应用程序中确定。有什么方法可以确定哪个应用程序获得了焦点?
"What am I wanting to do?"
我已经成功地录制了内部声音,无论是音乐还是语音。如果我当前正在录制无论来源如何的音频,我想确定哪个应用程序接管了焦点,以确定我的应用程序下一步需要做什么。
目前,我正在为我的应用程序使用 AudioManager.OnAudioFocusChangeListener,以便在焦点改变时停止录制内部声音,但我想要获得焦点的应用程序名称。
简答: 没有好的解决方案... Android 可能就是这么打算的。
解释:
查看源代码,AudioManager 没有 API's(甚至隐藏 APIs)来检查谁拥有音频焦点。 AudioManager 包装对 AudioService 的调用,它保存真实的音频状态。当 AudioManager 绑定到 AudioService 时,AudioService 通过它的存根公开的 API 也没有用于查询当前音频焦点的 API。因此,即使通过反射/系统级权限,您也无法获得所需的信息。
如果您对如何跟踪焦点变化感到好奇,可以查看MediaFocusControl whose instance is a member variable of AudioService here。
未经测试的 Hacky 启发式算法:
通过查看 UsageStats timestamps. Then once you have apps that were used within say ~500ms of you losing AudioFocus you can cross-check them against apps with Audio Permissions. You can follow this post 获取任何已安装应用程序的权限,您或许可以获得一些有用的信息。
这显然是一种启发式方法,可能需要进行一些调整。它还要求用户授予您的应用程序权限以访问使用情况统计信息。里程可能会有所不同。
查看 MediaContorller class(棒棒糖中的新功能,旧版本的可比性库中可用)。
有这两个方法看起来很有趣:
https://developer.android.com/reference/android/media/session/MediaController.html#getPackageName()
getPackageName 假设 returns 当前会话包名称:
http://androidxref.com/5.1.1_r6/xref/frameworks/base/media/java/android/media/session/MediaController.java#397
getSessionActivity 给你一个 PendingIntent 和一个 activity 开始(如果提供的话),你也可以在那里得到包。
与您的音频侦听器和 phone 状态的广播接收器一起使用,以检测 phone 当前是否正在响铃您可以使用它来获得更细粒度的检测比你现在拥有的。正如 Trevor Carothers 上面指出的那样,没有办法获得具有音频焦点的通用应用程序。
您可以使用 dumpsys audio
查找谁在使用音频焦点。而且,您还可以查看 dumpsys media_session
.
的结果
而且,如果你想找到谁在演奏音乐,你可以选择dumpsys media.audio_flinger
。对于我自己,我切换到这个命令。
我似乎找不到任何与找出哪个应用程序获得音频焦点相关的信息。我可以从我的应用程序中正确地确定它是什么类型的焦点变化,但不能从任何其他应用程序中确定。有什么方法可以确定哪个应用程序获得了焦点?
"What am I wanting to do?"
我已经成功地录制了内部声音,无论是音乐还是语音。如果我当前正在录制无论来源如何的音频,我想确定哪个应用程序接管了焦点,以确定我的应用程序下一步需要做什么。
目前,我正在为我的应用程序使用 AudioManager.OnAudioFocusChangeListener,以便在焦点改变时停止录制内部声音,但我想要获得焦点的应用程序名称。
简答: 没有好的解决方案... Android 可能就是这么打算的。
解释: 查看源代码,AudioManager 没有 API's(甚至隐藏 APIs)来检查谁拥有音频焦点。 AudioManager 包装对 AudioService 的调用,它保存真实的音频状态。当 AudioManager 绑定到 AudioService 时,AudioService 通过它的存根公开的 API 也没有用于查询当前音频焦点的 API。因此,即使通过反射/系统级权限,您也无法获得所需的信息。
如果您对如何跟踪焦点变化感到好奇,可以查看MediaFocusControl whose instance is a member variable of AudioService here。
未经测试的 Hacky 启发式算法: 通过查看 UsageStats timestamps. Then once you have apps that were used within say ~500ms of you losing AudioFocus you can cross-check them against apps with Audio Permissions. You can follow this post 获取任何已安装应用程序的权限,您或许可以获得一些有用的信息。
这显然是一种启发式方法,可能需要进行一些调整。它还要求用户授予您的应用程序权限以访问使用情况统计信息。里程可能会有所不同。
查看 MediaContorller class(棒棒糖中的新功能,旧版本的可比性库中可用)。
有这两个方法看起来很有趣:
https://developer.android.com/reference/android/media/session/MediaController.html#getPackageName()
getPackageName 假设 returns 当前会话包名称: http://androidxref.com/5.1.1_r6/xref/frameworks/base/media/java/android/media/session/MediaController.java#397
getSessionActivity 给你一个 PendingIntent 和一个 activity 开始(如果提供的话),你也可以在那里得到包。
与您的音频侦听器和 phone 状态的广播接收器一起使用,以检测 phone 当前是否正在响铃您可以使用它来获得更细粒度的检测比你现在拥有的。正如 Trevor Carothers 上面指出的那样,没有办法获得具有音频焦点的通用应用程序。
您可以使用 dumpsys audio
查找谁在使用音频焦点。而且,您还可以查看 dumpsys media_session
.
而且,如果你想找到谁在演奏音乐,你可以选择dumpsys media.audio_flinger
。对于我自己,我切换到这个命令。