我正在尝试在通话时启用扬声器:
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 开发者文章
https://developer.android.com/reference/android/media/AudioManager.html
解释清楚
您需要在清单中设置权限:MODIFY_AUDIO_SETTINGS
在清单中添加此行
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
我发现
setMode()
(当前模式)在setSpeakerphoneOn()
之前修复了logcat上的错误:
AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
1.
setSpeakerphoneOn()
仅适用于 setMode(AudioManager.MDOE_IN_CALL);
如果您的设备恰好在 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);
唯一对我有用的是设置
audioManager.setMode(AudioManager.MODE_RINGTONE | AudioManager.MODE_IN_CALL);
audioManager.setSpeakerphoneOn(true);
没有 AudioManager.MODE_RINGTONE 它不起作用..
感谢这篇文章
如果是 VoIP 应用程序(自我管理呼叫),如果您想将音频设置为扬声器,您需要添加以下 2 件事
audioManager.setCommunicationDevice(AudioDeviceInfo); //AudioDeviceInfo.TYPE_BUILTIN_SPEAKER
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);
}
}
}
};