Flutter中使用better_player出现MediaSource相关空指针异常求助
Flutter better_player 插件 NullPointerException 问题解决
异常信息
E/MethodChannel#better_player_channel: Failed to handle method call java.lang.NullPointerException: MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct and pass an instance in order to retain the old behavior. at com.google.android.exoplayer2.util.Assertions.checkNotNull(Assertions.java:174) at com.google.android.exoplayer2.source.ProgressiveMediaSource$Factory.setDrmSessionManagerProvider(ProgressiveMediaSource.java:186) at com.jhomlala.better_player.BetterPlayer.buildMediaSource(BetterPlayer.kt:430) at com.jhomlala.better_player.BetterPlayer.setDataSource(BetterPlayer.kt:196) at com.jhomlala.better_player.BetterPlayerPlugin.setDataSource(BetterPlayerPlugin.kt:277) at com.jhomlala.better_player.BetterPlayerPlugin.onMethodCall(BetterPlayerPlugin.kt:151) at com.jhomlala.better_player.BetterPlayerPlugin.onMethodCall(BetterPlayerPlugin.kt:138) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262) at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319) at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) E/flutter: [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(error, MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct and pass an instance in order to retain the old behavior., null, java.lang.NullPointerException: MediaSource.Factory#setDrmSessionManagerProvider no longer handles null by instantiating a new DefaultDrmSessionManagerProvider. Explicitly construct and pass an instance in order to retain the old behavior. at com.google.android.exoplayer2.util.Assertions.checkNotNull(Assertions.java:174) at com.google.android.exoplayer2.source.ProgressiveMediaSource$Factory.setDrmSessionManagerProvider(ProgressiveMediaSource.java:186) at com.jhomlala.better_player.BetterPlayer.buildMediaSource(BetterPlayer.kt:430) at com.jhomlala.better_player.BetterPlayer.setDataSource(BetterPlayer.kt:196) at com.jhomlala.better_player.BetterPlayerPlugin.setDataSource(BetterPlayerPlugin.kt:277) at com.jhomlala.better_player.BetterPlayerPlugin.onMethodCall(BetterPlayerPlugin.kt:151) at com.jhomlala.better_player.BetterPlayerPlugin.onMethodCall(BetterPlayerPlugin.kt:138) at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:262) at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319) at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130) ) #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:653:7) #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:296:18) #2 MethodChannelVideoPlayer.setDataSource (package:better_player/src/video_player/method_channel_video_player.dart:118:5) #3 VideoPlayerController._setDataSource (package:better_player/src/video_player/video_player.dart:408:5) #4 BetterPlayerController._setupDataSource (package:better_player/src/core/better_player_controller.dart:444:9) #5 BetterPlayerController.setupDataSource (package:better_player/src/core/better_player_controller.dart:274:5)
问题原因
该异常源于ExoPlayer的API变更:MediaSource.Factory#setDrmSessionManagerProvider不再允许传入null值,也不会自动实例化DefaultDrmSessionManagerProvider,必须显式传入该类的实例。当前使用的better_player插件版本未适配此变更,导致调用该方法时传入null触发空指针异常。
解决方案
1. 更新better_player到最新版本
插件官方大概率已修复此适配问题,执行以下命令更新插件:
flutter pub upgrade better_player
更新完成后,清理项目缓存并重新运行:
flutter clean flutter pub get flutter run
2. 手动修改插件代码(应急方案)
若无法更新插件,可临时修改插件源码:
- 找到项目中better_player插件的
BetterPlayer.kt文件(路径通常为flutter/.pub-cache/hosted/pub.dev/better_player-xxx/lib/android/src/main/kotlin/com/jhomlala/better_player/BetterPlayer.kt) - 定位到
buildMediaSource方法(约第430行),找到调用setDrmSessionManagerProvider(null)的代码 - 将其替换为:
.setDrmSessionManagerProvider(DefaultDrmSessionManagerProvider()) - 修改后重新编译项目
3. 排查依赖冲突
若更新插件后问题仍存在,可能是项目中其他依赖升级了ExoPlayer版本,导致版本不兼容。执行以下命令查看依赖树:
flutter pub deps
确认ExoPlayer的版本,必要时在pubspec.yaml中强制统一版本(需根据实际情况调整版本号):
dependency_overrides: exoplayer_core: '2.X.X' exoplayer_dash: '2.X.X'
内容的提问来源于stack exchange,提问作者Omar Naser
相关产品推荐
相关产品推荐

