diff --git a/android/src/services/phoneCall.ts b/android/src/services/phoneCall.ts index 0a8a739..aac67a9 100644 --- a/android/src/services/phoneCall.ts +++ b/android/src/services/phoneCall.ts @@ -126,13 +126,24 @@ class PhoneCallService { } } - /** AudioFocus-Loss = irgendeine andere App hat das Mikro/die Audio-Pipeline - * uebernommen — typisch VoIP-Apps bei eingehendem Anruf, aber auch System- - * Voice-Assistants etc. */ - private _onFocusChanged(type: 'loss' | 'loss_transient' | 'gain'): void { + /** AudioFocus-Loss = irgendeine andere App hat den Focus uebernommen. + * Das passiert bei VoIP-Anrufen (was wir wollen) ABER auch bei normalen + * Audio-Playern (anderer Player startet, Notification-Sound, sogar + * unsere eigenen Sound-Calls beim Play-Button). Daher checken wir den + * AudioMode — nur IN_CALL (2) oder IN_COMMUNICATION (3) zaehlt als Anruf. */ + private async _onFocusChanged(type: 'loss' | 'loss_transient' | 'gain'): Promise { if (type === 'loss' || type === 'loss_transient') { // Schon durch klassischen TelephonyManager pausiert? Dann nichts doppeln. if (this.lastState === 'ringing' || this.lastState === 'offhook') return; + // Mode pruefen — nur echte Anrufe behandeln. + let mode = -1; + try { mode = await (NativeModules.AudioFocus as any)?.getMode?.(); } catch {} + if (mode !== 2 && mode !== 3) { + // NORMAL-Mode → kein Anruf (Stefan hat z.B. Play-Button gedrueckt + // oder Spotify hat sich neu reingedraengelt). Keine Toasts. + console.log('[PhoneCall] FOCUS_LOSS ignoriert (AudioMode=%d, kein Call)', mode); + return; + } this.interruptedByFocus = true; this._haltForCall('Anruf erkannt (VoIP) — ARIA pausiert'); // Pollen, weil GAIN nicht zuverlaessig kommt (wir releasen den Focus