Как программно переключить вывод звука в android 10? - PullRequest
5 голосов
/ 26 марта 2020

Мой пример использования - у меня есть приложение, в котором пользователь может нажать кнопку, и оно будет переключаться между внешним динамиком и проводной гарнитурой / устройством Bluetooth. Если пользователь подключен к проводной гарнитуре или устройству наушников Bluetooth, я хочу переключить аудиовыход с этой проводной гарнитуры или Bluetooth на внешний динамик, а затем при повторном щелчке, чтобы возобновить вывод аудиосигнала с проводной гарнитуры / Bluetooth ,

Кто-нибудь знает, что это можно сделать в Android 10? Я попробовал следующий пример в этом посте , но он не всегда работает для случаев Bluetooth. Мой код выглядит следующим образом:

if (shouldEnableExternalSpeaker) {
     audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
     audioManager.isSpeakerphoneOn = true
     if (isBlueToothConnected) {
         audioManager.stopBluetoothScoOn()
     }
} else {
     if (isBlueToothConnected) {
         audioManager.startBluetoothSco()
     }

     audioManager.mode = AudioManager.NORMAL
     audioManager.isSpeakerphoneOn = false
}

У меня также есть необходимые разрешения на аудио пользователя:

<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Ответы [ 2 ]

4 голосов
/ 02 апреля 2020

Я думаю, вам следует разделить вашу обработку на 3 случая, воспроизводить звук через:

  1. внешнее устройство через Bluetooth
  2. проводная гарнитура / устройство
  3. динамик телефона

Результирующий код может выглядеть примерно так:

if(shouldEnableExternalSpeaker) {
    if(isBlueToothConnected) {
        // 1. case - bluetooth device
        mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        mAudioManager.startBluetoothSco();
        mAudioManager.setBluetoothScoOn(true);
    } else {
        // 2. case - wired device
        mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
        mAudioManager.stopBluetoothSco();
        mAudioManager.setBluetoothScoOn(false);
        mAudioManager.setSpeakerphoneOn(false);
    }
} else {
   // 3. case - phone speaker
   mAudioManager.setMode(AudioManager.MODE_NORMAL);
   mAudioManager.stopBluetoothSco();
   mAudioManager.setBluetoothScoOn(false);
   mAudioManager.setSpeakerphoneOn(true);
}

Несмотря на то, что я недавно не использовал AudioManager, это работало для меня в прошлом.

0 голосов
/ 04 апреля 2020

строк:

audioManager.isSpeakerphoneOn = true
audioManager.isSpeakerphoneOn = false

не будет работать. Вы должны использовать setMethods: case1 - blootooth

mAudioManager.startBluetoothSco(); // This method can be used by applications wanting to send and received audio to/from a bluetooth SCO headset while the phone is not in call. 
mAudioManager.setBluetoothScoOn(true); //set true to use bluetooth SCO for communications; false to not use bluetooth SCO for communications

case2 - проводной

mAudioManager.stopBluetoothSco(); // stop wainting to send recieve
mAudioManager.setBluetoothScoOn(false);// turn off bluetooth
mAudioManager.setSpeakerphoneOn(false); //set true to turn on speakerphone; false to turn it off

case3 - внутренний громкоговоритель

mAudioManager.stopBluetoothSco();
mAudioManager.setBluetoothScoOn(false);
mAudioManager.setSpeakerphoneOn(true);// turn on speaker phone

Вы можете автоматически выполнять следующие действия: следует:

public class BluetoothReceiver extends BroadcastReceiver {
    private AudioManager localAudioManager;
    private static final int STATE_DISCONNECTED  = 0x00000000;
    private static final String EXTRA_STATE = "android.bluetooth.headset.extra.STATE";
    private static final String TAG = "BluetoothReceiver";
    private static final String ACTION_BT_HEADSET_STATE_CHANGED  = "android.bluetooth.headset.action.STATE_CHANGED";
    private static final String ACTION_BT_HEADSET_FORCE_ON = "android.bluetooth.headset.action.FORCE_ON";
    private static final String ACTION_BT_HEADSET_FORCE_OFF = "android.bluetooth.headset.action.FORCE_OFF";

    @Override
    public void onReceive(final Context context, final Intent intent) {
        Log.i(TAG,"onReceive - BluetoothBroadcast");
        localAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
        final String action = intent.getAction();
        if (action.equals(ACTION_BT_HEADSET_STATE_CHANGED)) {
            final int extraData = intent.getIntExtra(EXTRA_STATE, STATE_DISCONNECTED);
            if (extraData == STATE_DISCONNECTED) {
                //no headset -> going other modes
                localAudioManager.setBluetoothScoOn(false);
                localAudioManager.stopBluetoothSco();
                localAudioManager.setMode(AudioManager.MODE_NORMAL);
                Log.i(TAG, "Bluetooth Headset Off " + localAudioManager.getMode());
                Log.i(TAG, "A2DP: " + localAudioManager.isBluetoothA2dpOn() + ". SCO: " + localAudioManager.isBluetoothScoAvailableOffCall());
            } else {            
                localAudioManager.setMode(0);
                localAudioManager.setBluetoothScoOn(true);
                localAudioManager.startBluetoothSco();
                localAudioManager.setMode(AudioManager.MODE_IN_CALL);
                Log.i(TAG, "Bluetooth Headset On " + localAudioManager.getMode());
                Log.i(TAG, "A2DP: " + localAudioManager.isBluetoothA2dpOn() + ". SCO: " + localAudioManager.isBluetoothScoAvailableOffCall());
            }
        }   

        if (action.equals(ACTION_BT_HEADSET_FORCE_ON)) {
            localAudioManager.setMode(0);
            localAudioManager.setBluetoothScoOn(true);
            localAudioManager.startBluetoothSco();
            localAudioManager.setMode(AudioManager.MODE_IN_CALL);
            Log.i(TAG, "Bluetooth Headset On " + localAudioManager.getMode());
            Log.i(TAG, "A2DP: " + localAudioManager.isBluetoothA2dpOn() + ". SCO: " + localAudioManager.isBluetoothScoAvailableOffCall());
        }

        if (action.equals(ACTION_BT_HEADSET_FORCE_OFF)) {
            localAudioManager.setBluetoothScoOn(false);
            localAudioManager.stopBluetoothSco();
            localAudioManager.setMode(AudioManager.MODE_NORMAL);
            Log.i(TAG, "Bluetooth Headset Off " + localAudioManager.getMode());
            Log.i(TAG, "A2DP: " + localAudioManager.isBluetoothA2dpOn() + ". SCO: " + localAudioManager.isBluetoothScoAvailableOffCall());
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...