首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检测Android设备上是否缺少耳机(仅限免持话筒)

检测Android设备上是否缺少耳机(仅限免持话筒)
EN

Stack Overflow用户
提问于 2011-08-04 22:18:45
回答 4查看 2.8K关注 0票数 17

我有一个应用程序,当在电话上使用时,它会显示一个免持话筒切换按钮。切换开关可在电话的耳机和免持话筒之间切换音频路由。然而,当应用程序在平板电脑(或任何没有耳机的设备)上运行时,我想取消切换,因为所有的音频都是通过免提电话发送的。

理想情况下,我希望使用某种isEarpiecePresent()调用,或者可能检查某个配置对象上的标志来查找此信息,但我在应用程序接口中找不到任何此类信息。

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

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

EN

回答 4

Stack Overflow用户

发布于 2012-09-20 16:22:33

正如您现在可能知道的,这不能使用当前的Android API来完成。

音频硬件接口是专有的,即由制造商为其硬件编写的,并且必须支持Android系统的某些调用,以使其与使用Android SDK开发的应用程序兼容。

即使您找到了一种方法来解决缺少对一种设备的API支持的问题,这可能并不是在所有设备上都有效。您的AudioManager.setSpeakerphoneOn(false)示例可能非常适用于设备,因为这完全取决于音频硬件接口是如何编写的。我的假设是,如果没有耳机,大多数平板电脑都会对耳机和扬声器的音频路由进行同样的处理。

如果你想查看Nexus7的音频硬件接口代码,it's here

票数 1
EN

Stack Overflow用户

发布于 2022-02-11 09:02:33

从Android S/12 (API 31)开始,我们有了检查内置耳机状态的新方法。全面的复制-粘贴方法如下,在较旧的系统版本中,它使用@milosmns answer中的反射(谢谢!)

代码语言:javascript
复制
private static Boolean hasEarpiece = null;

public static boolean hasEarpiece(Context context) {
    if (hasEarpiece != null) return hasEarpiece;

    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

    if (Build.VERSION.SDK_INT >= 31) {
        List<AudioDeviceInfo> devices = audioManager.getAvailableCommunicationDevices();
        for (AudioDeviceInfo device : devices) {
            if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE) {
                hasEarpiece = true;
                break;
            }
        }
        if (hasEarpiece == null) {
            // just for safety
            AudioDeviceInfo currDevice = audioManager.getCommunicationDevice();
            hasEarpiece = currDevice != null &&
                    currDevice.getType() == AudioDeviceInfo.TYPE_BUILTIN_EARPIECE;
        }
        Log.i("EarpieceBuiltInChecker", "hasEarpiece detected:%s", hasEarpiece);
        return hasEarpiece;
    }

    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(audioManager, AudioManager.STREAM_VOICE_CALL);

        hasEarpiece = (bitmaskResult & earpieceFlag) == earpieceFlag;
        Log.i("EarpieceBuiltInChecker", "hasEarpiece detected:" + hasEarpiece);
    } catch (Throwable error) {
        hasEarpiece = false;
        Log.i("EarpieceBuiltInChecker", "hasEarpiece detection FAILED!");
    }

    return hasEarpiece;
}

我的流是AudioManager.STREAM_VOICE_CALL类型(如果适用)

票数 0
EN

Stack Overflow用户

发布于 2012-09-20 18:39:37

代码语言:javascript
复制
public boolean isEarPieceConnected() {
        AudioManager audio = (AudioManager) this
                .getSystemService(Context.AUDIO_SERVICE);
        if (audio.isWiredHeadsetOn()) {
            Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
            return true;
        } else {
            Toast.makeText(this, "Not Connected", Toast.LENGTH_SHORT).show();
            return false;
        }
    }

您还可以检查audio.isSpeakerphoneOn()

如果我把你的问题解决了,我希望这能行得通。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6943068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档