卫星通信通话业务(语音呼叫)完整流程分析

0 阅读15分钟

一、概述:卫星通话的特点与挑战

1.1 AOSP 卫星通话的现状

关键发现:当前 AOSP 卫星框架(Android 14-16)原生不支持卫星语音通话。框架仅支持数据报(Datagram)模式的短消息通信。卫星语音通话的实现依赖于两条路径:

路径机制现状
运营商 NTN 漫游3GPP NR-NTN / LTE-NTN 的 VoNR/VoLTEModem/RRC 层面支持,Android 框架复用现有 IMS/VoLTE 流程
OEM 卫星模式厂商私有方案(天通、铱星等)完全由厂商实现,AOSP 仅提供紧急呼叫切换(T911/SOS)

AOSP 中的语音相关代码主要体现在:

1.2 卫星通话的核心挑战

挑战地面网络卫星网络影响
传播延迟1-10ms (地面)20-40ms (LEO) / 250-600ms (GEO)信令超时、通话感知延迟
多普勒频移可忽略±50kHz (LEO)上行频率偏移、接收机失锁
定时提前量静态/慢变快速变化(km/s级卫星移动)上行同步丢失
带宽受限10-100Mbps几十kbps-几Mbps编解码选择受限
波束覆盖固定小区移动波束/卫星频繁切换
功耗中等高(发射功率大)通话时长受限

二、主叫通话建立流程

2.1 运营商 NTN 漫游模式(VoNR/VoLTE over NTN)

此模式下,终端通过 3GPP NTN 网络附着,复用标准 IMS/VoLTE 流程。Android 框架层无需特殊修改。

┌─────────────────────────────────────────────────────────────────────────────┐
│ 主叫流程 (VoNR over NTN)                                                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ① 用户拨号                                                                 │
│  Dialer App                                                                │
│    │ TelecomManager.placeCall(uri)                                          │
│    ▼                                                                       │
│  TelecomService                                                             │
│    │ → TelephonyConnectionService.createConnection()                        │
│    ▼                                                                       │
│  TelephonyConnection                                                        │
│    │ → GsmCdmaPhone.dial()                                                  │
│    ▼                                                                       │
│  RILJ                                                                       │
│    │ → RIL.dial(address, clirMode, uusInfo)                                 │
│    │   [IRadio AIDL: dial()]                                                │
│    ▼                                                                       │
│  ② RRC 连接建立(卫星增强)                                                   │
│  Modem                                                                      │
│    │ PRACH Preamble → 卫星基站                                               │
│    │   [NTN增强: 扩展PRACH格式, 多普勒预补偿]                                  │
│    │ RRCSetup → RRCSetupComplete                                            │
│    │   [NTN增强: T300 = 2000ms (地面400ms)]                                  │
│    ▼                                                                       │
│  ③ NAS 信令交互                                                              │
│  UE → 卫星基站 → 核心网                                                       │
│    │ CM_SERVICE_REQUEST                                                     │
│    │   [NTN增强: 含卫星位置信息]                                               │
│    │ SETUP (含SDP offer: AMR-WB 12.65kbps)                                  │
│    │ CALL_PROCEEDING                                                        │
│    │ ALERTING                                                               │
│    │ CONNECT                                                                │
│    │   [NTN增强: 总延迟 ≈ 1-3s (LEO) / 3-8s (GEO)]                          │
│    ▼                                                                       │
│  ④ 专用承载建立                                                              │
│  核心网 → 卫星基站 → UE                                                       │
│    │ RRCReconfiguration (QCI=1, GBR=32kbps)                                 │
│    │   [NTN增强: 半静态调度(SPS) 或 动态调度]                                  │
│    │ IMS SIP 200 OK (SDP answer)                                            │
│    ▼                                                                       │
│  ⑤ 通话接通                                                                 │
│  Modem → RILJ                                                               │
│    │ RIL_UNSOL_CALL_STATE_CHANGED                                           │
│    │   → CallTracker.handleCallStateChanged()                                │
│    │   → Phone.notifyPreciseCallStateChanged()                               │
│    │   → TelephonyConnection.updateState() = ACTIVE                         │
│    │   → InCallService.onCallStateChanged()                                  │
│    │   → UI 显示通话中                                                        │
│    └─────────────────────────────────────────────────────────────────────────┘

