Android:强制音频路由

Android:强制音频路由,android,output,android-audiomanager,speaker,Android,Output,Android Audiomanager,Speaker,我想更改Android应用程序中的声音设备输出。我想在耳机插入时使用手机的扬声器 我曾尝试从AudioManager类AudioManager.setspeakerphone(true)中使用setspeakerphone与audioManager.setMode(audioManager.MODE_在_调用中)但我不想在通话中设置模式!我想保持正常状态 我搜索了AudioSystem类,找到了一个应用程序“SoundAbout”,它可以做到这一点。您可以为媒体音频选择扬声器,模式保持正常 因此

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

我曾尝试从AudioManager类
AudioManager.setspeakerphone(true)中使用setspeakerphone
audioManager.setMode(audioManager.MODE_在_调用中)但我不想在通话中设置模式!我想保持正常状态

我搜索了AudioSystem类,找到了一个应用程序“SoundAbout”,它可以做到这一点。您可以为媒体音频选择扬声器,模式保持正常


因此,我在AudioSystem中尝试了
设置设备连接状态
,将设备“输出”和“有线”耳机设置为0,但不起作用。当我检查设备\输出\有线\耳机的状态时,它总是设置为1(可用),我无法通过扬声器播放声音

如何将设备\u输出\u有线\u耳机设置为0或通过扬声器播放声音而不处于模式\u输入\u呼叫


谢谢,对不起,我的英语不好

我尝试了这个,它对我的案例有效:

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();
    }
}
类音频系统{
私有静态final int REFLECTION_ERROR=-999;
专用静态最终字符串设备\输出\扬声器=“设备\输出\扬声器”;
专用静态最终字符串设备\输出\耳机=“设备\输出\耳机”;
专用静态最终字符串设备\输出\有线\耳机=“设备\输出\有线\耳机”;
阶级制度;
受保护的音频系统(){
试一试{
mAudioSystem=Class.forName(“android.media.AudioSystem”);
}catch(classnotfounde异常){
e、 printStackTrace();
}
}
私有整型getConstantValue(字符串s){
试一试{
return((整数)mAudioSystem.getDeclaredField.get(int.class)).intValue();
}捕获(例外e){
e、 printStackTrace();
}
返回反射错误;
}
私有int setDeviceConnectionState(int i、int j、字符串s){
试一试{
返回(整数)mAudioSystem.getMethod(“setDeviceConnectionState”,int.class,int.class,String.class).invoke(mAudioSystem,i,j,s);
}捕获(例外e){
e、 printStackTrace();
}
返回反射错误;
}
私有int setDeviceConnectionState(字符串deviceName,布尔状态){
返回setDeviceConnectionState(getConstantValue(deviceName),(状态?1:0),“”);
}
私有void forceWiredHeadphonesMedia(){
设置设备连接状态(设备输出有线耳机,正确);
设置设备连接状态(设备输出扬声器,错误);
}
私有无效强制执行器{
设置设备连接状态(设备输出扬声器,真);
设置设备连接状态(设备输出耳机,真);
设置设备连接状态(设备输出有线耳机,错误);
设置设备连接状态(设备输出扬声器,真);
}
公共状态(布尔状态){
如果(州){
forceSpeakerMedia();
}否则{
forceWiredHeadphonesMedia();
}
}
}

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


限制:
AudioManager.isWiredHeadsetOn()
即使耳机已插好,也返回false。

您能告诉我如何使用您的
AudioSystem
类吗@Mattt1438
setDeviceConnectionState
在Android 10及以上版本上似乎不起作用,记录了以下错误:
AudioSystem JNI:Android\u media\u AudioSystem\u setDeviceConnectionState的命令失败
。在最新的SDK版本上有其他选择吗?