@ capgo/ 电容器- spress- call
在您的 Capacitor app 中添加视频和音频调用Stream Video SDK , 包括 iOS 和 Android 上的接通呼叫处理和本地调用屏幕.
🤖 建筑与AI编码代理? 安装 Capgo 技能 所以克劳德代码,代码,光标,副驾驶,或双子座CLI知道如何安装和使用
@capgo/capacitor-stream-call在您的电容应用程序中:npx skills add Cap-go/capgo-skills。然后问你的经纪人: 添加@capgo/电容-流调用到我的电容软件上 代理设置指南 • 妇女 主机磁共振
主要特点
- 会议数字 :
login()财务报告和审定财务报表logout()带有流式用户符号. - 电话数字 :
call(), (中文(简体) ),acceptCall(), (中文(简体) ),rejectCall()财务报告和审定财务报表endCall(),与callEvent财务报告和审定财务报表incomingCall听众. - 媒体控制数字 :
setMicrophoneEnabled(), (中文(简体) ),setCameraEnabled(), (中文(简体) ),switchCamera()财务报告和审定财务报表setSpeaker()。 。 。 . - 调用信息数字 :
getCallStatus(), (中文(简体) ),getCallInfo()财务报告和审定财务报表getCurrentUser()。 。 。 . - 动态 API 密钥数字 :
setDynamicStreamVideoApikey()存储本地创建客户端时使用的 Stream API 密钥. - 平台: iOS,Android和Web. 互联网档案馆的存檔,存档日期2013-12-02. Web使用Stream视频客户端.
文档
这里有最完整的医生: https://capgo.app/docs/plugins/流调/
兼容性
| 插件版本 | 电容兼容性 | 维护 |
|---|---|---|
| 联合国 | 联合国 | ✅ |
| 页:1 | 页:1 | 应要求 |
| 页:1 | 页:1 | ❌ |
| 页:1 | 页:1 | ❌ |
说明: 此插件的主要版本沿用了Capacitor的主要版本. 使用匹配您的 Capacitor 安装的版本( 如 Capacitor 8 的插件 v8) 。 只有最新的主要版本得到积极维护.
安装
您可以使用我们的 AI 辅助设置安装插件 。 使用以下命令将 Capgo 技能添加到您的 AI 工具 :
npx skills add https://github.com/cap-go/capacitor-skills --skill capacitor-plugins
然后使用下列提示:
Use the `capacitor-plugins` skill from `cap-go/capacitor-skills` to install the `@capgo/capacitor-stream-call` plugin in my project.
如果您更喜欢手动设置,请通过运行以下命令来安装插件,并遵循下面的平台特定指令:
npm install @capgo/capacitor-stream-call
npx cap sync
配置
iOS 设置
1. API 密钥配置
添加您的流视频 API 密钥到 ios/App/App/Info.plist数字 :
<dict>
<key>CAPACITOR_STREAM_VIDEO_APIKEY</key>
<string>your_api_key_here</string>
<!-- other keys -->
</dict>
2. 本地化(可选)
支持多种语言:
-
添加本地化文件到您的 Xcode 项目 :
/App/App/en.lproj/Localizable.strings/App/App/en.lproj/Localizable.stringsdict
-
添加翻译
Localizable.strings数字 :
"stream.video.call.incoming" = "Incoming call from %@";
"stream.video.call.accept" = "Accept";
"stream.video.call.reject" = "Reject";
"stream.video.call.hangup" = "Hang up";
"stream.video.call.joining" = "Joining...";
"stream.video.call.reconnecting" = "Reconnecting...";
- 配置您的本地化
AppDelegate.swift数字 :
import StreamVideo
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Appearance.localizationProvider = { key, table in
Bundle.main.localizedString(forKey: key, value: nil, table: table)
}
return true
}
}
Android 设置
1. API 密钥配置
添加您的流视频 API 密钥到 android/app/src/main/res/values/strings.xml数字 :
<string name="CAPACITOR_STREAM_VIDEO_APIKEY">your_api_key_here</string>
2. 主要活动配置
修改您的 MainActivity.java 处理来电:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Enable activity to show over lock screen
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
setTurnScreenOn(true);
} else {
getWindow().addFlags(android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | android.view.WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}
}
3. 应用程序类配置
创建或修改您的应用程序类以初始化插件 :
import ee.forgr.capacitor.streamcall.StreamCallPlugin;
@Override
public void onCreate() {
super.onCreate();
// Initialize Firebase
com.google.firebase.FirebaseApp.initializeApp(this);
// Pre-initialize StreamCall plugin
try {
StreamCallPlugin.preLoadInit(this, this);
} catch (Exception e) {
Log.e("App", "Failed to pre-initialize StreamVideo Plugin", e);
}
}
说明: 如果你没有应用类,你需要创建一个 并在你的
AndroidManifest.xml与android:name=".YourApplicationClass"。 。 。 .
4. 本地化(可选)
为不同语言添加字符串资源 :
默认( E)values/strings.xml:
<resources>
<string name="stream_video_call_incoming">Incoming call from %1$s</string>
<string name="stream_video_call_accept">Accept</string>
<string name="stream_video_call_reject">Reject</string>
<string name="stream_video_call_hangup">Hang up</string>
<string name="stream_video_call_joining">Joining...</string>
<string name="stream_video_call_reconnecting">Reconnecting...</string>
</resources>
法语values-fr/strings.xml:
<resources>
<string name="stream_video_call_incoming">Appel entrant de %1$s</string>
<string name="stream_video_call_accept">Accepter</string>
<string name="stream_video_call_reject">Refuser</string>
<string name="stream_video_call_hangup">Raccrocher</string>
<string name="stream_video_call_joining">Connexion...</string>
<string name="stream_video_call_reconnecting">Reconnexion...</string>
</resources>
显示呼叫者信息
接收来电时,您可以访问呼叫者信息,包括姓名,用户ID,以及配置图像. 此信息会自动从调用数据中取出并传递到事件系统.
获取呼叫信息
电话信息有两种方式:
1. 通过呼叫活动
这个 callEvent 听众为来电提供呼叫信息 :
StreamCall.addListener('callEvent', (event) => {
if (event.state === 'ringing' && event.caller) {
console.log('Incoming call from:', event.caller.name || event.caller.userId);
console.log('Caller image:', event.caller.imageURL);
// Update your UI to show caller information
showIncomingCallUI(event.caller);
}
});
2. 通过来电事件(Android锁屏)
这个 incomingCall 收听者还包括呼叫者信息:
StreamCall.addListener('incomingCall', (payload) => {
if (payload.caller) {
console.log('Lock-screen call from:', payload.caller.name || payload.caller.userId);
// Update your lock-screen UI
updateLockScreenUI(payload.caller);
}
});
呼叫者信息结构
interface CallMember {
userId: string; // User ID (always present)
name?: string; // Display name (optional)
imageURL?: string; // Profile image URL (optional)
role?: string; // User role (optional)
}
实例
以下是如何执行一个有呼叫者信息的适当来电屏幕:
export class CallService {
private callerInfo: CallMember | null = null;
constructor() {
this.setupCallListeners();
}
private setupCallListeners() {
StreamCall.addListener('callEvent', (event) => {
if (event.state === 'ringing') {
this.callerInfo = event.caller || null;
this.showIncomingCallScreen();
} else if (event.state === 'joined' || event.state === 'left') {
this.callerInfo = null;
this.hideIncomingCallScreen();
}
});
// Android lock-screen support
if (Capacitor.getPlatform() === 'android') {
StreamCall.addListener('incomingCall', (payload) => {
this.callerInfo = payload.caller || null;
this.showLockScreenIncomingCall();
});
}
}
private showIncomingCallScreen() {
const callerName = this.callerInfo?.name || 'Unknown Caller';
const callerImage = this.callerInfo?.imageURL || 'default-avatar.png';
// Update your UI components
document.getElementById('caller-name').textContent = callerName;
document.getElementById('caller-image').src = callerImage;
document.getElementById('incoming-call-screen').style.display = 'block';
}
}
API 密码
login(...)logout()call(...)endCall()joinCall(...)setMicrophoneEnabled(...)setCameraEnabled(...)addListener('callEvent', ...)addListener('incomingCall', ...)removeAllListeners()enableBluetooth()acceptCall()rejectCall()isCameraEnabled()getCallStatus()getRingingCall()toggleViews()setSpeaker(...)switchCamera(...)getCallInfo(...)setDynamicStreamVideoApikey(...)getDynamicStreamVideoApikey()getCurrentUser()getPluginVersion()- 接口
- 类型异名
- 数字
登录(...)
login(options: LoginOptions) => Promise<SuccessResponse>
登录到流视频服务
| 参数 | 类型 | 说明 |
|---|---|---|
options | LoginOptions | - 登录配置 |
回返情况: Promise<SuccessResponse>
登录( c)
logout() => Promise<SuccessResponse>
从流视频服务登录
回返情况: Promise<SuccessResponse>
调用(...)
call(options: CallOptions) => Promise<SuccessResponse>
启动给另一个用户的呼叫
| 参数 | 类型 | 说明 |
|---|---|---|
options | CallOptions | - 调用配置 |
回返情况: Promise<SuccessResponse>
端点呼叫( C)
endCall() => Promise<SuccessResponse>
结束当前呼叫
回返情况: Promise<SuccessResponse>
加入呼叫(...)
joinCall(options: { callId: string; callType: string; }) => Promise<SuccessResponse>
加入已有的调用
| 参数 | 类型 | 说明 |
|---|---|---|
options | { callId: string; callType: string; } | - 麦克风状态 |
回返情况: Promise<SuccessResponse>
set 麦克风
setMicrophoneEnabled(options: { enabled: boolean; }) => Promise<SuccessResponse>
启用或禁用麦克风
| 参数 | 类型 | 说明 |
|---|---|---|
options | { enabled: boolean; } | - 麦克风状态 |
回返情况: Promise<SuccessResponse>
设置 CameraEnabled (...)
setCameraEnabled(options: { enabled: boolean; }) => Promise<SuccessResponse>
启用或禁用相机
| 参数 | 类型 | 说明 |
|---|---|---|
options | { enabled: boolean; } | - 相机状态 |
回返情况: Promise<SuccessResponse>
添加倾听器( “ callEvent, ” )..
addListener(eventName: 'callEvent', listenerFunc: (event: CallEvent) => void) => Promise<{ remove: () => Promise<void>; }>
为呼叫事件添加听众
| 参数 | 类型 | 说明 |
|---|---|---|
eventName | 'callEvent' | - 要聆听的活动名称 |
listenerFunc | (event: CallEvent) => void | - 回调函数 |
回返情况: Promise<{ remove: () => Promise<void>; }>
添加收听器('incoming Call',...)
addListener(eventName: 'incomingCall', listenerFunc: (event: IncomingCallPayload) => void) => Promise<{ remove: () => Promise<void>; }>
监听锁屏接通电话(仅限Android). 在用户互动前通过全屏意图显示应用程序时被解除.
| 参数 | 类型 |
|---|---|
eventName | 'incomingCall' |
listenerFunc | (event: IncomingCallPayload) => void |
回返情况: Promise<{ remove: () => Promise<void>; }>
删除所有收听器( )
removeAllListeners() => Promise<void>
删除全部事件听众
启用蓝牙 ()
enableBluetooth() => Promise<SuccessResponse>
启用蓝牙音频
回返情况: Promise<SuccessResponse>
接受呼叫( C)
acceptCall() => Promise<SuccessResponse>
接受接听的电话
回返情况: Promise<SuccessResponse>
拒绝呼叫( C)
rejectCall() => Promise<SuccessResponse>
拒绝来电
回返情况: Promise<SuccessResponse>
is CameraEnabled () (帮助)
isCameraEnabled() => Promise<CameraEnabledResponse>
检查是否启用相机
回返情况: Promise<CameraEnabledResponse>
获取呼叫状态( C)
getCallStatus() => Promise<CallEvent>
获取当前呼叫状态
回返情况: Promise<CallEvent>
获得 RingCall ()
getRingingCall() => Promise<CallEvent>
获取当前铃声
回返情况: Promise<CallEvent>
切换视图( )
toggleViews() => Promise<{ newLayout: StreamCallLayout; }>
通过可用视频布局循环
回返情况: Promise<{ newLayout: StreamCallLayout; }>
设置语法(...)
setSpeaker(options: { name: string; }) => Promise<SuccessResponse>
打开扬声器
| 参数 | 类型 | 说明 |
|---|---|---|
options | { name: string; } | - 扬声器名称 |
回返情况: Promise<SuccessResponse>
切换Camera(...)
switchCamera(options: { camera: 'front' | 'back'; }) => Promise<SuccessResponse>
切换相机
| 参数 | 类型 | 说明 |
|---|---|---|
options | { camera: 'front' | 'back'; } | - 要切换到的相机 |
回返情况: Promise<SuccessResponse>
获取CallInfo(...)
getCallInfo(options: { callId: string; }) => Promise<CallEvent>
获取一个活动电话的详细信息, 包括呼叫者的详细信息
| 参数 | 类型 | 说明 |
|---|---|---|
options | { callId: string; } | - 包含呼叫ID的选项 |
回返情况: Promise<CallEvent>
设置 DynamicStreamVideo Apikey (...)
setDynamicStreamVideoApikey(options: { apiKey: string; }) => Promise<SuccessResponse>
设置一个动态流视频 API 密钥来覆盖静态
| 参数 | 类型 | 说明 |
|---|---|---|
options | { apiKey: string; } | - 要设置的 API 密钥 |
回返情况: Promise<SuccessResponse>
获得DynamicStreamVideo Apikey ()
getDynamicStreamVideoApikey() => Promise<DynamicApiKeyResponse>
获取当前设置的动态流视频 API 密钥
回返情况: Promise<DynamicApiKeyResponse>
获取当前用户( C)
getCurrentUser() => Promise<CurrentUserResponse>
获取当前用户的信息
回返情况: Promise<CurrentUserResponse>
获取 PluginVersion ()
getPluginVersion() => Promise<{ version: string; }>
获取本地 Capacitor 插件版本
回返情况: Promise<{ version: string; }>
接口
成功答复
| Prop | 类型 | 说明 |
|---|---|---|
success | boolean | 操作是否成功 |
callId | string |
登录选项
| Prop | 类型 | 说明 |
|---|---|---|
token | string | 流视频 API 令牌 |
userId | string | 当前用户的用户ID |
name | string | 显示当前用户的名称 |
imageURL | string | 当前用户的可选可变 URL |
apiKey | string | 流视频 API 密钥 |
magicDivId | string | 显示视频的 HTML 元素的标识 |
pushNotificationsConfig | PushNotificationsConfig |
推进通知
| Prop | 类型 |
|---|---|
pushProviderName | string |
voipProviderName | string |
调用选项
| Prop | 类型 | 说明 |
|---|---|---|
userIds | string[] | 打电话者的用户身份 |
type | CallType | 呼叫类型, 默认为“ 默认 ” |
ring | boolean | 是否按下另一个用户, 默认为真 |
team | string | 要呼叫的团队名称 |
video | boolean | 是否启用视频启动调用, 默认为虚假 |
custom | Record< string, | string | boolean | number | null | Record<string, string | boolean | number | null> | string[] | boolean[] | number[] > | 自定义数据传递给呼叫 |
调用事件
| Prop | 类型 | 说明 |
|---|---|---|
callId | string | 电话号码 |
state | CallState | 呼叫现状 |
userId | string | 触发事件的电话参与者的用户代号 |
reason | string | 更改呼叫状态的理由(如适用) |
caller | CallMember | 关于打电话者的信息(接听电话) |
members | CallMember[] | 呼叫成员名单 |
custom | Record< string, | string | boolean | number | null | Record<string, string | boolean | number | null> | string[] | boolean[] | number[] > | |
count | number |
呼叫状态
呼叫状态 是调用当前状态 被SFU看见了.
| Prop | 类型 | 说明 |
|---|---|---|
participants | Participant[] | 参与者是该电话的参与者名单。 在大叫中,可以缩短名单,在这种情况下,参与者名单中包含的参与者少于在参与者 计数中返回的计数. 匿名与会者是: 没有 列入清单. |
startedAt | Timestamp | 启动时间是呼叫会话实际开始的时间. |
participantCount | ParticipantCount | 参与者 计数包含计数摘要. |
pins | Pin[] | 呼叫中的针头列表。 平板按下行顺序排列(最重要的第一). |
参加者
在电话里的人
| Prop | 类型 | 说明 |
|---|---|---|
userId | string | |
sessionId | string | |
publishedTracks | TrackType[] | 轨迹 id 映射到轨迹类型 |
joinedAt | Timestamp | |
trackLookupPrefix | string | |
connectionQuality | ConnectionQuality | |
isSpeaking | boolean | |
isDominantSpeaker | boolean | |
audioLevel | number | |
name | string | |
image | string | |
custom | Struct | |
roles | string[] |
时间戳
A 类 时间戳 代表独立于任何时区或当地时间点 日历,编码为秒数和分数秒数 纳秒分辨率。 计数时间是UTC午夜时段 1970年1月1日,在延长Gregorian日历中 格雷高历倒向了第一年.
所有分钟都是60秒长。 漏出秒数是"相思"的,所以不会跳跃 口译需要第二表,使用 24小时线性 涂鸦。 。 。 .
范围从0001-01-01T00:00:00Z到9999-12-31T23:59:99999999Z. 以 我们保证,我们可在此范围内进行改造 RFC (RFC ) (法语) 3339 (英语) 日期字符串.
实例
例1:计算 时间戳 从POSIX调用 time()。 。 。 .
<a href="#timestamp">Timestamp</a> timestamp;
timestamp.set_seconds(time(NULL));
timestamp.set_nanos(0);
示例2:计算 时间戳 从POSIX调用 gettimeofday()。 。 。 .
struct timeval tv;
gettimeofday(&tv, NULL);
<a href="#timestamp">Timestamp</a> timestamp;
timestamp.set_seconds(tv.tv_sec);
timestamp.set_nanos(tv.tv_usec * 1000);
例3:计算 时间戳 从 Win32 GetSystemTimeAsFileTime()。 。 。 .
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
// A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
// is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
<a href="#timestamp">Timestamp</a> timestamp;
timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
例4:计算 时间戳 从 Java 中 System.currentTimeMillis()。 。 。 .
long millis = System.currentTimeMillis();
<a href="#timestamp">Timestamp</a> timestamp = <a href="#timestamp">Timestamp</a>.newBuilder().setSeconds(millis / 1000)
.setNanos((int) ((millis % 1000) * 1000000)).build();
例5:计算 时间戳 从 Java 中 Instant.now()。 。 。 .
Instant now = Instant.now();
<a href="#timestamp">Timestamp</a> timestamp =
<a href="#timestamp">Timestamp</a>.newBuilder().setSeconds(now.getEpochSecond())
.setNanos(now.getNano()).build();
例6:计算 时间戳 从现在的 Python.
timestamp = <a href="#timestamp">Timestamp</a>()
timestamp.GetCurrentTime()
JSON 绘图
在JSON格式中 时间戳 类型在 RFC 3339 (法语) 格式。 这就是 格式为“{年}-{月}-{日}T{小时}:{min}:{sec}[.{frac sec] 兹" 在 {年份} 总是用 {month} 、{day} 的四位数表示, {hour},{min},和{sec}各为零加到两位数 。 分数 秒,最多可达9位数(即可达1纳秒分辨率), 是可选的。 Z后缀表示时区 ("UTC"); 时区 需要时间。 原型3 JSON 序列器应始终使用世界协调时(如 (Z) 打印时 时间戳 类型和原型3 JSON 剖析器应为 能够同时接受协调世界时和其他时区(如冲抵所示).
例如:"2017-01-15T01:30:15.01Z"编码为15.01秒过去 协调世界时2017年1月15日01:30.
在 JavaScript 中,可以使用
标准
to ISO String () (中文(简体) )
方法。 在Python,一个标准 datetime.datetime 对象可以转换
使用
strftime 与
时间格式 “%Y-%m-%dT%H:%M:%S.%fZ”。 同样,在爪哇,人们可以使用
乔达时间 ISODateTimeFormat.dateTime() 以获取一个能够以这种格式生成时间戳的材料.
| Prop | 类型 | 说明 |
|---|---|---|
seconds | string | 代表自Unix Epoch 1970-01-01T00:00Z起协调世界时时间的秒. 必须是从0001-01-01T00:00Z到9999-12-31T23:59:59Z包含. |
nanos | number | 在纳秒分辨率下为一秒的非负分. 带有分数的负二等值仍必须具有非负二等纳米值,在时间上可以向前计数. 一定是从0到999,999,999 包括. |
结构
Struct 代表结构化数据值,由字段组成
哪个映射到动态输入值。 在某些语言中, Struct
可由本地代表支持。 例如,在
象JS一样的文字语言
对象。 详细情况一并介绍
与原始支持的语言.
JSON代表 Struct 是 JSON 对象.
| Prop | 类型 | 说明 |
|---|---|---|
fields | { [key: string]: Value; } | 动态输入值的无序映射 . |
数值
Value 表示一个动态键入的值,可以是
无,一个数字,一个字符串,一个布尔,一个递归结构值,或者
数值列表。 价值的生产者预计将确定其中之一
变相. 没有任何变体表示错误.
JSON代表 Value 这是JSON值.
| Prop | 类型 |
|---|---|
kind | { oneofKind: 'nullValue'; nullValue: NullValue; } | { oneofKind: 'numberValue'; numberValue: number; } | { oneofKind: 'stringValue'; stringValue: string; } | { oneofKind: 'boolValue'; boolValue: boolean; } | { oneofKind: 'structValue'; structValue: Struct; } | { oneofKind: 'listValue'; listValue: ListValue; } | { oneofKind: undefined; } |
列表值
ListValue 是一个围绕一个重复的值域的包裹.
JSON代表 ListValue 是JSON阵列.
| Prop | 类型 | 说明 |
|---|---|---|
values | Value[] | 重复的动态输入值域 . |
参加人数
| Prop | 类型 | 说明 |
|---|---|---|
total | number | 该电话的参与者总数,包括匿名参与者. |
anonymous | number | 该电话匿名参与者总数. |
键
| Prop | 类型 | 说明 |
|---|---|---|
userId | string | 要标注的用户 |
sessionId | string | 用户 sision id 针,如果不提供,则适用于所有会话 |
调用成员
| Prop | 类型 | 说明 |
|---|---|---|
userId | string | 成员的用户身份 |
name | string | 显示用户名称 |
imageURL | string | 用户配置图像 URL |
role | string | 用户在呼叫中的作用 |
来电通话费
| Prop | 类型 | 说明 |
|---|---|---|
cid | string | 全称 CID( 如默认: 123) |
type | 'incoming' | 事件类型( 目前始终为" 来" ) |
caller | CallMember | 关于打电话者的信息 |
custom | Record< string, | string | boolean | number | null | Record<string, string | boolean | number | null> | string[] | boolean[] | number[] > | 自定义数据传递给呼叫 |
| 方法 | 签署 | 说明 |
|---|---|---|
| 获取 PluginVersion | ()QQ承诺QQ版本:字符串;QQ | 获取本地 Capacitor 插件版本 |
相机启用响应
| Prop | 类型 |
|---|---|
enabled | boolean |
动态ApiKey响应
| Prop | 类型 | 说明 |
|---|---|---|
apiKey | string | null | 如果设置了动态 API 密钥, 则无效 |
hasDynamicKey | boolean | 目前是否设置了动态密钥 |
当前用户响应
| Prop | 类型 | 说明 |
|---|---|---|
userId | string | 当前用户的用户ID |
name | string | 显示当前用户的名称 |
imageURL | string | 当前用户的外观 URL |
isLoggedIn | boolean | 用户是否正在登录 |
类型异名
调用类型
'default' | 'audio' | 'audio_room' | 'livestream' | 'development'
记录
构造 T 类型 K 的一组属性类型
{
[P in K]: T;
}
呼叫状态
'idle' | 'ringing' | 'joining' | 'reconnecting' | 'joined' | 'leaving' | 'left' | 'created' | 'session_started' | 'rejected' | 'participant_counts' | 'missed' | 'accepted' | 'ended' | 'camera_enabled' | 'camera_disabled' | 'speaker_enabled' | 'speaker_disabled' | 'microphone_enabled' | 'microphone_disabled' | 'outgoing_call_ended' | 'unknown'
串流呼叫拉尤特
'grid' | 'spotlight' | 'dynamic' | 'fullScreen' | 'fullscreen'
数字
音轨类型
| 成员 | 数值 |
|---|---|
UNSPECIFIED | 0 |
AUDIO | 1 |
VIDEO | 2 |
SCREEN_SHARE | 3 |
SCREEN_SHARE_AUDIO | 4 |
连接质量
| 成员 | 数值 |
|---|---|
UNSPECIFIED | 0 |
POOR | 1 |
GOOD | 2 |
EXCELLENT | 3 |
数值
| 成员 | 数值 | 说明 |
|---|---|---|
NULL_VALUE | 0 | 虚值. |