安卓:强制音频路由路由、音频

2023-09-07 17:47:15 作者:殇の侞茈綄羙

我想改变音频设备的输出在我的Andr​​oid应用程序。我想用手机的扬声器,当耳机插入。

I would like to change the sound device output in my Android app. I want to use the speaker of the phone when the headset plugged.

我试图用setSpeakerphoneOn从AudioManager类 audioManager.setSpeakerphoneOn(真); audioManager.setMode(AudioManager.MODE_IN_CALL); ,但我不想设置MODE_IN_CALL!我想留在MODE_NORMAL。

I've tried to use setSpeakerphoneOn from AudioManager classaudioManager.setSpeakerphoneOn(true); with audioManager.setMode(AudioManager.MODE_IN_CALL); but I don't want to set the MODE_IN_CALL ! I want to stay in MODE_NORMAL.

我有搜索周围的AudioSystem类,我已经找到了一个应用程序的SOUNDabout,这做那。您可以选择扬声器媒体音频和方式停留在师范大学。

I've search around the AudioSystem class and I've found an application, "SoundAbout", which do that. You can choose the speaker for media audio and the mode stays in NORMAL.

所以,我已经试过 setDeviceConnectionState 在AudioSystem设置DEVICE_OUT_WIRED_HEADPHONE为0,但它不工作。当我检查DEVICE_OUT_WIRED_HEADPHONE的状态,它总是在1(可选)设置,我无法通过扬声器播放声音。

So I've tried setDeviceConnectionState in AudioSystem to set the DEVICE_OUT_WIRED_HEADPHONE to 0 but it doesn't work. When I check the status of DEVICE_OUT_WIRED_HEADPHONE, it's always set in 1 (AVAILABLE) and I can't play sound through the speaker.

我如何设置DEVICE_OUT_WIRED_HEADPHONE为0或播放通过扬声器的声音不会在MODE_IN_CALL是?

How can I set DEVICE_OUT_WIRED_HEADPHONE to 0 or play sound through speaker without being in MODE_IN_CALL?

感谢的对不起我的英文不好!

Thank's and sorry for my bad english !

推荐答案

我尝试这样做,它的工作对我的情况:

I try this and it's working for my case :

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(真)禁用有线耳机。

限制: AudioManager.isWiredHeadsetOn()返回false连耳机插入

Limit : AudioManager.isWiredHeadsetOn() return false even the headset is plugged.