检测Android设备上缺少耳机(仅扬声器)

Jos*_*osh 17 android

我有一个应用程序,当在手机上使用时会显示扬声器切换按钮.拨动开关切换手机耳机和扬声器之间的音频路由.但是,当应用程序在平板电脑(或任何没有耳机的设备)上运行时,我想删除切换按钮,因为所有音频都通过免提电话发送.

理想情况下,我想使用某种isEarpiecePresent()调用,或者在某些配置对象上检查一个标志来查找此信息,但我在API中找不到任何类型的那种.

我试图通过调用AudioManager.setSpeakerphoneOn(false),然后检查来解决这个问题AudioManager.isSpeakerphoneOn(),希望它仍然会返回true,我可以关闭它.false即使音频仍然通过扬声器路由,系统也会返回.

我目前正在考虑检查电话功能,即使这不完全适合.还有其他想法吗?

mil*_*mns 5

所以丑陋的部分是——谷歌忽视了这个问题。漂亮的部分是,我成功地对听筒进行了实际检查,并且在 5/5 设备上运行良好(在 5.0、5.1、6.0 上进行了测试)。再说一遍,丑陋的部分是,这只是糟糕的、不稳定的代码,而且很糟糕,但在他们发布更好的 API 之前,我无能为力。

这是黑客

private Boolean mHasEarpiece = null; // intentionally 'B' instead of 'b'

public boolean hasEarpiece() {
    if (mHasEarpiece != null) {
        return mHasEarpiece;
    }

    // not calculated yet, do it now
    try {
        Method method = AudioManager.class.getMethod("getDevicesForStream", Integer.TYPE);
        Field field = AudioManager.class.getField("DEVICE_OUT_EARPIECE");
        int earpieceFlag = field.getInt(null);
        int bitmaskResult = (int) method.invoke(mAudioManager, AudioManager.STREAM_VOICE_CALL);

        // check if masked by the earpiece flag
        if ((bitmaskResult & earpieceFlag) == earpieceFlag) {
            mHasEarpiece = Boolean.TRUE;
        } else {
            mHasEarpiece = Boolean.FALSE;
        }
    } catch (Throwable error) {
        Log.e(TAG, "Error while checking earpiece! ", error);
        mHasEarpiece = Boolean.FALSE;
    }

    return mHasEarpiece;
}
Run Code Online (Sandbox Code Playgroud)

如果您有更好的东西,我愿意进行改进编辑:)


Dan*_*n J 2

我对此进行了研究,不幸的是我找不到任何 API 支持来检测耳机是否存在。

我现在已向 Google 提出此问题作为功能请求:
http://code.google.com/p/android/issues/detail ?id=37623

如果您同意该功能,请点击 Google 问题页面底部的星星来投票!

许多用户提出了 Google Talk 不提供扬声器/耳机切换选项的问题,这可能表明缺少合适的 API...
http://code.google.com/p/android/issues/detail ?id=19221

作为解决方法,您可能希望在设备上隐藏该功能(所有这些方法都有缺点):

  • 那些拥有超大屏幕(即平板电脑)的人
  • 那些没有电话支持的人
  • 使用没有耳机的主要设备的可配置白/黑名单。

FTR,如果您使用此答案将音频路由到耳机,在 Xoom(OS 3.1)或 Samsung Galaxy Tab(OS 2.2)上运行该代码似乎不会产生任何负面影响 - 音频只是继续通过外部扬声器播放。我还没有机会测试是否有与蓝牙耳机的交互。