fix(phone): Anruf-Erkennung im Hintergrund + bei gesperrtem Display
Symptom: App bekommt im minimierten oder display-gesperrten Zustand nicht mit ob ein Anruf angefangen oder beendet wurde — TTS spricht weiter waehrend Telefon klingelt, oder bleibt stumm nach Auflegen. Zwei Ursachen: 1) Kotlin: TelephonyCallback war auf reactApplicationContext.mainExecutor registriert. Wenn die Activity pausiert ist (display aus, App im Hintergrund), wird der mainExecutor verzoegert oder gar nicht abgearbeitet — Call-State-Events kommen nicht durch. Fix: eigener Executors.newSingleThreadExecutor() — laeuft unabhaengig vom UI-Thread solange der App-Prozess lebt (Foreground-Service garantiert das). 2) TS: TelephonyManager-Listener kann nach laengerer Hintergrund-Zeit verloren gehen (React-Bridge-Context recreated nach Resume). Fix: neue refresh()-Methode in phoneCallService, AppState-Resume ruft sie auf — wenn telephonyAttached=false ist, wird der Native- Listener neu attached. Plus: Status-Property telephonyAttached macht in Logs sichtbar ob Pfad 1 (TelephonyManager) wirklich greift. Pfad 2 (AudioFocus fuer VoIP) war nie betroffen, der laeuft komplett im Native-Code. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -15,6 +15,7 @@ import com.facebook.react.bridge.ReactApplicationContext
|
||||
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
||||
import com.facebook.react.bridge.ReactMethod
|
||||
import com.facebook.react.modules.core.DeviceEventManagerModule
|
||||
import java.util.concurrent.Executors
|
||||
|
||||
/**
|
||||
* Lauscht auf Anruf-Statusaenderungen — wenn das Telefon klingelt oder ein
|
||||
@@ -35,6 +36,11 @@ class PhoneCallModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
|
||||
private var legacyListener: PhoneStateListener? = null
|
||||
private var modernCallback: Any? = null // TelephonyCallback ab API 31
|
||||
private var lastState: Int = TelephonyManager.CALL_STATE_IDLE
|
||||
// Eigener Single-Thread-Executor statt mainExecutor — der wird bei
|
||||
// pausierter Activity verzoegert oder gar nicht abgearbeitet, der eigene
|
||||
// Thread laeuft unabhaengig solange der App-Prozess lebt (was er ja tut,
|
||||
// wir haben einen Foreground-Service der das garantiert).
|
||||
private val callbackExecutor = Executors.newSingleThreadExecutor()
|
||||
|
||||
@ReactMethod
|
||||
fun start(promise: Promise) {
|
||||
@@ -59,7 +65,7 @@ class PhoneCallModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
|
||||
handleStateChange(state)
|
||||
}
|
||||
}
|
||||
tm.registerTelephonyCallback(reactApplicationContext.mainExecutor, cb)
|
||||
tm.registerTelephonyCallback(callbackExecutor, cb)
|
||||
modernCallback = cb
|
||||
} else {
|
||||
@Suppress("DEPRECATION")
|
||||
|
||||
Reference in New Issue
Block a user