Saltar al contenido

Comenzando

Terminal window
npm install @capgo/capacitor-stream-call
npx cap sync

Necesitarás una cuenta de Stream y credenciales de API. Regístrate en Stream si no tienes una.

Agrega los permisos requeridos a tu Info.plist:

<key>NSCameraUsageDescription</key>
<string>Esta aplicación necesita acceso a la cámara para videollamadas</string>
<key>NSMicrophoneUsageDescription</key>
<string>Esta aplicación necesita acceso al micrófono para videollamadas</string>

Agrega los permisos requeridos a tu AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
import { StreamCall } from '@capgo/capacitor-stream-call';
// Inicializar Stream SDK
await StreamCall.initialize({
apiKey: 'tu-stream-api-key',
userId: 'user-123',
userToken: 'user-token'
});
// Crear una llamada
await StreamCall.createCall({
callId: 'call-123',
callType: 'default'
});
// Unirse a una llamada
await StreamCall.joinCall({
callId: 'call-123'
});
// Habilitar/deshabilitar cámara
await StreamCall.toggleCamera({
enabled: true
});
// Habilitar/deshabilitar micrófono
await StreamCall.toggleMicrophone({
enabled: true
});
// Cambiar cámara (frontal/trasera)
await StreamCall.switchCamera();
// Salir de la llamada
await StreamCall.leaveCall();
// Escuchar eventos de llamada
StreamCall.addListener('callStarted', (data) => {
console.log('Llamada iniciada:', data);
});
StreamCall.addListener('callEnded', (data) => {
console.log('Llamada terminada:', data);
});
StreamCall.addListener('participantJoined', (data) => {
console.log('Participante se unió:', data);
});
StreamCall.addListener('participantLeft', (data) => {
console.log('Participante salió:', data);
});
initialize(options: InitializeOptions) => Promise<void>

Inicializa el Stream Video SDK.

ParamType
optionsInitializeOptions
createCall(options: CreateCallOptions) => Promise<void>

Crea una nueva videollamada.

ParamType
optionsCreateCallOptions
joinCall(options: JoinCallOptions) => Promise<void>

Únete a una videollamada existente.

ParamType
optionsJoinCallOptions
leaveCall() => Promise<void>

Sal de la llamada actual.

toggleCamera(options: { enabled: boolean }) => Promise<void>

Habilita o deshabilita la cámara.

ParamType
options{ enabled: boolean }
toggleMicrophone(options: { enabled: boolean }) => Promise<void>

Habilita o deshabilita el micrófono.

ParamType
options{ enabled: boolean }
switchCamera() => Promise<void>

Cambia entre cámara frontal y trasera.

setSpeakerphone(options: { enabled: boolean }) => Promise<void>

Habilita o deshabilita el altavoz.

ParamType
options{ enabled: boolean }
sendCallInvite(options: InviteOptions) => Promise<void>

Envía una invitación de llamada a un usuario.

ParamType
optionsInviteOptions
acceptCall(options: { callId: string }) => Promise<void>

Acepta una llamada entrante.

ParamType
options{ callId: string }
rejectCall(options: { callId: string }) => Promise<void>

Rechaza una llamada entrante.

ParamType
options{ callId: string }
PropTypeDescription
apiKeystringClave API de Stream
userIdstringID de usuario
userTokenstringToken de autenticación de usuario
userNamestringNombre para mostrar del usuario (opcional)
userImagestringURL de imagen de perfil del usuario (opcional)
PropTypeDescription
callIdstringIdentificador único de llamada
callTypestringTipo de llamada (ej., ‘default’, ‘audio-only’)
membersstring[]Array de IDs de usuario para invitar (opcional)
PropTypeDescription
callIdstringID de llamada para unirse
PropTypeDescription
callIdstringID de llamada
userIdstringID de usuario para invitar
  • callStarted - La llamada ha iniciado
  • callEnded - La llamada ha terminado
  • participantJoined - Un participante se unió a la llamada
  • participantLeft - Un participante salió de la llamada
  • incomingCall - Llamada entrante recibida
  • callAccepted - La llamada fue aceptada
  • callRejected - La llamada fue rechazada
  • error - Ocurrió un error