2.2 OEM 卫星模式(天通/铱星等)

此模式下,语音通话完全由厂商私有实现。AOSP 框架仅参与紧急呼叫到卫星消息的切换。

┌─────────────────────────────────────────────────────────────────────────────┐
│ OEM卫星主叫流程(以天通为例)                                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ① 用户拨号(卫星模式已开启)                                                  │
│  Dialer App                                                                │
│    │ TelecomManager.placeCall()                                             │
│    ▼                                                                       │
│  TelephonyConnectionService                                                 │
│    │ → TelephonyConnection                                                  │
│    │ → GsmCdmaPhone.dial()                                                  │
│    │ → RIL.dial()                                                           │
│    ▼                                                                       │
│  厂商 RIL (QCRIL/MTK RIL)                                                   │
│    │ → 转换为厂商私有卫星呼叫命令                                               │
│    │   高通: qmi_sat_call_setup()                                            │
│    │   天通: AT+CCALL=<number>                                               │
│    ▼                                                                       │
│  ② 卫星注册检查                                                              │
│  Modem                                                                      │
│    │ 检查卫星注册状态                                                          │
│    │ 检查波束锁定状态                                                          │
│    │ 若未注册: 返回 SATELLITE_RESULT_INVALID_MODEM_STATE                      │
│    ▼                                                                       │
│  ③ 卫星呼叫信令                                                              │
│  Modem → 卫星                                                               │
│    │ 天通: TDM/FDMA 随路信令                                                  │
│    │ 铱星: TDMA 时隙分配 + 呼叫请求                                            │
│    │   [延迟: 2-5s (LEO) / 5-15s (GEO)]                                     │
│    ▼                                                                       │
│  ④ 语音信道分配                                                              │
│  卫星网关                                                                    │
│    │ 分配卫星信道(频率/时隙/码道)                                             │
│    │ 建立卫星回程链路到 PSTN                                                   │
│    ▼                                                                       │
│  ⑤ 通话接通                                                                 │
│  Modem → RILJ → Phone → InCallService                                      │
│    │ RIL_UNSOL_CALL_STATE_CHANGED (ACTIVE)                                  │
│    └─────────────────────────────────────────────────────────────────────────┘

2.3 紧急呼叫到卫星切换(AOSP 原生实现)

这是 AOSP 中最接近"卫星语音通话"的功能——当紧急呼叫无法通过地面网络完成时,推荐用户切换到卫星消息。

关键类SatelliteSOSMessageRecommender.java

┌─────────────────────────────────────────────────────────────────────────────┐
│ 紧急呼叫→卫星切换流程                                                         │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ① 紧急呼叫发起                                                              │
│  TelephonyConnectionService                                                 │
│    │ → SatelliteSOSMessageRecommender.onEmergencyCallStarted(connection)    │
│    ▼                                                                       │
│  ② 监控紧急呼叫状态                                                          │
│  SatelliteSOSMessageRecommender                                             │
│    │ → handleEmergencyCallStartedEvent()                                    │
│    │ → 启动超时定时器 (30s 默认)                                               │
│    │ → 注册 IMS 注册状态变化监听                                               │
│    │ → 注册 ServiceState 变化监听                                             │
│    ▼                                                                       │
│  ③ 评估是否应推荐卫星                                                         │
│  evaluateSendingConnectionEventDisplayEmergencyMessage()                    │
│    │ 条件: 定时器超时 + 卫星接入限制检查完成                                     │
│    │ → updateAndGetProvisionState()                                         │
│    │ → 检查卫星是否在当前区域可用                                               │
│    ▼                                                                       │
│  ④ 确定切换类型                                                              │
│  getEmergencyCallToSatelliteHandoverType()                                  │
│    │                                                                       │
│    ├── EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911                       │
│    │   → 启动默认短信应用 → 打开 T911 对话线程                                  │
│    │   → Intent: ACTION_SENDTO, smsto:911                                   │
│    │   → 携带 EXTRA_SIM_SLOT_ID (卫星订阅所在卡槽)                             │
│    │                                                                       │
│    └── EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS                        │
│        → 启动 OEM 卫星消息应用                                                 │
│        → Intent: 从 overlay config 获取                                      │
│                                                                             │
│  ⑤ 发送切换事件到拨号器                                                       │
│  Connection.sendEvent(EVENT_DISPLAY_EMERGENCY_MESSAGE, bundle)              │
│    │ bundle 包含:                                                            │
│    │   EXTRA_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE                       │
│    │   EXTRA_EMERGENCY_CALL_TO_SATELLITE_LAUNCH_INTENT (PendingIntent)       │
│    ▼                                                                       │
│  ⑥ 拨号器显示卫星切换提示                                                      │
│  Dialer App (InCallService)                                                 │
│    │ → 显示"切换到卫星消息"按钮                                                 │
│    │ → 用户点击 → 启动 PendingIntent                                          │
│    │ → 打开卫星消息应用                                                        │
│    └─────────────────────────────────────────────────────────────────────────┘

