Skip to content

Releases: mhoogenbosch/PhairPlay

PhairPlay v1.1.0-mh.9

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 28 Aug 06:39
6e1d05c

Fork release on top of mazer666/PhairPlay. Personal use only.

Changed

  • The persistent diagnostic log (phairplay.log) is now written to the app's external files directory (/sdcard/Android/data/<package>/files/phairplay.log) when available, instead of internal storage. This makes it retrievable over FTP or a file manager without adb or root — for users who sideload by FTP and cannot capture logcat (requested in #15 to debug the Safari-fullscreen video crash). Falls back to internal storage when no external files dir is available.
  • The :8001 diagnostic dump and :8002 live-tail are unchanged; the uncaught-exception handler still writes crash traces into this same log, so a crash survives process death and lands in the FTP-reachable file.

No change to AirPlay behaviour.

Flavors: googletv (Android TV / Google TV) and firetv (Fire TV).

PhairPlay v1.1.0-mh.10

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 28 Aug 13:38
de0cba1

What's changed (since v1.1.0-mh.9)

  • ui: in-app "Display over other apps" prompt when SYSTEM_ALERT_WINDOW is missing (#17)

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.10-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.10-firetv.apk — Amazon Fire TV (Android 7.1+)

Use adb or a sideloading app like Downloader to install.

PhairPlay v1.1.0-mh.8

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 27 Aug 16:26

Herstelt het zwarte scherm dat @sigurdshilfe meldde na het installeren van v1.1.0-mh.7. / Fixes the black screen @sigurdshilfe reported after installing v1.1.0-mh.7.

Opgelost / Fixed

Een venster dat je zelf hebt geopend wordt niet meer onder je vandaan gehaald als een sessie eindigt. Sinds mh.4 stapt de app na een sessie opzij met moveTaskToBack, zodat een TV die automatisch geopend werd voor een inkomende stream terugkeert naar wat er eerst op stond. Dat klopt voor dat geval, maar de vangnet-heuristiek — "geen interactie gezien, dus we zullen wel automatisch geopend zijn" — las één situatie verkeerd: je start de app zelf vanuit de launcher en begint daarna te casten zónder de afstandsbediening nog aan te raken. onUserInteraction vuurt dan nooit, want de knopdruk die de app startte ging naar de launcher en niet naar de app. Aan het eind van de stream verdween zo het venster dat je bewust had geopend, met daarachter meestal niets — dus een zwart scherm.

A window you opened yourself is no longer backed out from under you when a session ends. The retreat heuristic misread a manual launch followed by casting without touching the remote, because onUserInteraction never fires for the launcher's own button press.

De afwezigheid van EXTRA_AUTO_OPENED — die alleen de service ooit zet — is nu het criterium: een handmatige start telt als gebruikersintentie en gaat nooit opzij. Het appliance-gedrag blijft ongewijzigd. / The absence of EXTRA_AUTO_OPENED is now the signal; appliance behaviour is unchanged.

Geverifieerd / Verified

Geïnstalleerd op vier TV's; alle vier adverteren daadwerkelijk op het netwerk, gecontroleerd met een mDNS-query vanaf het LAN. / Installed on four TVs, all four confirmed advertising via an mDNS query from the LAN.

Installatie / Installation

Bestand Voor
PhairPlay-v1.1.0-mh.8-googletv.apk Google TV / Android TV
PhairPlay-v1.1.0-mh.8-firetv.apk Fire TV

adb install -r <apk> — instellingen en weergavenaam blijven behouden. / settings and display name are preserved.

PhairPlay v1.1.0-mh.7

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 26 Aug 19:10
81f54de

Twee betrouwbaarheidsfixes voor de ontvanger. Ze komen uit een bugmelding bij upstream (Sony X90J), maar bleken gewoon gaten in de app — niet Sony-specifiek. / Two receiver-reliability fixes, from an upstream bug report that turned out to apply everywhere.

Opgelost / Fixed

De screensaver van de TV onderbreekt een lopende sessie niet meer. Er stond nergens een FLAG_KEEP_SCREEN_ON, geen wakelock en zelfs de WAKE_LOCK-permissie niet, dus elke mirror-, foto- of audiosessie liep in de screensaver-timeout van de TV. De window-vlag wordt nu vastgehouden zolang de overlay staat en losgelaten als hij weggaat.
The TV's screensaver no longer interrupts an active session: nothing in the app kept the screen awake. The window flag is now held for as long as the overlay is up.

De ontvanger is weer vindbaar nadat de TV uit standby komt. Standby haalt de wifi-interface neer, een NsdManager-registratie overleeft dat niet, en er was geen weg terug: de app luisterde nog op poort 7000, meldde zichzelf als draaiend, en was onzichtbaar in elke AirPlay-picker tot een handmatige herstart. Een ConnectivityManager.NetworkCallback registreert de advertentie nu opnieuw zodra er weer netwerk is.
Discoverable again after standby: a network callback re-registers the mDNS advertisement, via a new AirPlayReceiver.readvertise() that restarts only mDNS and leaves the RTSP and timing sockets alone.

Wifi kan mDNS-query's niet meer wegfilteren. CHANGE_WIFI_MULTICAST_STATE stond al vanaf het begin in de manifest, maar werd nooit gebruikt. MdnsService houdt nu een MulticastLock zolang het adverteert.
Wi-Fi power-save can no longer drop the multicast frames that carry every sender's query.

Geverifieerd / Verified

Op hardware, door de wifi van een Fire TV te laten bouncen:

Network lost — mDNS advertisement is gone until it returns
Network available — re-advertising over mDNS
mDNS registered: _airplay._tcp as 'TV-Veranda'

Binnen een seconde terug, weergavenaam behouden. / Back within a second, display name preserved.

Installatie / Installation

Bestand Voor
PhairPlay-v1.1.0-mh.7-googletv.apk Google TV / Android TV
PhairPlay-v1.1.0-mh.7-firetv.apk Fire TV

adb install -r <apk> — instellingen en weergavenaam blijven behouden.

PhairPlay v1.1.0-mh.6

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 20 Jul 19:19
2e93789

What's changed (since v1.1.0-mh.5)

  • Merge pull request #13 from mhoogenbosch/release/v1.1.0-mh.6
  • Release v1.1.0-mh.6: version bump + changelog
  • Merge pull request #12 from mhoogenbosch/fix/home-visible-as
  • Home screen: show the configured display name, not the system name

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.6-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.6-firetv.apk — Amazon Fire TV (Android 7.1+)

Use adb or a sideloading app like Downloader to install.

PhairPlay v1.1.0-mh.5

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 20 Jul 19:07
1283138

What's changed (since v1.1.0-mh.4)

  • Merge pull request #11 from mhoogenbosch/release/v1.1.0-mh.5
  • Release v1.1.0-mh.5: version bump + changelog
  • Merge pull request #10 from mhoogenbosch/fix/runtime-defaults-and-lint
  • Apply the new defaults at runtime + fix ExportedReceiver lint
  • Merge pull request #9 from mhoogenbosch/fix/ci-test-runner
  • Fix JVM test-runner build for the new receiver + defaults

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.5-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.5-firetv.apk — Amazon Fire TV (Android 7.1+)

Use adb or a sideloading app like Downloader to install.

PhairPlay v1.1.0-mh.3

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 20 Jul 18:10
c04fced

What's changed (since v1.1.0-mh.2)

  • Merge pull request #6 from mhoogenbosch/release/v1.1.0-mh.3
  • Release v1.1.0-mh.3: version bump + changelog
  • Merge pull request #5 from mhoogenbosch/feature/unique-deviceid
  • Derive a unique, stable AirPlay deviceid per install
  • Merge pull request #4 from mhoogenbosch/feature/headless-display-name
  • Add headless display-name setter for scripted fleet rollout
  • Merge pull request #3 from mhoogenbosch/feature/tv-foreground-overlay
  • Foreground the app on connect via direct startActivity on unlocked TVs

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.3-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.3-firetv.apk — Amazon Fire TV (Android 7.1+)

Use adb or a sideloading app like Downloader to install.

PhairPlay v1.1.0-mh.4

PhairPlay v1.1.0-mh.4 Pre-release
Pre-release

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 20 Jul 18:43
71210a2

What's changed (since v1.1.0-mh.3)

  • Merge pull request #8 from mhoogenbosch/release/v1.1.0-mh.4
  • Release v1.1.0-mh.4: version bump + changelog
  • Merge pull request #7 from mhoogenbosch/feature/appliance-defaults-lifecycle
  • README: document the personal fork and its features
  • Update changelog for lifecycle + receiver-default changes
  • Default Miracast + Cast off, Start-on-boot on
  • Step aside after a session even if the app was already foregrounded

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.4-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.4-firetv.apk — Amazon Fire TV (Android 7.1+)

Use adb or a sideloading app like Downloader to install.

PhairPlay v1.1.0-mh.2

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 19 Jul 21:56
421c7c2

The release that makes iOS 26 screen mirroring actually visible on the TV. With v1.1.0-mh.1's fixes the full mirror session already worked (verified: H.264 decoded at ~60 fps), but video only renders when the app's Activity — and thus its Surface — is in the foreground, which the receiver-appliance lifecycle no longer guarantees.

Added

  • App comes to the foreground when a sender connects. A high-importance full-screen intent notification (new channel phairplay_incoming_channel) starts MainActivity when the AirPlay state hits CONNECTED, so the video Surface exists before frames arrive — no more black screen when mirroring starts while the app is closed. Ported from JObersi10/PhairPlay. Adds the USE_FULL_SCREEN_INTENT permission.
  • …and steps aside again when the session ends. An auto-opened Activity moves its task to the back on disconnect, so the TV returns to whatever app was visible before the session (or the launcher when there was none). A manually opened app never auto-hides, and the "incoming connection" notification is withdrawn on disconnect.
  • Diagnostics: unknown mirror payload types are hexdumped once per session (first 16 header bytes + first 32 payload bytes). iOS 26 sends a steady ~25 KB "payload type 5" every second that no open-source receiver documents; this collects material to analyse it.

Fixed

  • Double teardown escalated the mDNS name to "(3)/(4)". TEARDOWN of the last stream and the subsequent socket close both fired onStreamingStopped, running two concurrent mDNS restarts that raced each other's fresh registration. A guard flag (ported from JObersi10/PhairPlay) makes teardown idempotent.
  • PhairPlayService is marked android:stopWithTask="false", matching the receiver-appliance lifecycle introduced in mh.1.

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.2-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.2-firetv.apk — Amazon Fire TV (Android 7.1+)

Full changelog: CHANGELOG.md

PhairPlay v1.1.0-mh.1

PhairPlay v1.1.0-mh.1 Pre-release
Pre-release

Choose a tag to compare

@mhoogenbosch mhoogenbosch released this 19 Jul 20:33

Fork release based on upstream v1.0.0-beta.1 (mazer666/PhairPlay).

Fixed

  • mDNS name conflict left _airplay._tcp unregistered forever. Newer Android does not auto-rename on a conflict; when the requested name collides with a record on the same device (e.g. the TV's own Google Cast registration), MdnsAdvertiser gets stuck probing and never delivers any callback — the TV never appears in AirPlay pickers. MdnsService now runs a 5s watchdog per registration attempt and retries with a numbered suffix ("Name (2)", max 3 attempts) on both explicit failures and silent stuck probes. Verified on a Nokia Streaming Box 8010.
  • mDNS restart race escalated the advertised name to "(2)/(3)" after every streaming session; restart() now waits for both asynchronous unregistrations (2s timeout) before re-registering.
  • RTSP message limit rejected the iOS mirror-stream SETUP (~77 KB binary plist from iOS 26 vs a 64 KB cap) — raised to 1 MB (also submitted upstream as mazer666/PhairPlay#11).

Changed

  • Receiver-appliance lifecycle: backing out of the app or swiping it from recents no longer stops the foreground service — the TV stays visible in AirPlay pickers. Stop the receiver via the in-app protocol toggles.

Added

  • On-device diagnostics (ported from JObersi10/PhairPlay, trimmed): persistent files/phairplay.log + crash hook (LogBuffer), and LAN log access — full dump on port 8001, live tail on port 8002 (curl http://<tv-ip>:8002). Logging is active in release builds too.

Installation

Side-load the APK that matches your device:

  • PhairPlay-v1.1.0-mh.1-googletv.apk — Google TV / Android TV (Android 10+)
  • PhairPlay-v1.1.0-mh.1-firetv.apk — Amazon Fire TV (Android 7.1+)

Full changelog: CHANGELOG.md