Guida introduttiva
Copy a setup prompt with the install steps and the full markdown guide for this plugin.
Set up this Capacitor plugin in the project.
Use the package manager already used by the project.
Install these package(s): `@capgo/capacitor-streamcall`
Run the required Capacitor sync/update step after installation.
Read this markdown guide for the full setup steps: https://raw.githubusercontent.com/Cap-go/website/refs/heads/main/apps/docs/src/content/docs/it/docs/plugins/streamcall/getting-started.mdx
Use that guide for platform-specific steps, native file edits, permissions, config changes, imports, and usage setup.
If that guide references other docs pages, read them too.
Installazione
Section titled “Installazione”npm install @capgo/capacitor-stream-callnpx cap syncyarn add @capgo/capacitor-stream-callnpx cap syncpnpm add @capgo/capacitor-stream-callnpx cap syncbun add @capgo/capacitor-stream-callnpx cap syncPrerequisiti
Section titled “Prerequisiti”Avrai bisogno di un account Stream e delle credenziali API. Registrati su Stream se non ne hai uno.
Configurazione della piattaforma
Section titled “Configurazione della piattaforma”Aggiungi i permessi richiesti al tuo Info.plist:
<key>NSCameraUsageDescription</key><string>Questa app necessita dell'accesso alla fotocamera per le videochiamate</string><key>NSMicrophoneUsageDescription</key><string>Questa app necessita dell'accesso al microfono per le videochiamate</string>Android
Section titled “Android”Aggiungi i permessi richiesti al tuo 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" />Esempio di utilizzo
Section titled “Esempio di utilizzo”import { StreamCall } from '@capgo/capacitor-stream-call';
// Inizializza Stream SDKawait StreamCall.initialize({ apiKey: 'your-stream-api-key', userId: 'user-123', userToken: 'user-token'});
// Crea una chiamataawait StreamCall.createCall({ callId: 'call-123', callType: 'default'});
// Partecipa a una chiamataawait StreamCall.joinCall({ callId: 'call-123'});
// Abilita/disabilita fotocameraawait StreamCall.toggleCamera({ enabled: true});
// Abilita/disabilita microfonoawait StreamCall.toggleMicrophone({ enabled: true});
// Cambia fotocamera (anteriore/posteriore)await StreamCall.switchCamera();
// Lascia la chiamataawait StreamCall.leaveCall();
// Ascolta gli eventi della chiamataStreamCall.addListener('callStarted', (data) => { console.log('Chiamata avviata:', data);});
StreamCall.addListener('callEnded', (data) => { console.log('Chiamata terminata:', data);});
StreamCall.addListener('participantJoined', (data) => { console.log('Partecipante entrato:', data);});
StreamCall.addListener('participantLeft', (data) => { console.log('Partecipante uscito:', data);});Riferimento API
Section titled “Riferimento API”initialize(options)
Section titled “initialize(options)”initialize(options: InitializeOptions) => Promise<void>Inizializza Stream Video SDK.
| Param | Type |
|---|---|
options | InitializeOptions |
createCall(options)
Section titled “createCall(options)”createCall(options: CreateCallOptions) => Promise<void>Crea una nuova videochiamata.
| Param | Type |
|---|---|
options | CreateCallOptions |
joinCall(options)
Section titled “joinCall(options)”joinCall(options: JoinCallOptions) => Promise<void>Partecipa a una videochiamata esistente.
| Param | Type |
|---|---|
options | JoinCallOptions |
leaveCall()
Section titled “leaveCall()”leaveCall() => Promise<void>Lascia la chiamata corrente.
toggleCamera(options)
Section titled “toggleCamera(options)”toggleCamera(options: { enabled: boolean }) => Promise<void>Abilita o disabilita la fotocamera.
| Param | Type |
|---|---|
options | { enabled: boolean } |
toggleMicrophone(options)
Section titled “toggleMicrophone(options)”toggleMicrophone(options: { enabled: boolean }) => Promise<void>Abilita o disabilita il microfono.
| Param | Type |
|---|---|
options | { enabled: boolean } |
switchCamera()
Section titled “switchCamera()”switchCamera() => Promise<void>Passa tra fotocamera anteriore e posteriore.
setSpeakerphone(options)
Section titled “setSpeakerphone(options)”setSpeakerphone(options: { enabled: boolean }) => Promise<void>Abilita o disabilita il vivavoce.
| Param | Type |
|---|---|
options | { enabled: boolean } |
sendCallInvite(options)
Section titled “sendCallInvite(options)”sendCallInvite(options: InviteOptions) => Promise<void>Invia un invito di chiamata a un utente.
| Param | Type |
|---|---|
options | InviteOptions |
acceptCall(options)
Section titled “acceptCall(options)”acceptCall(options: { callId: string }) => Promise<void>Accetta una chiamata in arrivo.
| Param | Type |
|---|---|
options | { callId: string } |
rejectCall(options)
Section titled “rejectCall(options)”rejectCall(options: { callId: string }) => Promise<void>Rifiuta una chiamata in arrivo.
| Param | Type |
|---|---|
options | { callId: string } |
Interfacce
Section titled “Interfacce”InitializeOptions
Section titled “InitializeOptions”| Prop | Type | Description |
|---|---|---|
apiKey | string | Chiave API Stream |
userId | string | ID utente |
userToken | string | Token di autenticazione utente |
userName | string | Nome visualizzato dell’utente (opzionale) |
userImage | string | URL immagine profilo utente (opzionale) |
CreateCallOptions
Section titled “CreateCallOptions”| Prop | Type | Description |
|---|---|---|
callId | string | Identificatore univoco della chiamata |
callType | string | Tipo di chiamata (es. ‘default’, ‘audio-only’) |
members | string[] | Array di ID utente da invitare (opzionale) |
JoinCallOptions
Section titled “JoinCallOptions”| Prop | Type | Description |
|---|---|---|
callId | string | ID della chiamata a cui partecipare |
InviteOptions
Section titled “InviteOptions”| Prop | Type | Description |
|---|---|---|
callId | string | ID chiamata |
userId | string | ID utente da invitare |
Event Listener
Section titled “Event Listener”Eventi disponibili
Section titled “Eventi disponibili”callStarted- La chiamata è iniziatacallEnded- La chiamata è terminataparticipantJoined- Un partecipante è entrato nella chiamataparticipantLeft- Un partecipante ha lasciato la chiamataincomingCall- Chiamata in arrivo ricevutacallAccepted- La chiamata è stata accettatacallRejected- La chiamata è stata rifiutataerror- Si è verificato un errore
Esempio di evento
Section titled “Esempio di evento”// Ascolta le chiamate in arrivoStreamCall.addListener('incomingCall', (data) => { console.log('Chiamata in arrivo da:', data.callerId); console.log('Nome chiamante:', data.callerName);
// Mostra interfaccia chiamata in arrivo showIncomingCallScreen({ callerId: data.callerId, callerName: data.callerName, callerImage: data.callerImage, callId: data.callId });});
// Ascolta l'accettazione della chiamataStreamCall.addListener('callAccepted', (data) => { console.log('Chiamata accettata'); // Naviga alla schermata di chiamata});
// Ascolta gli erroriStreamCall.addListener('error', (error) => { console.error('Errore chiamata:', error.message); // Gestisci l'errore in modo appropriato});
// Rimuovi listener quando fattoconst listener = await StreamCall.addListener('callStarted', (data) => { console.log('Chiamata avviata');});
// Più tardi...listener.remove();Esempio completo
Section titled “Esempio completo”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('Inizializzazione Stream fallita:', error); } }
setupEventListeners() { // Gestisci chiamate in arrivo 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 }); } });
// Gestisci eventi chiamata StreamCall.addListener('callStarted', () => { console.log('Chiamata avviata'); });
StreamCall.addListener('callEnded', () => { console.log('Chiamata terminata'); this.navigateToHome(); });
StreamCall.addListener('participantJoined', (data) => { console.log('Partecipante entrato:', data.participantName); }); }
async startCall(recipientId: string) { try { const callId = `call-${Date.now()}`;
// Crea e partecipa alla chiamata await StreamCall.createCall({ callId: callId, callType: 'default', members: [recipientId] });
await StreamCall.joinCall({ callId: callId });
// Invia invito await StreamCall.sendCallInvite({ callId: callId, userId: recipientId });
console.log('Chiamata avviata'); } catch (error) { console.error('Avvio chiamata fallito:', error); } }
async endCall() { try { await StreamCall.leaveCall(); console.log('Chiamata terminata'); } catch (error) { console.error('Termine chiamata fallito:', 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> { // Recupera token utente dal tuo 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> { // Mostra finestra di dialogo nativa o interfaccia personalizzata return confirm(`Chiamata in arrivo da ${data.callerName}`); }
private navigateToHome() { // Naviga alla schermata principale window.location.href = '/'; }}
// Utilizzoconst videoCall = new VideoCallService();await videoCall.initialize('user-123', 'John Doe');
// Avvia una chiamataawait videoCall.startCall('user-456');
// Attiva/disattiva controlliawait videoCall.toggleVideo(false); // Disabilita videoawait videoCall.toggleAudio(false); // Silenziaawait videoCall.flipCamera(); // Cambia fotocamera
// Termina chiamataawait videoCall.endCall();Best practice
Section titled “Best practice”- Inizializza l’SDK all’inizio del ciclo di vita della tua app
- Gestisci le richieste di permessi prima di avviare chiamate
- Implementa una corretta gestione degli errori per problemi di rete
- Pulisci i listener quando i componenti vengono smontati
- Testa su dispositivi reali (non solo emulatori)
- Implementa logica di riconnessione per interruzioni di rete
- Fornisci feedback visivo per gli stati della chiamata
- Gestisci le transizioni background/foreground
Localizzazione
Section titled “Localizzazione”Il plugin supporta più lingue per elementi dell’interfaccia utente nativi. Configura nelle impostazioni specifiche della piattaforma.
Casi d’uso
Section titled “Casi d’uso”- Videochiamate uno a uno
- Videoconferenze di gruppo
- Chiamate solo audio
- Sessioni di condivisione schermo
- Chat video per assistenza clienti
- Consultazioni di telemedicina
- Collaborazione remota