Android 在Oreo/Nougat中启用传出呼叫扬声器时出错

Android 在Oreo/Nougat中启用传出呼叫扬声器时出错,android,android-audiomanager,android-8.0-oreo,android-7.1-nougat,Android,Android Audiomanager,Android 8.0 Oreo,Android 7.1 Nougat,在拨出电话时,我需要打开扬声器,但下面抛出的异常是我使用的代码片段: audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_IN_CALL); if (!audioManager.isSpeakerphoneOn())

在拨出电话时,我需要打开扬声器,但下面抛出的异常是我使用的代码片段:

audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
                    audioManager.setMode(AudioManager.MODE_IN_CALL);
                    if (!audioManager.isSpeakerphoneOn())
                        audioManager.setSpeakerphoneOn(true);
                    audioManager.setMode(AudioManager.MODE_NORMAL);
它在低于6.0的设备上运行良好,但在8.0和7.0中不起作用

logcat:

01-22 13:38:19.887 25014-25014/com.tool.autoredialer D/AudioManager: PPD setMode mode = 2
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: dalvik.system.VMStack.getThreadStackTrace(Native Method)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: java.lang.Thread.getStackTrace(Thread.java:1536)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.media.AudioManager.setMode(AudioManager.java:1630)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.tool.autoredialer.services.CallVibratorAccessibilityService.handlVibrate(CallVibratorAccessibilityService.java:114)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.tool.autoredialer.services.CallVibratorAccessibilityService.onAccessibilityEvent(CallVibratorAccessibilityService.java:49)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent(AccessibilityService.java:1527)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1712)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.os.Handler.dispatchMessage(Handler.java:105)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.os.Looper.loop(Looper.java:164)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.app.ActivityThread.main(ActivityThread.java:6809)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: java.lang.reflect.Method.invoke(Native Method)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
01-22 13:38:19.888 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
01-22 13:38:19.892 25014-25014/com.tool.autoredialer I/AudioManager: setSpeakerphoneOn true java.lang.Throwable
                                                                         at android.media.AudioManager.setSpeakerphoneOn(AudioManager.java:1235)
                                                                         at com.tool.autoredialer.services.CallVibratorAccessibilityService.handlVibrate(CallVibratorAccessibilityService.java:116)
                                                                         at com.tool.autoredialer.services.CallVibratorAccessibilityService.onAccessibilityEvent(CallVibratorAccessibilityService.java:49)
                                                                         at android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent(AccessibilityService.java:1527)
                                                                         at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1712)
                                                                         at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:105)
                                                                         at android.os.Looper.loop(Looper.java:164)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:6809)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer D/AudioManager: com.tool.autoredialerdo not have using speaker authority in call
01-22 13:38:19.894 25014-25014/com.tool.autoredialer D/AudioManager: PPD setMode mode = 0
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: dalvik.system.VMStack.getThreadStackTrace(Native Method)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: java.lang.Thread.getStackTrace(Thread.java:1536)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.media.AudioManager.setMode(AudioManager.java:1630)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.tool.autoredialer.services.CallVibratorAccessibilityService.handlVibrate(CallVibratorAccessibilityService.java:117)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.tool.autoredialer.services.CallVibratorAccessibilityService.onAccessibilityEvent(CallVibratorAccessibilityService.java:49)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.accessibilityservice.AccessibilityService$2.onAccessibilityEvent(AccessibilityService.java:1527)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1712)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.os.Handler.dispatchMessage(Handler.java:105)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.os.Looper.loop(Looper.java:164)
01-22 13:38:19.894 25014-25014/com.tool.autoredialer V/AudioManager: Elem: android.app.ActivityThread.main(ActivityThread.java:6809)
01-22 13:38:19.895 25014-25014/com.tool.autoredialer V/AudioManager: Elem: java.lang.reflect.Method.invoke(Native Method)
01-22 13:38:19.895 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
01-22 13:38:19.895 25014-25014/com.tool.autoredialer V/AudioManager: Elem: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
找到了答案

您试图在通话中使用AudioManager,而Android系统禁止使用。实现扬声器设置的方法是更换手机行为并实施InCallService

然后您可以调用
setAudioRoute(CallAudioState.ROUTE\u SPEAKER)
,并能够处理不同的设备(如蓝牙或有线耳机)


您可以在这里看到API定义:

您可以同时添加错误日志吗?@kshishoo我已经添加了日志。请查看它您找到解决方案了吗?您是否同时连接了蓝牙或耳机?是否可以在TelephonyManager事件中使用setAudioRoute功能?