切换类型由 CarrierConfig 决定

// SatelliteController.java L6568-6587
protected int getCarrierRoamingNtnEmergencyCallToSatelliteHandoverType(int subId) {
    // 优先从 PLMN 级别配置获取
    SatellitePerPlmnConfiguration config = mCurrentSatellitePerPlmnConfigurations.get(subId);
    if (config != null) {
        return config.handoverType;
    }
    // 回退到全局 CarrierConfig
    return getConfigForSubId(subId).getInt(
        KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT);
}

关键配置

配置键说明
KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT切换类型(SOS/T911)
KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INTT911 切换超时
KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL紧急呼叫时是否关闭卫星会话
KEY_SATELLITE_ESOS_SUPPORTED_BOOL是否支持紧急SOS

2.4 RILJ 构造呼叫控制消息

标准地面 VoLTE 流程中,RILJ 通过 IRadio AIDL 接口下发 dial() 命令:

// RIL.java
public void dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
    IRadio radio = getRadio();
    Dial dialInfo = new Dial();
    dialInfo.address = convertNullToEmptyString(address);
    dialInfo.clir = clirMode;
    // ... 设置 uusInfo
    radio.dial(RIL.serialNo(dialInfo), dialInfo);
}

卫星场景下的差异

  • 运营商 NTN:RILJ 无需修改,Modem 内部处理卫星 RRC 增强
  • OEM 卫星:厂商 RIL 扩展 dial() 方法,检测到卫星模式时转换为私有命令

三、被叫通话建立流程

3.1 运营商 NTN 漫游模式

┌─────────────────────────────────────────────────────────────────────────────┐
│ 被叫流程 (VoNR over NTN)                                                    │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ① 核心网发起寻呼                                                            │
│  AMF/MME                                                                    │
│    │ → Paging (TAI list)                                                    │
│    │   [NTN增强: 卫星小区覆盖巨大,寻呼范围优化]                                 │
│    │   - 3GPP R17: 引入 "NTN Tracking Area" 概念                              │
│    │   - 基于 UE 位置信息缩小寻呼范围                                           │
│    │   - 波束索引寻呼 (beam-specific paging)                                  │
│    ▼                                                                       │
│  ② 终端接收寻呼                                                              │
│  Modem                                                                      │
│    │ → RRC Paging 消息                                                       │
│    │ → 检查是否为本终端的 TMSI/IMSI                                           │
│    │   [NTN增强: 扩展 Paging DRX 周期适应卫星轨道]                              │
│    ▼                                                                       │
│  ③ 随机接入响应                                                              │
│  UE → 卫星                                                                  │
│    │ PRACH Preamble                                                         │
│    │   [NTN增强: 多普勒预补偿 + TA 预补偿]                                     │
│    │ RAR (Random Access Response)                                            │
│    │ RRCSetupComplete                                                       │
│    ▼                                                                       │
│  ④ NAS 信令交互                                                              │
│  UE ↔ 核心网                                                                 │
│    │ PAGING_RESPONSE                                                        │
│    │ SETUP (来电号码)                                                         │
│    │ CALL_CONFIRMED                                                         │
│    │ ALERTING (振铃)                                                         │
│    │ CONNECT (接听)                                                          │
│    ▼                                                                       │
│  ⑤ Android 框架通知                                                          │
│  Modem → RILJ                                                               │
│    │ RIL_UNSOL_CALL_STATE_CHANGED (INCOMING)                                │
│    │ → CallTracker.handleCallStateChanged()                                  │
│    │ → Phone.notifyNewRingingConnection()                                    │
│    │ → TelephonyConnection.onRinging()                                       │
│    │ → TelecomManager.addNewIncomingCall()                                   │
│    │ → InCallService.onCallAdded()                                           │
│    │ → UI 显示来电界面                                                        │
│    └─────────────────────────────────────────────────────────────────────────┘

