2

我想更改我的 Android 应用程序中的声音设备输出。我想在耳机插入时使用手机的扬声器。

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

我搜索了 AudioSystem 类,发现了一个应用程序“SoundAbout”,它可以做到这一点。您可以选择媒体音频的扬声器,并且模式保持在 NORMAL。

所以我尝试setDeviceConnectionState在 AudioSystem 中将 DEVICE_OUT_WIRED_HEADPHONE 设置为 0,但它不起作用。当我检查 DEVICE_OUT_WIRED_HEADPHONE 的状态时,它始终设置为 1 (AVAILABLE),我无法通过扬声器播放声音。

如何在不处于 MODE_IN_CALL 的情况下将 DEVICE_OUT_WIRED_HEADPHONE 设置为 0 或通过扬声器播放声音?

感谢和抱歉我的英语不好!

4

1 回答 1

7

我试试这个,它适用于我的情况:

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。

于 2015-05-05T09:55:21.317 回答