// Escuchar llamadas entrantes
StreamCall.addListener('incomingCall', (data) => {
console.log('Llamada entrante de:', data.callerId);
console.log('Nombre del llamante:', data.callerName);
// Mostrar UI de llamada entrante
showIncomingCallScreen({
callerId: data.callerId,
callerName: data.callerName,
callerImage: data.callerImage,
callId: data.callId
});
});
// Escuchar aceptación de llamada
StreamCall.addListener('callAccepted', (data) => {
console.log('Llamada aceptada');
// Navegar a la pantalla de llamada
});
// Escuchar errores
StreamCall.addListener('error', (error) => {
console.error('Error de llamada:', error.message);
// Manejar el error apropiadamente
});
// Remover listener cuando termine
const listener = await StreamCall.addListener('callStarted', (data) => {
console.log('Llamada iniciada');
});
// Más tarde...
listener.remove();
import { StreamCall } from '@capgo/capacitor-stream-call';
class VideoCallService {
async initialize(userId: string, userName: string) {
try {
await StreamCall.initialize({
apiKey: 'tu-stream-api-key',
userId: userId,
userToken: await this.getUserToken(userId),
userName: userName
});
this.setupEventListeners();
} catch (error) {
console.error('Fallo al inicializar Stream:', error);
}
}
setupEventListeners() {
// Manejar llamadas entrantes
StreamCall.addListener('incomingCall', async (data) => {
const accepted = await this.showIncomingCallDialog(data);
if (accepted) {
await StreamCall.acceptCall({ callId: data.callId });
await StreamCall.joinCall({ callId: data.callId });
} else {
await StreamCall.rejectCall({ callId: data.callId });
}
});
// Manejar eventos de llamada
StreamCall.addListener('callStarted', () => {
console.log('Llamada iniciada');
});
StreamCall.addListener('callEnded', () => {
console.log('Llamada terminada');
this.navigateToHome();
});
StreamCall.addListener('participantJoined', (data) => {
console.log('Participante se unió:', data.participantName);
});
}
async startCall(recipientId: string) {
try {
const callId = `call-${Date.now()}`;
// Crear y unirse a la llamada
await StreamCall.createCall({
callId: callId,
callType: 'default',
members: [recipientId]
});
await StreamCall.joinCall({ callId: callId });
// Enviar invitación
await StreamCall.sendCallInvite({
callId: callId,
userId: recipientId
});
console.log('Llamada iniciada');
} catch (error) {
console.error('Fallo al iniciar llamada:', error);
}
}
async endCall() {
try {
await StreamCall.leaveCall();
console.log('Llamada terminada');
} catch (error) {
console.error('Fallo al terminar llamada:', error);
}
}
async toggleVideo(enabled: boolean) {
await StreamCall.toggleCamera({ enabled });
}
async toggleAudio(enabled: boolean) {
await StreamCall.toggleMicrophone({ enabled });
}
async flipCamera() {
await StreamCall.switchCamera();
}
private async getUserToken(userId: string): Promise<string> {
// Obtener token de usuario de tu backend
const response = await fetch(`/api/stream-token?userId=${userId}`);
const data = await response.json();
return data.token;
}
private async showIncomingCallDialog(data: any): Promise<boolean> {
// Mostrar diálogo nativo o UI personalizada
return confirm(`Llamada entrante de ${data.callerName}`);
}
private navigateToHome() {
// Navegar a la pantalla de inicio
window.location.href = '/';
}
}
// Uso
const videoCall = new VideoCallService();
await videoCall.initialize('user-123', 'John Doe');
// Iniciar una llamada
await videoCall.startCall('user-456');
// Alternar controles
await videoCall.toggleVideo(false); // Deshabilitar video
await videoCall.toggleAudio(false); // Silenciar
await videoCall.flipCamera(); // Cambiar cámara
// Terminar llamada
await videoCall.endCall();
  • Inicializa el SDK temprano en el ciclo de vida de tu aplicación
  • Maneja las solicitudes de permisos antes de iniciar llamadas
  • Implementa manejo de errores adecuado para problemas de red
  • Limpia los listeners cuando los componentes se desmonten
  • Prueba en dispositivos reales (no solo emuladores)
  • Implementa lógica de reconexión para interrupciones de red
  • Proporciona retroalimentación visual para estados de llamada
  • Maneja transiciones background/foreground

El plugin soporta múltiples idiomas para elementos UI nativos. Configura en tus ajustes específicos de plataforma.

  • Videollamadas uno a uno
  • Videoconferencias grupales
  • Llamadas solo de audio
  • Sesiones de compartir pantalla
  • Chat de video de soporte al cliente
  • Consultas de telemedicina
  • Colaboración remota