Переключение между наушником и громкой связью не работает, с MediaPlayer и AudioManager - PullRequest
0 голосов
/ 21 июня 2019

Я использую MediaPlayer для воспроизведения звука через AsyncTask, а AudioManager для настройки потока. При нажатии определенной кнопки я вызываю AudioManager setSpeakerPhoneOn() для переключения, но он не переключается на динамик уха. Мой звук всегда звучит через основной динамик.

Я пробовал эти решения (как видно из кода ниже), но ни одно из них не сработало:

  1. Переключение между наушником и громкой связью по кнопке нажмите
  2. Динамик Audiomanager не работает

Вот мой код для инициализации AudioManager в onViewCreated:

try {
            audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
            audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
            audioManager.setSpeakerphoneOn(loudOn);
            // loudOn is defined globally, and initialized to false
        }

Это функция воспроизведения звука, которая использует AsyncTask:

static private void playCall(final Context context, final String[] contactParts)
    {
        final MediaPlayer mediaPlayer = new MediaPlayer();
        new AsyncTask<Void,Void,Boolean>() {
            @Override
            protected Boolean doInBackground(Void... voids) {
                try {

                    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mp.start();
                        }
                    });

                    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            mp.reset();
                            mp.release();
                        }
                    });

                    int audioFile_R_id = //get audio file id
                    try {
                        AssetFileDescriptor afd = context.getResources().openRawResourceFd(audioFile_R_id);
                        if (afd == null) return false;
                        mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                        afd.close();

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                            mediaPlayer.setAudioAttributes(new AudioAttributes.Builder()
                                    .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                                    .build());

                        } else {
                            //deprecated in API 26
                            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                        }

                        mediaPlayer.prepare();
                        return true;
                    }
                    catch (Resources.NotFoundException rnf)
                    {
                        rnf.printStackTrace();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return false;
            }

            @Override
            protected void onPostExecute(Boolean prepared) {
                if (prepared) {
                    mediaPlayer.start();
                }
            }
        }.execute();
    }

И это код кнопки, который пытается переключиться:

loudFAB.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                loudOn = !loudOn;
                audioManager.setSpeakerphoneOn(loudOn);
            }
        });

1 Ответ

0 голосов
/ 21 июня 2019

Изменить AudioManager

    try {
            audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
            audioManager.setMode(AudioManager.MODE_IN_CALL);
            audioManager.setSpeakerphoneOn(loudOn);
            // loudOn is defined globally, and initialized to false
        }
...