fix(android): pass PROTOCOL_DNS_SD so mDNS registration works

Android 16 added NsdManager.checkProtocol(): registerService with protocol
0 threw IllegalArgumentException: Unsupported protocol — silently, since
the old code swallowed the exception into a dead reflection fallback and
start() overwrote the failure status with the Listening line. mDNS never
actually advertised (the Phase 8 session streamed via --peer, masking it).

Also advertise after the listening status so a registration failure stays
visible, and log the exception and the registration success.

Validated live on the Fairphone 6: the desktop --discover lists the phone
and a full --send session decodes (in-band SPS 320x240 -> 2496x1040) and
renders.
This commit is contained in:
2026-09-10 12:35:00 +02:00
parent c6722d164b
commit 9a24933203
4 changed files with 53 additions and 2 deletions
+7
View File
@@ -114,6 +114,13 @@ existing signaling + RTP protocol; no C++ changes.
depacketizer — 25 tests green)
- [x] 8.3 Signaling + NSD validated on device (offer → answer over the
network; mDNS registration via the API-36 RegistrationListener)
**correction 2026-09-10**: registration had in fact never
succeeded (registerService passed protocol `0`, which API 36
rejects with "Unsupported protocol"; the swallowed failure was
hidden behind the "Listening…" status). Fixed with
`PROTOCOL_DNS_SD` + real on-device validation: desktop
`--discover` lists the phone and a live `--send` session
decodes and renders.
- [x] 8.4 MediaCodec decode + Surface render validated on device (in-band
SPS sizing, letterbox fit)
- [x] 8.5 End-to-end on a Fairphone 6 (Android 16): streaming, letterboxed
+10
View File
@@ -240,6 +240,16 @@ Platform quirks found while validating (Android 16 / API 36):
- `android.permission.INTERNET` is required — NsdService rejects
registration without it.
- `NsdManager.registerService` on Android 16 validates the protocol
argument (`NsdManager.checkProtocol`): the historical `0` throws
`IllegalArgumentException: Unsupported protocol` — pass
`NsdManager.PROTOCOL_DNS_SD`. This was silent for a long time: the app
swallowed the exception and the failure status was overwritten by the
"Listening…" line, so mDNS never advertised even though the UI looked
fine (discovery only worked via `--peer`). Diagnosed via
`adb shell dumpsys servicediscovery` (the client's `mClientRequests`
stays empty when no request was ever issued) plus logging the
exception.
- `DatagramSocket.localPort` gives the bound port; `.port` is -1 for
unconnected datagram sockets, and `.localAddress` is an `InetAddress`
(Inet6Address on Android), not an `InetSocketAddress`.