3.2 卫星寻呼优化

卫星小区覆盖范围巨大(LEO 波束直径约 50-500km,GEO 波束直径约 200-2000km),传统寻呼方式效率极低。3GPP R17/R18 引入以下优化:

优化方案机制3GPP 参考
NTN Tracking Area基于卫星轨道定义 TA,而非地理区域TS 38.300
UE 位置辅助寻呼UE 上报 GNSS 位置,核心网缩小寻呼范围TS 23.501
波束索引寻呼在 Paging 消息中携带波束 IDTS 38.331
扩展 Paging DRX支持 32-1024 帧 DRX 周期TS 38.304
eDRX扩展不连续接收,降低待机功耗TS 38.304

3.3 OEM 卫星模式被叫

OEM 卫星模式(如天通)的被叫流程完全由厂商实现:

卫星网关收到PSTN来电
    → 通过卫星信令信道下发呼叫通知
    → Modem 接收 → RIL_UNSOL_CALL_STATE_CHANGED (RINGING)
    → RILJ → Phone → InCallService → UI 来电界面
    → 用户接听 → RIL.answer() → Modem → 卫星接听信令
    → 语音信道建立 → 通话开始

四、通话中的动态处理

4.1 多普勒频移补偿

问题:LEO 卫星相对地面速度约 7.5km/s,产生 ±50kHz 的多普勒频移。

3GPP R17 解决方案

机制描述实现位置
开环预补偿UE 根据卫星星历和自身 GNSS 位置计算频偏,上行预补偿Modem 固件
闭环频率调整网络侧下发频率调整指令(NIA/NRA)卫星基站
公共 TA 补偿卫星广播公共定时提前量,UE 补偿传播延迟SIB19
星历下发SIB19 携带卫星星历(轨道参数、时间戳)RRC System Information

Android 框架层:多普勒补偿完全在 Modem 内部处理,Android 框架不参与。但 SatelliteModemInterface 中的 updateSystemSelectionChannels() 可用于下发卫星频点信息辅助 Modem 快速搜索。

// SatelliteController.java
public void updateSystemSelectionChannels(
        @NonNull List<SystemSelectionSpecifier> specifiers, ...) {
    mSatelliteModemInterface.updateSystemSelectionChannels(specifiers, onCompleted);
}

4.2 定时提前量(TA)管理

问题:卫星移动导致传播距离快速变化,TA 需要频繁更新。

3GPP R17 混合 TA 机制

┌─────────────────────────────────────────────┐
│              TA 管理架构                      │
│                                             │
│  开环 TA(UE 自主)                           │
│  ├── UE 根据 GNSS 位置 + 卫星星历计算         │
│  ├── 公共 TA(SIB19 广播)                    │
│  └── 更新频率:每次发射前                     │
│                                             │
│  闭环 TA(网络控制)                          │
│  ├── 初始 TA:RAR 中 TA Command              │
│  ├── 动态 TA:MAC CE TA Command              │
│  └── 更新频率:每 2-10ms(取决于卫星速度)     │
│                                             │
│  TA 验证                                     │
│  ├── UE 上报 TA 验证结果                      │
│  └── 网络侧校验 UE 的开环 TA 估计             │
└─────────────────────────────────────────────┘

Android 框架层:TA 管理完全在 Modem 内部,Android 框架不直接参与。

4.3 波束/卫星切换

4.3.1 运营商 NTN 波束切换

