fix(android): libmpv failed init reinit

This commit is contained in:
edde746
2026-03-21 16:51:25 +01:00
parent e8c02d04ae
commit 4365e70a78
3 changed files with 25 additions and 15 deletions
+2 -2
View File
@@ -8,7 +8,7 @@ plugins {
id("dev.flutter.flutter-gradle-plugin")
}
val mpvVersion = "v1.0.1"
val mpvVersion = "v1.0.5"
val mpvDir = layout.buildDirectory.dir("libmpv").get().asFile
val mpvAar = "libmpv-release.aar"
@@ -23,7 +23,7 @@ val downloadLibmpv by tasks.registering {
}
}
val assVersion = "safety"
val assVersion = "safety-2"
val assDir = layout.buildDirectory.dir("libass").get().asFile
val assAars = listOf("lib_ass-release.aar", "lib_ass_kt-release.aar", "lib_ass_media-release.aar")
@@ -405,9 +405,6 @@ class MpvPlayerCore(private val activity: Activity) : SurfaceHolder.Callback {
audioFocusManager?.release()
audioFocusManager = null
// Detach surface before cancelling scope (needs scope.launch for property sets)
detachSurfaceInternal()
// Cancel all coroutines
scope.cancel()
@@ -26,6 +26,7 @@ class MpvPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
private var activity: Activity? = null
private var activityBinding: ActivityPluginBinding? = null
private val nameToId = mutableMapOf<String, Int>()
private var sessionGeneration = 0
// FlutterPlugin
@@ -54,6 +55,7 @@ class MpvPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
}
override fun onDetachedFromActivity() {
++sessionGeneration
playerCore?.dispose()
playerCore = null
activity = null
@@ -122,17 +124,28 @@ class MpvPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
currentActivity.runOnUiThread {
try {
playerCore = MpvPlayerCore(currentActivity).apply {
// Dispose stale core idempotently
playerCore?.dispose()
playerCore = null
val gen = ++sessionGeneration
val core = MpvPlayerCore(currentActivity).apply {
delegate = this@MpvPlayerPlugin
}
playerCore = core
playerCore?.initialize { success ->
core.initialize { success ->
if (gen != sessionGeneration || playerCore !== core) {
Log.d(TAG, "Stale init callback (gen=$gen, current=$sessionGeneration)")
result.success(false)
return@initialize
}
// Start hidden - now safe because setVisible operates on the container,
// not the SurfaceView directly (matching ExoPlayer's approach)
playerCore?.setVisible(false)
core.setVisible(false)
Log.d(TAG, "Initialized: $success")
result.success(success)
} ?: result.success(false)
}
} catch (e: Exception) {
Log.e(TAG, "Failed to initialize: ${e.message}", e)
result.error("INIT_FAILED", e.message, null)
@@ -142,14 +155,14 @@ class MpvPlayerPlugin : FlutterPlugin, MethodChannel.MethodCallHandler,
private fun handleDispose(result: MethodChannel.Result) {
activity?.runOnUiThread {
playerCore?.dispose {
playerCore = null
val core = playerCore
++sessionGeneration
playerCore = null
core?.dispose {
Log.d(TAG, "Disposed")
result.success(null)
} ?: run {
playerCore = null
result.success(null)
}
} ?: result.success(null)
} ?: result.success(null)
}