如何检测Android设备上是否缺少耳机?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (41)

我有一个应用程序,当在手机上使用时,会显示一个扬声器切换按钮。这个切换开关可以在手机的耳机和扬声器之间切换音频路由。然而,当应用程序运行在平板电脑(或任何没有耳机的设备)上时,我想删除切换键,因为所有音频都是通过扬声器传送的。

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

我试图通过打电话解决这个问题AudioManager.setSpeakerphoneOn(false),然后检查AudioManager.isSpeakerphoneOn(),希望它仍能返回true,而我可以关闭它。系统返回。false尽管音频仍在通过扬声器进行传输。

我目前正在考虑检查电话功能,尽管这不太合适。还有其他的想法吗?

提问于
用户回答回答于

所以丑陋的部分是 - 谷歌正在无视这个问题。漂亮的部分是,我设法实际检查耳机,并在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;
}
用户回答回答于

我研究过这一点,很不幸,我找不到任何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

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

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

扫码关注云+社区

领取腾讯云代金券