音频管理器扬声器不工作

问题描述 投票:0回答:6

我正在尝试在通话时启用扬声器:

final AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setSpeakerphoneOn(true);

我尝试在

setSpeakerphoneOn()
音频管理器之后进行检查,并通过询问
isSpeakerphoneOn()

得知扬声器仍未打开
audioManager.isSpeakerphoneOn();

在我的日志中我可以看到一些我无法理解的错误:

E/AudioManager: Don't setBluetoothScoOn-PackageName: com.myapp.app  on = false
E/AudioManager: Don't setSpeakerphoneOn-PackageName: com.myapp.app  on = true

我在论坛中找不到有关此错误的任何信息。

不适用于设备:中兴Z981,华为p9,我已经尝试过this,并且

android.permission.MODIFY_AUDIO_SETTINGS
被授予。

android performance android-audiomanager android-phone-call
6个回答
14
投票

请阅读 Android 开发者文章

https://developer.android.com/reference/android/media/AudioManager.html

解释清楚

您需要在清单中设置权限:MODIFY_AUDIO_SETTINGS

在清单中添加此行

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

4
投票

我发现

setMode()
(当前模式)在
setSpeakerphoneOn()
之前修复了logcat上的错误:

AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE); 
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

2
投票

1.

setSpeakerphoneOn()
仅适用于
setMode(AudioManager.MDOE_IN_CALL);


1
投票

如果您的设备恰好在 Android 10 或更高版本上运行,则 Android 版本可能是原因。

自 android 10 起,google 已弃用 AudioManager.setSpeakerphoneOn api。

查看此内容以供参考,如果您希望恢复此 api,可以对该问题进行投票:https://issuetracker.google.com/issues/141889136

如果您使用

Intent.ACTION_CALL
拨打电话,您仍然可以选择:

intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true);

0
投票

唯一对我有用的是设置

audioManager.setMode(AudioManager.MODE_RINGTONE | AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);

没有 AudioManager.MODE_RINGTONE 它不起作用..

感谢这篇文章


-1
投票

如果是 VoIP 应用程序(自我管理呼叫),如果您想将音频设置为扬声器,您需要添加以下 2 件事

  1. audioManager.setCommunicationDevice(AudioDeviceInfo); //AudioDeviceInfo.TYPE_BUILTIN_SPEAKER

  2. connection.setAudioRoute(CallAudioState.ROUTE_SPEAKER);
    里面 <T 扩展 android.telecom.ConnectionService> 类(ConnectionService 类)

     private void turnSpeakerOn(boolean turnOn, AudioManager 
     audioManager) {
        if (turnOn) {
           if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
              setAudioDevice(audioManager, 
              AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);
           } else {
              audioManager.setSpeakerphoneOn(true);
           }
    
       sendSetAudioRouteLocalBroadcast(MyConstants.ROUTE_SPEAKER);
     } else {
       // OFF
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
         audioManager.clearCommunicationDevice();
       } else {
         audioManager.setSpeakerphoneOn(false);
       }
     }
    

}

  private static void setAudioDevice(AudioManager audioManager, int 
  audioType) {
      List<AudioDeviceInfo> audioDevices = 
      audioManager.getAvailableCommunicationDevices();
      for (AudioDeviceInfo device : audioDevices) {
      if (device.getType() == audioType) {
         audioManager.setCommunicationDevice(device);
         break;
      }
    }
  }

  

[2] 内部连接类监听本地广播,在扬声器按钮上按下操作

// 公共类 MyConnectionService 扩展 ConnectionService

        private final BroadcastReceiver audioStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (intent.getExtras() != null) {
            Connection connection = myConnection; //android.telecom.Connection class
            if (connection!= null) {
                connection.setAudioRoute(CallAudioState.ROUTE_SPEAKER);
            }
        }
    }
};


  
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.