┌─────────────────────────────────────────────────────────────────────────────┐
│ 通话中波束切换流程 (3GPP NTN)                                                 │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ① 测量与上报                                                               │
│  UE (Modem)                                                                 │
│    │ 周期性测量当前波束和邻波束的 RSRP/RSRQ                                    │
│    │ → MeasurementReport (RRC)                                              │
│    │   [NTN增强: 含卫星特定测量量 - 仰角、传播时延]                             │
│    ▼                                                                       │
│  ② 切换决策                                                                 │
│  卫星基站                                                                    │
│    │ 基于测量报告 + 卫星轨道预测 + 负载均衡                                    │
│    │ → 决定切换目标波束/卫星                                                   │
│    ▼                                                                       │
│  ③ 切换执行                                                                 │
│  源波束 → 目标波束                                                            │
│    │ RRCReconfiguration (handoverType = intra-satellite)                     │
│    │   [同卫星波束切换: 仅需频率/时隙重配]                                     │
│    │ RRCReconfiguration (handoverType = inter-satellite)                     │
│    │   [跨卫星切换: 需要重新随机接入]                                          │
│    │ → RACH → RAR → RRCReconfigurationComplete                              │
│    ▼                                                                       │
│  ④ 专用承载切换                                                              │
│  核心网                                                                      │
│    │ → Path Switch Request                                                   │
│    │ → 语音承载路径更新                                                       │
│    │ → 通话继续(可能短暂中断 50-200ms)                                       │
│    └─────────────────────────────────────────────────────────────────────────┘

Make-Before-Break(先建后断)

  • 3GPP R18 引入 DAPS(Dual Active Protocol Stack)切换
  • UE 同时维持与源波束和目标波束的连接
  • 切换中断时间 < 0ms(零中断)
  • 代价:UE 需要两套射频链路

4.3.2 Android 框架对切换的处理

Android 框架对卫星波束切换的处理是透明的——Modem 内部完成切换,框架仅通过 ServiceState 变化感知:

// SatelliteController.java L2897-2909
// 卫星会话可能需要为紧急呼叫关闭
if (!isDisableSatelliteWhileEnableInProgressSupported()) {
    // 某些运营商希望在紧急呼叫时禁用卫星以优先处理紧急呼叫
    return;
}

4.4 地面与卫星网络切换

当前 3GPP 标准支持情况

切换方向3GPP R173GPP R18实际支持
地面 → 卫星❌ (仅重选)⚠️ (NITNHO)有限
卫星 → 地面❌ (仅重选)⚠️ (NTNHO)有限
卫星 → 卫星✅ (波束间)✅ (卫星间)支持

NITNHO (Non-terrestrial Network to Terrestrial Network Handover):R18 引入的卫星→地面切换,但需要终端同时维持两个网络的连接。

Android 框架处理

// SatelliteController.java
// 地面网络可用性变化处理
EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED
    → 评估是否应关闭卫星
    → 若 CarrierConfig 允许自动切换:requestSatelliteEnabled(false)
    → 若需手动确认:发送通知

4.5 QoS 与拥塞控制

卫星语音 QoS 保障

机制地面 VoLTE卫星 VoNR/VoLTE说明
QCIQCI=1 (GBR)QCI=1 (GBR)相同
GBR32-64kbps16-32kbps卫星更低
AMR 速率AMR-WB 12.65/23.85kbpsAMR 5.9-12.65kbps卫星用更低速率
调度方式SPS (半静态)SPS 或动态卫星更倾向动态
优先呼叫ARP 优先级ARP + 卫星专用优先级紧急呼叫优先

AOSP 中的语音服务策略

// SatelliteController.java L10223-10236
public int getSatelliteVoiceServicePolicyForPlmn(int subId, String plmn) {
    Map<String, Integer> voiceServicePolicy =
            mEntitlementVoiceServicePolicyMapPerCarrier.get(subId);
    if (voiceServicePolicy != null && voiceServicePolicy.containsKey(plmn)) {
        return voiceServicePolicy.get(plmn);
    }
    return 0; // Restricted (默认受限)
}

SatelliteNetworkInfo 中的语音服务

// SatelliteNetworkInfo.java
// mAllowedServicesInfo: key=service type, value=service policy
// Possible Service Type: "data" and "voice"
// Possible Service Policy: "constrained" and "unconstrained"

五、通话释放流程

5.1 正常释放

