Guida introduttiva
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