Langsung ke konten

Memulai

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

Anda memerlukan akun Stream dan kredensial API. Daftar di Stream jika Anda belum memilikinya.

Tambahkan izin yang diperlukan ke Info.plist Anda:

<key>NSCameraUsageDescription</key>
<string>This app needs camera access for video calls</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs microphone access for video calls</string>

Tambahkan izin yang diperlukan ke AndroidManifest.xml Anda:

<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';
// Initialize Stream SDK
await StreamCall.initialize({
apiKey: 'your-stream-api-key',
userId: 'user-123',
userToken: 'user-token'
});
// Create a call
await StreamCall.createCall({
callId: 'call-123',
callType: 'default'
});
// Join a call
await StreamCall.joinCall({
callId: 'call-123'
});
// Enable/disable camera
await StreamCall.toggleCamera({
enabled: true
});
// Enable/disable microphone
await StreamCall.toggleMicrophone({
enabled: true
});
// Switch camera (front/back)
await StreamCall.switchCamera();
// Leave the call
await StreamCall.leaveCall();
// Listen for call events
StreamCall.addListener('callStarted', (data) => {
console.log('Call started:', data);
});
StreamCall.addListener('callEnded', (data) => {
console.log('Call ended:', data);
});
StreamCall.addListener('participantJoined', (data) => {
console.log('Participant joined:', data);
});
StreamCall.addListener('participantLeft', (data) => {
console.log('Participant left:', data);
});
initialize(options: InitializeOptions) => Promise<void>

Inisialisasi Stream Video SDK.

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

Buat panggilan video baru.

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

Bergabung dengan panggilan video yang ada.

ParamType
optionsJoinCallOptions
leaveCall() => Promise<void>

Keluar dari panggilan saat ini.

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

Aktifkan atau nonaktifkan kamera.

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

Aktifkan atau nonaktifkan mikrofon.

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

Beralih antara kamera depan dan belakang.

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

Aktifkan atau nonaktifkan speakerphone.

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

Kirim undangan panggilan ke pengguna.

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

Terima panggilan masuk.

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

Tolak panggilan masuk.

ParamType
options{ callId: string }
PropTypeDescription
apiKeystringStream API key
userIdstringUser ID
userTokenstringUser authentication token
userNamestringUser display name (optional)
userImagestringUser profile image URL (optional)
PropTypeDescription
callIdstringUnique call identifier
callTypestringCall type (e.g., ‘default’, ‘audio-only’)
membersstring[]Array of user IDs to invite (optional)
PropTypeDescription
callIdstringCall ID to join
PropTypeDescription
callIdstringCall ID
userIdstringUser ID to invite
  • callStarted - Panggilan telah dimulai
  • callEnded - Panggilan telah berakhir
  • participantJoined - Peserta bergabung dengan panggilan
  • participantLeft - Peserta meninggalkan panggilan
  • incomingCall - Panggilan masuk diterima
  • callAccepted - Panggilan telah diterima
  • callRejected - Panggilan telah ditolak
  • error - Terjadi kesalahan
// Listen for incoming calls
StreamCall.addListener('incomingCall', (data) => {
console.log('Incoming call from:', data.callerId);
console.log('Caller name:', data.callerName);
// Show incoming call UI
showIncomingCallScreen({
callerId: data.callerId,
callerName: data.callerName,
callerImage: data.callerImage,
callId: data.callId
});
});
// Listen for call acceptance
StreamCall.addListener('callAccepted', (data) => {
console.log('Call accepted');
// Navigate to call screen
});
// Listen for errors
StreamCall.addListener('error', (error) => {
console.error('Call error:', error.message);
// Handle error appropriately
});
// Remove listener when done
const listener = await StreamCall.addListener('callStarted', (data) => {
console.log('Call started');
});
// Later...
listener.remove();
import { StreamCall } from '@capgo/capacitor-stream-call';
class VideoCallService {
async initialize(userId: string, userName: string) {
try {
await StreamCall.initialize({
apiKey: 'your-stream-api-key',
userId: userId,
userToken: await this.getUserToken(userId),
userName: userName
});
this.setupEventListeners();
} catch (error) {
console.error('Failed to initialize Stream:', error);
}
}
setupEventListeners() {
// Handle incoming calls
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 });
}
});
// Handle call events
StreamCall.addListener('callStarted', () => {
console.log('Call started');
});
StreamCall.addListener('callEnded', () => {
console.log('Call ended');
this.navigateToHome();
});
StreamCall.addListener('participantJoined', (data) => {
console.log('Participant joined:', data.participantName);
});
}
async startCall(recipientId: string) {
try {
const callId = `call-${Date.now()}`;
// Create and join call
await StreamCall.createCall({
callId: callId,
callType: 'default',
members: [recipientId]
});
await StreamCall.joinCall({ callId: callId });
// Send invitation
await StreamCall.sendCallInvite({
callId: callId,
userId: recipientId
});
console.log('Call started');
} catch (error) {
console.error('Failed to start call:', error);
}
}
async endCall() {
try {
await StreamCall.leaveCall();
console.log('Call ended');
} catch (error) {
console.error('Failed to end call:', 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> {
// Fetch user token from your 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> {
// Show native dialog or custom UI
return confirm(`Incoming call from ${data.callerName}`);
}
private navigateToHome() {
// Navigate to home screen
window.location.href = '/';
}
}
// Usage
const videoCall = new VideoCallService();
await videoCall.initialize('user-123', 'John Doe');
// Start a call
await videoCall.startCall('user-456');
// Toggle controls
await videoCall.toggleVideo(false); // Disable video
await videoCall.toggleAudio(false); // Mute
await videoCall.flipCamera(); // Switch camera
// End call
await videoCall.endCall();
  • Inisialisasi SDK lebih awal dalam siklus hidup aplikasi Anda
  • Tangani permintaan izin sebelum memulai panggilan
  • Implementasikan penanganan error yang tepat untuk masalah jaringan
  • Bersihkan listener ketika komponen di-unmount
  • Uji pada perangkat nyata (bukan hanya emulator)
  • Implementasikan logika reconnection untuk gangguan jaringan
  • Berikan umpan balik visual untuk status panggilan
  • Tangani transisi background/foreground

Plugin mendukung banyak bahasa untuk elemen UI native. Konfigurasi di pengaturan spesifik platform Anda.

  • Panggilan video satu-lawan-satu
  • Konferensi video grup
  • Panggilan audio saja
  • Sesi berbagi layar
  • Obrolan video dukungan pelanggan
  • Konsultasi telemedicine
  • Kolaborasi jarak jauh