I've been working on this app that is required to display video, and I've chosen to use MediaElement. The element is initialized fine, but if I do anything besides play or pause the video, like moving the slider, I receive this error:
Java.Lang.AbstractMethodError: 'abstract method "void androidx.media3.common.Player$Listener.onPositionDiscontinuity(androidx.media3.common.Player$PositionInfo, androidx.media3.common.Player$PositionInfo, int)"'
This being a Media3 issue, the error doesn't stop the iOS and Windows versions from working. I have found this link, https://github.com/CommunityToolkit/Maui/issues/2824, which gave me the idea that it could be a version issue between the related media3 libraries and the MediaElement library, but when I try to upgrade the Media3 libraries it fails because it downgrades Microsoft.Maui.Controls to 9.0.50, and MediaElement requires 9.0.90 or newer. Here are my dotnet relevant packages for reference:
> CommunityToolkit.Maui.MediaElement 6.1.2 6.1.2
> Microsoft.Maui.Controls 9.0.90 9.0.90
> Xamarin.AndroidX.Media 1.7.0.8
> Xamarin.AndroidX.Media3.Common 1.5.0
> Xamarin.AndroidX.Media3.Container 1.5.0
> Xamarin.AndroidX.Media3.Database 1.5.0
> Xamarin.AndroidX.Media3.DataSource 1.5.0
> Xamarin.AndroidX.Media3.Decoder 1.5.0
> Xamarin.AndroidX.Media3.ExoPlayer 1.5.0
> Xamarin.AndroidX.Media3.ExoPlayer.Dash 1.5.0
> Xamarin.AndroidX.Media3.ExoPlayer.Hls 1.5.0
> Xamarin.AndroidX.Media3.ExoPlayer.Rtsp 1.5.0
> Xamarin.AndroidX.Media3.Extractor 1.5.0
> Xamarin.AndroidX.Media3.Session 1.5.0
> Xamarin.AndroidX.Media3.Ui 1.5.0
I'm fully open to implementing it myself through Media3.ExoPlayer, but I wanted to see if anyone out there would be able to help with this issue before I take on that task. Here is a sample XAML file that causes this issue:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Class="Test.TestPage"
Title="TestPage">
<VerticalStackLayout>
<Label
Text="Welcome to .NET MAUI!"
VerticalOptions="Center"
HorizontalOptions="Center" />
<toolkit:MediaElement x:Name="videoview" Source="https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
ShouldShowPlaybackControls="True"
ShouldAutoPlay="False"
Aspect="AspectFill"
HeightRequest="300"
/>
</VerticalStackLayout>
</ContentPage>
I tried to update related Media3 libraries, downgrade MediaElements, switch to .NET 10, switching to LibVLCSharp but that had different issues.
Steps to reproduce:
Make a new Maui App, add CommunityToolkit.Maui.MediaElement latest version 6.1.2, transitive Xamarin.AndroidX.Media3.* packages will be added as 1.5.0 automatically, create a MediaElement as shown in the .xml above, results in error. Using .NET 9.
Here is the complete stack trace:
$exception {Java.Lang.AbstractMethodError: abstract method "void androidx.media3.common.Player$Listener.onPositionDiscontinuity(androidx.media3.common.Player$PositionInfo, androidx.media3.common.Player$PositionInfo, int)" at Java.Interop.JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod(JniObjectReference instance, JniObjectReference type, JniMethodInfo method, JniArgumentValue* args) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/obj/Release/net8.0/JniEnvironment.g.cs:line 20831 at Java.Interop.JniPeerMembers.JniInstanceMethods.InvokeVirtualVoidMethod(String encodedMember, IJavaPeerable self, JniArgumentValue* parameters) in /Users/runner/work/1/s/xamarin-android/external/Java.Interop/src/Java.Interop/Java.Interop/JniPeerMembers.JniInstanceMethods_Invoke.cs:line 75 at AndroidX.Media3.Common.IPlayerListener.OnPositionDiscontinuity(PlayerPositionInfo oldPosition, PlayerPositionInfo newPosition, Int32 reason) in D:\a\_work\1\s\generated\androidx.media3.media3-common\obj\Release\net8.0-android\generated\src\AndroidX.Media3.Common.IPlayer.cs:line 1685 at AndroidX.Media3.Common.IPlayerListener.n_OnPositionDiscontinuity_Landroidx_media3_common_Player_PositionInfo_Landroidx_media3_common_Player_PositionInfo_I(IntPtr jnienv, IntPtr native__this, IntPtr native_oldPosition, IntPtr native_newPosition, Int32 reason) in D:\a\_work\1\s\generated\androidx.media3.media3-common\obj\Release\net8.0-android\generated\src\AndroidX.Media3.Common.IPlayer.cs:line 1671 at Android.Runtime.DynamicMethodNameCounter.10(IntPtr , IntPtr , IntPtr , IntPtr , Int32 ) --- End of managed Java.Lang.AbstractMethodError stack trace --- java.lang.AbstractMethodError: abstract method "void androidx.media3.common.Player$Listener.onPositionDiscontinuity(androidx.media3.common.Player$PositionInfo, androidx.media3.common.Player$PositionInfo, int)" at crc64ceb75e76f4b66147.MediaManager.n_onPositionDiscontinuity(Native Method) at crc64ceb75e76f4b66147.MediaManager.onPositionDiscontinuity(MediaManager.java:225) at androidx.media3.exoplayer.ExoPlayerImpl.lambda$updatePlaybackInfo$13(ExoPlayerImpl.java:2094) at androidx.media3.exoplayer.ExoPlayerImpl$$ExternalSyntheticLambda5.invoke(D8$$SyntheticClass:0) at androidx.media3.common.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:342) at androidx.media3.common.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:226) at androidx.media3.common.util.ListenerSet$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at androidx.media3.common.util.ListenerSet.flushEvents(ListenerSet.java:248) at androidx.media3.exoplayer.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:2174) at androidx.media3.exoplayer.ExoPlayerImpl.seekTo(ExoPlayerImpl.java:943) at androidx.media3.common.BasePlayer.seekToCurrentItem(BasePlayer.java:454) at androidx.media3.common.BasePlayer.seekTo(BasePlayer.java:254) at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method) at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:29) at android.view.View.performClick(View.java:8028) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1218) at android.view.View.performClickInternal(View.java:8005) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:31229) at android.os.Handler.handleCallback(Handler.java:959) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:232) at android.os.Looper.loop(Looper.java:317) at android.app.ActivityThread.main(ActivityThread.java:8705) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886) --- End of managed Java.Lang.AbstractMethodError stack trace --- java.lang.AbstractMethodError: abstract method "void androidx.media3.common.Player$Listener.onPositionDiscontinuity(androidx.media3.common.Player$PositionInfo, androidx.media3.common.Player$PositionInfo, int)" at crc64ceb75e76f4b66147.MediaManager.n_onPositionDiscontinuity(Native Method) at crc64ceb75e76f4b66147.MediaManager.onPositionDiscontinuity(MediaManager.java:225) at androidx.media3.exoplayer.ExoPlayerImpl.lambda$updatePlaybackInfo$13(ExoPlayerImpl.java:2094) at androidx.media3.exoplayer.ExoPlayerImpl$$ExternalSyntheticLambda5.invoke(D8$$SyntheticClass:0) at androidx.media3.common.util.ListenerSet$ListenerHolder.invoke(ListenerSet.java:342) at androidx.media3.common.util.ListenerSet.lambda$queueEvent$0(ListenerSet.java:226) at androidx.media3.common.util.ListenerSet$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at androidx.media3.common.util.ListenerSet.flushEvents(ListenerSet.java:248) at androidx.media3.exoplayer.ExoPlayerImpl.updatePlaybackInfo(ExoPlayerImpl.java:2174) at androidx.media3.exoplayer.ExoPlayerImpl.seekTo(ExoPlayerImpl.java:943) at androidx.media3.common.BasePlayer.seekToCurrentItem(BasePlayer.java:454) at androidx.media3.common.BasePlayer.seekTo(BasePlayer.java:254) at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.n_onClick(Native Method) at crc64fcf28c0e24b4cc31.ButtonHandler_ButtonClickListener.onClick(ButtonHandler_ButtonClickListener.java:29) at android.view.View.performClick(View.java:8028) at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1218) at android.view.View.performClickInternal(View.java:8005) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:31229) at android.os.Handler.handleCallback(Handler.java:959) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:232) at android.os.Looper.loop(Looper.java:317) at android.app.ActivityThread.main(ActivityThread.java:8705) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:886) } Java.Lang.AbstractMethodError