android - 检测 Android 设备上缺少听筒(仅限免提)

标签 android

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

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

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

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

最佳答案

所以丑陋的部分是 - Google 忽略了这个问题。漂亮的部分是我设法实际检查了耳机,并且在 5/5 设备上它运行良好(在 5.0、5.1、6.0 上测试)。再一次,丑陋的部分是,这只是糟糕的、不稳定的代码,而且它很hacky,但在他们发布更好的 API 之前,我无法做太多事情......

这里是hack:

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;
}

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

关于android - 检测 Android 设备上缺少听筒(仅限免提),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6943068/

相关文章:

java.lang.ClassCastException 适配器转换为 Activity

java - 为什么在调用 WriteResult 之前,batch.commit() 不起作用?

android - StopService 或删除处理程序回调(电池消耗)

android - 文本不会使用 android.support.v7.widget.GridLayout 自动换行

java - android searchview setOnActionExpandListener on Honeycomb 3.2

android - 在 "None"中设置屏幕锁定设置

android - 直接在布局 xml 中填充微调器

android - 无法从 Firebase 数据库读取数据

java - 解析数据时出错 java.lang.IllegalStateException : Not on the main thread when populating Google map

java - 无法与库项目和 JNI 一起运行 android 应用程序