应用程序不播放声音或访问蓝牙麦克风和耳机仅在扬声器中播放声音并使用扬声器 android 的麦克风

时间:2021-06-25 06:33:33

标签: java android kotlin bluetooth android-audiomanager

在我的应用中,我希望用户可以在蓝牙、耳机和扬声器中检查测试声音并在蓝牙、耳机和扬声器中检查麦克风

但测试声音仅在扬声器中播放,有时在耳机中播放(即使音频管理器连接到蓝牙或耳机,主要在扬声器中播放)并且即使音频管理器连接到蓝牙或耳机,麦克风也始终检测扬声器.

这里是audioUtil

public class AudioSourceUtil {
    public static String TAG = "AudioSourceUtil";
    private static AudioManager audioManager;
    private static int getMode;
    private static int getRingerMode;
    @SuppressLint({"StaticFieldLeak"})
    private static AudioSourceUtil sAudioSourceUtil;

    @SuppressLint("WrongConstant")
    public static AudioSourceUtil getAudioSourceUtil(Context context) {
        if (sAudioSourceUtil == null) {
            sAudioSourceUtil = new AudioSourceUtil();
            audioManager = (AudioManager) context.getSystemService(MediaStreamTrack.AUDIO_TRACK_KIND);
            getMode = audioManager.getMode();
            getRingerMode = audioManager.getRingerMode();
        }
        return sAudioSourceUtil;
    }

    public AudioManager getAudioManager() {
        return audioManager;
    }


    public void reset() {
        AudioManager audioManager2 = audioManager;
        if (audioManager2 != null) {
            //audioManager2.setMode(AudioManager.MODE_IN_COMMUNICATION);
            audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
            if (BluetoothUtility.isIsBluetoothConnected() && audioManager.isBluetoothScoOn()) {
                audioManager.stopBluetoothSco();
                audioManager.setBluetoothScoOn(false);
            }
        }
    }

    public void connectSpeaker() {
        reset();
        audioManager.setWiredHeadsetOn(false);
        audioManager.setSpeakerphoneOn(true);
    }

    public void disconnectSpeaker() {
        reset();
        audioManager.setWiredHeadsetOn(false);
        audioManager.setSpeakerphoneOn(false);
    }

    public void connectHeadset() {
        reset();
        audioManager.setSpeakerphoneOn(false);
        audioManager.setWiredHeadsetOn(true);
    }

    public void connectBluetooth() {
        if (BluetoothUtility.isIsBluetoothConnected() && !audioManager.isBluetoothScoOn()) {
            audioManager.startBluetoothSco();
            audioManager.setBluetoothScoOn(true);
            //audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
            audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        }
    }

    public void setAudioManagerToPreviousState() {
        if (audioManager != null) {
            reset();
            audioManager.setMode(getMode);
            audioManager.setRingerMode(getRingerMode);
            audioManager.abandonAudioFocus((AudioManager.OnAudioFocusChangeListener) null);
            audioManager.setMicrophoneMute(false);
            audioManager = null;
            sAudioSourceUtil = null;
        }
    }
}

如果用户选择蓝牙,则

toggleBluetooth(true)


  fun toggleBluetooth(z: Boolean) {
        if (z) {
            if (AudioSourceUtil.getAudioSourceUtil(this.context).getAudioManager() != null) {
                AudioSourceUtil.getAudioSourceUtil(this.context).connectBluetooth()
                return
            }
        } else if (AudioSourceUtil.getAudioSourceUtil(this.context).getAudioManager() != null) {
           
            AudioSourceUtil.getAudioSourceUtil(this.context).connectSpeaker()
        } else {
           
        }
    }

如果用户选择了耳机

toggleHeadset(true)

fun toggleHeadset(z: Boolean) {
        if (z) {
            if (AudioSourceUtil.getAudioSourceUtil(this.context).getAudioManager() != null) {
                AudioSourceUtil.getAudioSourceUtil(this.context).connectHeadset()
                return
            }
         
        } else if (AudioSourceUtil.getAudioSourceUtil(this.context).getAudioManager() != null) {
            AudioSourceUtil.getAudioSourceUtil(this.context).connectSpeaker()
        } else {
         
        }
    }

如果用户选择了扬声器

togglespeaker(true)

fun toggleSpeaker(z: Boolean) {
        if (z) {
            if (AudioSourceUtil.getAudioSourceUtil(this.context).getAudioManager() != null) {
                AudioSourceUtil.getAudioSourceUtil(this.context).connectSpeaker()
            } else {
               
            }
        } else if (AudioSourceUtil.getAudioSourceUtil(this.context).getAudioManager() != null) {
        
            AudioSourceUtil.getAudioSourceUtil(this.context).disconnectSpeaker()
        } else {
           
        }
    }

我的问题是当用户选择蓝牙或耳机时,音频和麦克风仍连接到扬声器并在扬声器和用户扬声器麦克风中播放音频

请提出建议

0 个答案:

没有答案