┌─────────────────────────────────────────────────────────────────────────────┐
│ 正常通话释放流程                                                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ① 用户挂机                                                                 │
│  InCallService.disconnect()                                                 │
│    │ → TelephonyConnection.hangup()                                         │
│    │ → GsmCdmaPhone.hangup()                                                │
│    │ → RIL.hangupForegroundResumeBackground()                               │
│    │   [IRadio AIDL: hangup()]                                              │
│    ▼                                                                       │
│  ② Modem 发送释放信令                                                        │
│  UE → 卫星基站 → 核心网                                                       │
│    │ DISCONNECT (cause: normal)                                             │
│    │ RELEASE                                                               │
│    │ RELEASE COMPLETE                                                       │
│    │   [NTN增强: 释放延迟 ≈ 0.5-3s (LEO) / 2-8s (GEO)]                      │
│    ▼                                                                       │
│  ③ 专用承载释放                                                              │
│  核心网 → 卫星基站 → UE                                                       │
│    │ RRCReconfiguration (释放 QCI=1 承载)                                    │
│    │ 或 RRCConnectionRelease (完全释放)                                       │
│    ▼                                                                       │
│  ④ Android 框架更新                                                          │
│  Modem → RILJ                                                               │
│    │ RIL_UNSOL_CALL_STATE_CHANGED (IDLE)                                    │
│    │ → CallTracker.handleCallStateChanged()                                  │
│    │ → Phone.notifyPreciseCallStateChanged()                                 │
│    │ → TelephonyConnection.updateState() = DISCONNECTED                     │
│    │ → InCallService.onCallRemoved()                                         │
│    │ → UI 返回拨号器                                                          │
│    ▼                                                                       │
│  ⑤ 卫星会话状态更新                                                           │
│  SatelliteSessionController                                                 │
│    │ → 若无更多活动: TransferringState → ListeningState                      │
│    │ → ListeningTimer 超时 → IdleState                                       │
│    │ → 不活动定时器超时 → ConnectedState → NotConnectedState                  │
│    │ → 最终可能回退到 PowerOffState                                           │
│    └─────────────────────────────────────────────────────────────────────────┘

5.2 异常释放

异常场景Modem 行为Android 框架处理
信号丢失RLF (Radio Link Failure) → T310 超时CallTracker 检测到 IDLE → 通知 UI 掉话
定时器超时T300/T301 超时 → 释放 RRC同上
切换失败T304 超时 → RRC 连接重建重建成功则通话继续,失败则掉话
卫星过境LEO 卫星离开覆盖区Modem 搜索下一颗卫星 → 可能重建
资源不足网络拒绝承载建立SATELLITE_RESULT_MODEM_ERROR

呼叫重建

掉话后 Modem 尝试重建
    → RRC Reestablishment Request
    → 若成功: 恢复专用承载 → 通话继续
    → 若失败: 
        → RIL_UNSOL_CALL_STATE_CHANGED (IDLE)
        → Phone.notifyDisconnectCause() = RADIO_LOST
        → InCallService 显示"通话已断开"
        → SatelliteSOSMessageRecommender 不再监控(非紧急)

卫星会话的异常处理(AOSP 原生):

// SatelliteController.java
// 紧急呼叫进行中不允许启用卫星
if (enableSatellite && mIsEmergency.get()) {
    plogd("requestSatelliteEnabled: reject as emergency call is ongoing.");
    sendErrorAndReportSessionMetrics(
            SatelliteManager.SATELLITE_RESULT_EMERGENCY_CALL_IN_PROGRESS, result);
    return;
}

// 某些运营商要求紧急呼叫时关闭卫星会话
if (!isDisableSatelliteWhileEnableInProgressSupported()) {
    // 不支持在启用过程中禁用卫星
    return;
}

六、与地面 VoLTE 的对比表格

对比维度地面 VoLTE运营商 NTN VoNR/VoLTEOEM 卫星语音
呼叫建立时延1-3秒3-10秒 (LEO) / 8-25秒 (GEO)5-30秒
语音编解码AMR-WB (12.65-23.85kbps)AMR-WB (6.6-12.65kbps)AMR/AMR-WB (4.75-12.65kbps)
语音质量 (MOS)3.8-4.23.2-3.82.8-3.5
掉话率<0.5%1-5%2-10%
切换成功率>99%90-95% (波束间)N/A (通常无切换)
并发业务语音+数据语音 only 或受限数据语音 only
功耗中等 (~200mA)高 (~500mA-1A)极高 (~1-2A)
最大通话时长不限10-30分钟 (受限)5-15分钟
RRC 定时器T300=400msT300=2000ms厂商自定义
DRX 周期32-256帧32-1024帧厂商自定义
寻呼范围单小区/TA卫星波束/NTN TA全波束
多普勒补偿不需要开环+闭环厂商私有
TA 更新频率秒级毫秒级厂商私有
Android 框架标准 IMS/VoLTE复用 IMS/VoLTE厂商私有
3GPP 标准TS 24.229/23.228TS 24.229 + R17 NTN无标准

