Android : 强制音频路由
Android : Force audio routing
我想更改 Android 应用程序中的声音设备输出。我想在插上耳机时使用 phone 的扬声器。
我尝试将 AudioManager classaudioManager.setSpeakerphoneOn(true);
中的 setSpeakerphoneOn 与 audioManager.setMode(AudioManager.MODE_IN_CALL);
一起使用,但我不想设置 MODE_IN_CALL !我想留在 MODE_NORMAL.
我搜索了音频系统 class,找到了一个应用程序 "SoundAbout",它可以执行此操作。您可以选择媒体音频的扬声器,模式保持正常。
所以我在 AudioSystem 中尝试 setDeviceConnectionState
将 DEVICE_OUT_WIRED_HEADPHONE 设置为 0 但它不起作用。当我查看 DEVICE_OUT_WIRED_HEADPHONE 的状态时,它始终设置为 1 (AVAILABLE),我无法通过扬声器播放声音。
如何在不进入 MODE_IN_CALL 的情况下将 DEVICE_OUT_WIRED_HEADPHONE 设置为 0 或通过扬声器播放声音?
谢谢,对不起我的英语不好!
我试过了,它对我的情况很有效:
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)
禁用有线耳机。
Limit : AudioManager.isWiredHeadsetOn()
return 即使耳机插入也是错误的。
我想更改 Android 应用程序中的声音设备输出。我想在插上耳机时使用 phone 的扬声器。
我尝试将 AudioManager classaudioManager.setSpeakerphoneOn(true);
中的 setSpeakerphoneOn 与 audioManager.setMode(AudioManager.MODE_IN_CALL);
一起使用,但我不想设置 MODE_IN_CALL !我想留在 MODE_NORMAL.
我搜索了音频系统 class,找到了一个应用程序 "SoundAbout",它可以执行此操作。您可以选择媒体音频的扬声器,模式保持正常。
所以我在 AudioSystem 中尝试 setDeviceConnectionState
将 DEVICE_OUT_WIRED_HEADPHONE 设置为 0 但它不起作用。当我查看 DEVICE_OUT_WIRED_HEADPHONE 的状态时,它始终设置为 1 (AVAILABLE),我无法通过扬声器播放声音。
如何在不进入 MODE_IN_CALL 的情况下将 DEVICE_OUT_WIRED_HEADPHONE 设置为 0 或通过扬声器播放声音?
谢谢,对不起我的英语不好!
我试过了,它对我的情况很有效:
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)
禁用有线耳机。
Limit : AudioManager.isWiredHeadsetOn()
return 即使耳机插入也是错误的。