当前位置: 首页 > 知识库问答 >
问题:

使用MediaPlayer和AudioManager时,耳机和扬声器电话之间的切换不起作用

濮佑运
2023-03-14

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

我尝试了这些解决方案(如下面的代码所示),但都不起作用:

  1. 按下按钮即可在听筒和免提电话之间切换
  2. 音频管理器扬声器无法正常工作

以下是我在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个答案

宇文鸣
2023-03-14

更换音频管理器

    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
        }
 类似资料:
  • 我想使用扬声器进行音频输出,同时使用耳机插孔进行不同的音频输出/输入。这可能吗?

  • 我试图让用户能够在我的应用程序中切换音频输出,我可以使用AVAudioSession在扬声器和背部之间切换,但我找不到在连接的蓝牙设备和耳机之间切换的方法,以任何顺序。 谢谢你的帮助。

  • 我正在尝试在通话时启用扬声器: 我试图在音频管理器之后检查扬声器,并通过询问来获得扬声器仍然未打开 在我的日志中,我可以看到一些我无法理解的错误: 我在论坛中找不到任何关于这个错误的信息。 在设备上不起作用:中兴Z981,华为p9,我已经尝试过了,被授予。

  • 我试图通过在扬声器和耳机之间切换按钮来播放音频。问题是,我试图将音频默认为从耳机播放,但没有结果。然后,当我按下按钮切换到扬声器时,仍然没有音频播放。我从本地原始文件播放。 我在显明书中也有android.permission.MODIFY_AUDIO_SETTINGS。 以下是我的代码: 以下是我设置 MediaPlayer 的方式:

  • 我有一个语音聊天应用程序,它工作得很好。目前,我正在尝试使该应用程序支持蓝牙耳机,以防任何连接。我需要处理两种情况: 蓝牙耳机在通话开始前已连接 蓝牙耳机在通话过程中连接到设备 对于第一种情况,应用程序应自动开始使用耳机作为其默认输入/输出音频设备。另一方面,应用程序在耳机连接到设备后,应从当前输入/输出音频设备切换到蓝牙耳机。 我使用以下代码成功地处理了第一个案例: 至于第二种情况,我创建了一个

  • 我想用插入式耳机通过扬声器播放音频文件。 但我得到了 IllegalStateException 有什么想法可以解决这个问题吗?