New phone carrier not working with Plex - "playback has stopped"

I’ve just switched to a new carrier on my phone and I can’t get the Plex Android app to work properly. It has worked perfectly for years so I’m sure it’s this new carrier but I’m not sure how to troubleshoot.

The problem is: The in-app browser works fine over 4G, but when you try to play anything, it buffers for a bit and then says “playback has stopped because the connection to the plex media server has been lost”.

The server logs show nothing interesting. The app logs show that the connection appears to timeout. If I manually go to the stream URL in the phone browser, it loads the Plex web UI as expected. If I tether the phone to a PC and use the web UI, it also works fine. Only the app is having issues.

Things I have tried that have not worked:

  • Switching server port to 32400
  • Switching server port to 443
  • Switching server port to 80
  • Disabling long-polling in plex server options

Things that work:

  • Using the Plex web UI in the Chrome browser on the device (Meaning it’s not a straight-up connection issue)
  • Streaming via wifi
  • Using a VPN tunnel to establish a local plex connection over the VPN tunnel
  • Using the sim from another cell carrier

I guess my question is: Does the Android app do something obscure with the connection that could lead to this behaviour? Is there anything I can do to troubleshoot? I don’t expect the phone carrier to care, so whatever I can do myself is appreciated.

App logs:

_07-27 00:14:35.796 i: Fetching [method:GET] https://[REDACTED].plex.direct:10609/:/timeline?containerKey=%2FplayQueues%2F1709&duration=1311686&guid=com.plexapp.agents.thetvdb%3A%2F%2F72173%2F1%2F2%3Flang%3Den&key=%2Flibrary%2Fmetadata%2F8539&machineIdentifier=[REDACTED]&playQueueItemID=18793&ratingKey=8539&state=buffering&time=0&token=…XDcq&X-Plex-Client-Identifier=bb6186c5214def43-com-plexapp-android&X-Plex-Token=…XDcq
07-27 00:14:35.803 i: [video] Starting Playback for: Top Banana
07-27 00:14:35.806 i: [Exo1VideoPlayer] Using HlsRendererBuilder.
07-27 00:14:35.808 i: [video] User maximum h264 profile determined: 50
07-27 00:14:35.809 i: [video] Device recommended h264 profile determined: 50
07-27 00:14:35.842 i: [BufferHelper] Assumed Bitrate: 10000, Segment Count: 1171
07-27 00:14:35.843 i: [BufferHelper] Segment count: 1171
07-27 00:14:37.290 i: [ThemeMusic] Fade out complete. Stopping media player.
07-27 00:14:43.913 e: [Exo1VideoPlayer] Error building the renderers: com.google.android.exoplayer.f.s: Unable to connect to http://127.0.0.1:32500/proxy?url=https%3A%2F%2F[REDACTED].plex.direct%3A10609%2Fvideo%2F%3A%2Ftranscode%2Funiversal%2Fstart.m3u8%3FaudioBoost%3D100%26autoAdjustQuality%3D1%26directPlay%3D0%26directStream%3D1%26directStreamAudio%3D1%26fastSeek%3D1%26hasMDE%3D1%26includeCodecs%3D1%26location%3Dcellular%26maxVideoBitrate%3D2000%26mediaBufferSize%3D74944%26partIndex%3D0%26path%3D%2Flibrary%2Fmetadata%2F8539%26peakBitrate%3D2000%26protocol%3Dhls%26session%3Dbb6186c5214def43-com-plexapp-android%26subtitleSize%3D100%26videoBitrate%3D2000%26videoQuality%3D75%26videoResolution%3D1920x1080%26X-Plex-Client-Identifier%3Dbb6186c5214def43-com-plexapp-android%26X-Plex-Client-Profile-Extra%3Dadd-limitation(scope%3DvideoCodec%26scopeName%3Dh264%26type%3DupperBound%26name%3Dvideo.level%26value%3D50)%2Badd-transcode-target-audio-codec(type%3DvideoProfile%26context%3Dstreaming%26protocol%3Dhls%26audioCodec%3Dmp3)%2Badd-transcode-target(type%3DsubtitleProfile%26context%3Dstreaming%26protocol%3Dhttp%26container%3Dmkv%26subtitleCodec%3Dsrt)%2Bappend-transcode-target-codec(type%3DvideoProfile%26context%3Dstreaming%26protocol%3Dhls%26videoCodec%3Dmpeg2video)%2Badd-limitation(scope%3DvideoCodec%26scopeName%3Dhevc%26type%3DMatch%26name%3Dvideo.profile%26list%3Dmain)%2Bappend-transcode-target-codec(type%3DvideoProfile%26context%3Dstreaming%26protocol%3Dhls%26videoCodec%3Dhevc)%2Badd-limitation(scope%3DvideoCodec%26scopeName%3D*%26type%3DNotMatch%26name%3Dvideo.anamorphic%26value%3D999%26replace%3Dtrue)%26X-Plex-Device%3DLenovo%20K10a40%26X-Plex-Platform%3DAndroid%26X-Plex-Platform-Version%3D6.0%26X-Plex-Product%3DPlex%20for%20Android%26X-Plex-Supported-Commands%3Dabort%26X-Plex-Token%3DqipodBPx4a6nB8RhXDcq%26X-Plex-Version%3D6.2.1.1036&t=-2131277754
at com.google.android.exoplayer.f.n.a(SourceFile:200)
at com.google.android.exoplayer.f.o.a(SourceFile:133)
at com.google.android.exoplayer.f.j.b(SourceFile:96)
at com.google.android.exoplayer.f.j.a(SourceFile:55)
at com.google.android.exoplayer.f.ad.h(SourceFile:91)
at com.google.android.exoplayer.f.x.run(SourceFile:222)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.net.SocketTimeoutException
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:493)
at java.net.PlainSocketImpl.-wrap0(PlainSocketImpl.java)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:242)
at com.android.okhttp.okio.Okio$2.read(Okio.java:135)
at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:306)
at com.android.okhttp.okio.RealBufferedSource.indexOf(RealBufferedSource.java:300)
at com.android.okhttp.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:196)
at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:191)
at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:80)
at com.android.okhttp.internal.http.HttpEngine.readNetworkResponse(HttpEngine.java:918)
at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:802)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:460)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:518)
at com.google.android.exoplayer.f.n.a(SourceFile:197)
… 10 more

