【问题标题】:Toggle between earphone and speakerphone not working, with MediaPlayer and AudioManager使用 MediaPlayer 和 AudioManager 在耳机和扬声器之间切换不起作用
【发布时间】:2019-06-21 08:03:20
【问题描述】:

我正在使用 MediaPlayer 通过AsyncTask 播放音频,并使用AudioManager 设置流。在特定按钮按下时,我调用AudioManagersetSpeakerPhoneOn() 进行切换,但它不会切换到耳机。我的音频总是通过主扬声器响起。

我尝试了这些解决方案(如下面的代码所示),但都没有奏效:

  1. Switching between earpiece and speakerphone on button press
  2. Audiomanager Speaker not working

这是我在onViewCreated 中初始化AudioManager 的代码:

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);
            }
        });

【问题讨论】:

    标签: android android-mediaplayer android-audiomanager


    【解决方案1】:

    更改 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
            }
    

    【讨论】:

    • 我在这里读到 MODE_IN_CALL 确保音频将在某些设备上永远播放stackoverflow.com/a/15255477/5719908
    • 我知道在 AudioManger 上设置它应该可以工作。该链接是关于在 MediaPlayer 实例上设置它的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多