首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android :强制音频路由

Android :强制音频路由
EN

Stack Overflow用户
提问于 2015-04-30 13:28:08
回答 1查看 8.3K关注 0票数 2

我想改变我的Android应用程序的声音设备输出。耳机插上时,我想用电话的扬声器。

我尝试过在setSpeakerphoneOn中使用AudioManager类audioManager.setSpeakerphoneOn(true);audioManager.setMode(AudioManager.MODE_IN_CALL);,但是我不想设置MODE_IN_CALL!我想留在MODE_NORMAL。

我搜索了AudioSystem类,并找到了一个名为"SoundAbout“的应用程序。您可以为媒体音频选择扬声器,模式保持在正常状态。

因此,我尝试了setDeviceConnectionState in AudioSystem,将DEVICE_OUT_WIRED_HEADPHONE设置为0,但它不起作用。当我检查DEVICE_OUT_WIRED_HEADPHONE的状态时,它总是设置为1(可用),我不能通过扬声器播放声音。

如何将DEVICE_OUT_WIRED_HEADPHONE设置为0或通过扬声器播放声音而不使用MODE_IN_CALL?

感谢并为我糟糕的英语道歉!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 09:55:21

我试了一下,这对我的案子有用:

代码语言:javascript
复制
class AudioSystem {

private static final int REFLECTION_ERROR = -999;

private static final String DEVICE_OUT_SPEAKER          = "DEVICE_OUT_SPEAKER";
private static final String DEVICE_OUT_EARPIECE         = "DEVICE_OUT_EARPIECE";
private static final String DEVICE_OUT_WIRED_HEADPHONE  = "DEVICE_OUT_WIRED_HEADPHONE";


Class<?> mAudioSystem;

protected AudioSystem() {

    try {
        mAudioSystem = Class.forName("android.media.AudioSystem");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

private int getConstantValue(String s) {

    try {
        return ((Integer)mAudioSystem.getDeclaredField(s).get(int.class)).intValue();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return REFLECTION_ERROR;

}


private int setDeviceConnectionState(int i, int j, String s) {

    try {
        return (Integer) mAudioSystem.getMethod("setDeviceConnectionState", int.class, int.class, String.class).invoke(mAudioSystem, i, j, s);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return REFLECTION_ERROR;
}

private int setDeviceConnectionState(String deviceName, Boolean state) {
    return setDeviceConnectionState(getConstantValue(deviceName), (state ? 1 : 0), "");
}

private void forceWiredHeadphonesMedia() {
    setDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE, true);
    setDeviceConnectionState(DEVICE_OUT_SPEAKER, false);
}


private void forceSpeakerMedia() {
    setDeviceConnectionState(DEVICE_OUT_SPEAKER, true);
    setDeviceConnectionState(DEVICE_OUT_EARPIECE, true);
    setDeviceConnectionState(DEVICE_OUT_WIRED_HEADPHONE, false);
    setDeviceConnectionState(DEVICE_OUT_SPEAKER, true);
}

public void setSpeakerOn(Boolean state) {
    if (state) {
        forceSpeakerMedia();
    } else {
        forceWiredHeadphonesMedia();
    }
}

}

我使用setSpeakerOn(true)禁用有线耳机。

限制:AudioManager.isWiredHeadsetOn()返回false,甚至连耳机都插上了。

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

https://stackoverflow.com/questions/29969030

复制
相关文章

相似问题

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