07-27 00:14:44.023 i: [video] Error detected before playback
07-27 00:14:44.031 i: Fetching [method:GET] https://[REDACTED].plex.direct:10609/:/timeline?containerKey=%2FplayQueues%2F1709&duration=1311686&guid=com.plexapp.agents.thetvdb%3A%2F%2F72173%2F1%2F2%3Flang%3Den&key=%2Flibrary%2Fmetadata%2F8539&machineIdentifier=[REDACTED]&playQueueItemID=18793&ratingKey=8539&state=stopped&time=0&token=…XDcq&X-Plex-Client-Identifier=bb6186c5214def43-com-plexapp-android&X-Plex-Token=…XDcq
07-27 00:14:44.256 i: [TranscodeSession] Stopping…
07-27 00:14:44.264 i: [BufferHelper] Assumed Bitrate: 10000, Segment Count: 1171
07-27 00:14:44.266 i: [BufferHelper] Segment count: 1171
07-27 00:14:44.267 i: [TranscodeSession] Notifying server that we’ve stopped
07-27 00:14:44.268 e: [Video Player] A recoverable error occurred while attempting to play: /library/metadata/8539.
07-27 00:14:44.268 e: [Video Player] Playback has stopped because the connection to the Plex Media Server has been lost. Please ensure the server is available and retry.
07-27 00:14:44.269 i: [Video Player] Showing retry playback dialog._

I would also like to add that using the regular Plex web ui in the phone browser (Chrome), while a bit kludgy to navigate, works perfectly fine for playback as well.