如何在连接耳机时将默认音频路由到耳机?

时间:2016-07-19 14:44:39

标签: android android-audiomanager

我正在开发一款应用程序,我们只需将耳机插孔用作按钮。

要求:连接耳机时通过耳机播放默认音频(通话)(无需通过耳机播放音频)

有许多通过扬声器和耳机以及蓝牙耳机路由音频的示例,但如果连接耳机,则无需通过设备的耳机扬声器传送音频。 我已经尝试了很多,有些链接是

Android : Force audio routing(在我的方案中不起作用)

我检查过SoundAbout(https://play.google.com/store/apps/details?id=com.woodslink.android.wiredheadphoneroutingfix&hl=en) 应用程序,它将音频路由到各种端口,如耳机,扬声器和耳机。

如果连接了耳机,我的扬声器音频: 这是我的代码

if (Build.VERSION.SDK_INT >= 21) {
            ForegroundService.audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
            ForegroundService.audioManager.setSpeakerphoneOn(true);
            SplashScreen.preferences.edit().putBoolean("isKey", true).commit();
        } else {
            Class audioSystemClass = null;
            try {
                audioSystemClass = Class.forName("android.media.AudioSystem");
                Method setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
                setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }


            SplashScreen.preferences.edit().putBoolean("isKey", true).commit();
            ForegroundService.audioManager.setSpeakerphoneOn(true);
        }

1 个答案:

答案 0 :(得分:3)

耳机从不用于Android中的媒体,只有在手机处于“通话”或“通讯”(VoIP)状态时才能使用。

我猜您注意到没有“FORCE_EARPIECE”常量,因此无法在调用setForceUse时指定。

此外,耳机在呼叫的输出设备选择中具有最低优先级,因此如果手机连接了任何(并且在您的情况下有假耳机),则该设备将是选中(见https://android.googlesource.com/platform/frameworks/av/+/322b4d2/services/audiopolicy/enginedefault/src/Engine.cpp#381)。

很抱歉,似乎无法实现您的目标。

<强>更新

在SoundAbout强制使用媒体耳机时检查media.audio_policy状态后,我发现了此应用使用的以下技巧:

  1. 它调用AudioSystem.setPhoneState(MODE_IN_COMMUNICATION)来强制执行“通信”电话状态(通常用于VoIP呼叫)。

  2. 如果连接了耳机(或耳机),为了防止由于更高的优先级将声音路由到它,应用程序会呼叫AudioSystem.setDeviceConnectionState(DEVICE_OUT_WIRED_HEADSET, DEVICE_STATE_UNAVAILABLE, ...)以诱使音频管理器认为没有耳机。

  3. 这些都是黑客攻击,需要应用程序密切监视手机状态。它也不会一直有效。

    另一个缺点是使用耳机禁用片上音频解压缩,因此电池使用率更高。

    一般情况下,我不建议使用这些技术。