七、关键协议与代码索引

7.1 3GPP 协议参考

协议内容卫星增强章节
TS 38.300NR 总体描述第 16 章 NTN
TS 38.331RRC 协议SIB19 (卫星星历)、NTN 相关 IE
TS 38.304空闲模式过程NTN 寻呼、eDRX
TS 38.213物理层控制NTN PRACH 格式、TA
TS 24.008NAS CC 协议无特殊修改
TS 24.301NAS EMM/ESM无特殊修改
TS 24.229IMS SIP无特殊修改
TS 23.5015G 系统架构NTN 架构增强
TS 36.300LTE 总体描述LTE-NTN

7.2 Android 代码索引

类/文件路径卫星通话相关
SatelliteSOSMessageRecommendersatellite/SatelliteSOSMessageRecommender.java紧急呼叫→卫星切换推荐
SatelliteControllersatellite/SatelliteController.java卫星会话管理、语音服务策略
SatelliteNetworkInfosatellite/SatelliteNetworkInfo.java语音服务类型映射
SatelliteSessionControllersatellite/SatelliteSessionController.java通话后不活动定时器
NtnCapabilityResolversatellite/NtnCapabilityResolver.javaNTN 网络能力解析
GsmCdmaPhonetelephony/GsmCdmaPhone.javadial()/hangup()/answer()
RILtelephony/RIL.javaIRadio AIDL dial()/hangup()
CallTrackertelephony/CallTracker.java呼叫状态管理
TelephonyConnectiontelecom/TelephonyConnection.java通话连接管理
ImsPhonetelephony/imsphone/ImsPhone.javaIMS 呼叫处理

7.3 关键 CarrierConfig 索引

配置键语音通话相关说明
KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT紧急呼叫切换类型
KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INTT911 切换超时
KEY_SATELLITE_ROAMING_TURN_OFF_SESSION_FOR_EMERGENCY_CALL_BOOL紧急呼叫时关闭卫星
KEY_SATELLITE_ESOS_SUPPORTED_BOOL紧急SOS支持
KEY_SATELLITE_DATA_SUPPORT_MODE_INT间接数据模式影响并发语音
KEY_SATELLITE_CONFIGS_PER_PLMN_BUNDLE按 PLMN 配置(含 handoverType)

总结:当前 AOSP 卫星框架(Android 16)原生不支持卫星语音通话,仅支持数据报模式的短消息。卫星语音通话的实现依赖于两条路径:

  1. 运营商 NTN 漫游:复用标准 IMS/VoLTE 流程,Modem 内部处理卫星 RRC 增强(多普勒补偿、TA 管理、波束切换),Android 框架层无需修改。

  2. OEM 卫星模式:完全由厂商私有实现,AOSP 仅通过 SatelliteSOSMessageRecommender 提供紧急呼叫到卫星消息的切换推荐(SOS/T911),以及通过 SatelliteNetworkInfo.mAllowedServicesInfogetSatelliteVoiceServicePolicyForPlmn() 预留了语音服务策略的配置接口。

3GPP R17/R18 的 NTN 标准已为卫星语音通话定义了完整的 RRC/NAS 增强规范,预计 Android 17+ 将逐步在框架层增加对卫星语音的原生支持。

报告已完成。核心结论是:AOSP Android 16 原生不支持卫星语音通话,框架仅支持数据报模式的短消息。卫星语音通话的实现分两条路径——运营商 NTN 漫游复用标准 IMS/VoLTE 流程(Modem 内部处理卫星增强),OEM 卫星模式完全由厂商私有实现。AOSP 的贡献主要体现在 SatelliteSOSMessageRecommender 的紧急呼叫→卫星消息切换推荐机制(SOS/T911),以及 SatelliteNetworkInfogetSatelliteVoiceServicePolicyForPlmn() 预留的语音服务策略配置接口。