You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure通信服务App在API 29正常,API 33中语音功能异常

问题原因分析与排查建议

核心原因

Android 13(API 33)对权限和音频管理做了关键变更,直接导致你的App出现麦克风图标消失、无声音的问题:

  1. 权限要求升级:API 33开始,RECORD_AUDIO(麦克风权限)需运行时主动申请,同时新增POST_NOTIFICATIONS权限要求——没有这个权限,系统会强制隐藏通话状态的麦克风图标,并限制麦克风启用。而API 29无此要求,所以模拟器运行正常。
  2. 音频焦点管理更严格:API 33下系统对音频资源的管控更严格,若App未正确获取音频焦点,会被系统中断音频输入输出。
  3. 权限申请时机错误:如果在建立通话连接后才申请权限,API 33下系统会直接拒绝请求,导致麦克风无法正常工作。

排查修复步骤

  • 更新权限清单
    打开AndroidManifest.xml,添加以下权限:

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- API33+ 必备,用于显示通话状态通知/图标 -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    
  • 提前申请权限
    在启动Azure Communication Service通话流程之前,先申请必要权限,示例代码(Kotlin):

    private const val REQUEST_CODE_PERMISSIONS = 1001
    
    private fun checkPermissionsAndStartCall() {
        val requiredPermissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.POST_NOTIFICATIONS)
        } else {
            arrayOf(Manifest.permission.RECORD_AUDIO)
        }
    
        val allPermissionsGranted = requiredPermissions.all {
            ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
        }
    
        if (allPermissionsGranted) {
            // 权限齐全,启动回声测试通话
            startACSEchoTest()
        } else {
            // 请求权限
            ActivityCompat.requestPermissions(this, requiredPermissions, REQUEST_CODE_PERMISSIONS)
        }
    }
    
    // 处理权限申请结果
    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == REQUEST_CODE_PERMISSIONS) {
            val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED }
            if (allGranted) {
                startACSEchoTest()
            } else {
                // 提示用户必须授予权限才能使用通话功能
                Toast.makeText(this, "需要麦克风和通知权限才能进行通话", Toast.LENGTH_SHORT).show()
            }
        }
    }
    
  • 确保获取音频焦点
    在通话启动时主动获取音频焦点,避免系统抢占:

    private fun requestAudioFocus() {
        val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
        val audioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)
            .setAudioAttributes(
                AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                    .build()
            )
            .setOnAudioFocusChangeListener { focusChange ->
                when (focusChange) {
                    AudioManager.AUDIOFOCUS_LOSS -> {
                        // 音频焦点丢失,可暂停通话或提示用户
                    }
                }
            }
            .build()
    
        val result = audioManager.requestAudioFocus(audioFocusRequest)
        if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
            Toast.makeText(this, "无法获取音频焦点,通话可能无声音", Toast.LENGTH_SHORT).show()
        }
    }
    

    调用startACSEchoTest()前先执行requestAudioFocus()。

  • 精准查看Logcat日志
    过滤关键日志定位问题:

    1. 在Android Studio的Logcat面板,点击右上角过滤器→Edit Filter Configuration
    2. 在Log Tag输入AudioService, PermissionManager,点击确定,查看是否有权限拒绝、音频焦点被回收的记录。
  • 测试真实设备
    API 33模拟器的音频权限模拟可能存在误差,用真实Android 13设备测试,确认问题是否复现。

内容的提问来源于stack exchange,提问作者Yossi Dahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:35:22