fix: support mx player variants

close #1304
This commit is contained in:
edde746
2026-06-11 08:35:19 +02:00
parent f214c50c15
commit 38afdab2e4
4 changed files with 71 additions and 31 deletions
@@ -4,6 +4,7 @@ import android.app.Activity
import android.app.ActivityManager
import android.app.AppOpsManager
import android.app.PictureInPictureParams
import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
@@ -482,7 +483,9 @@ class MainActivity : FlutterActivity() {
when (call.method) {
"openVideo" -> {
val filePath = call.argument<String>("filePath")
val packageName = call.argument<String>("package")
val packageNames = call.argument<List<Any?>>("packages")
?.mapNotNull { (it as? String)?.trim()?.takeIf { value -> value.isNotEmpty() } }
?: emptyList()
val title = call.argument<String>("title")?.trim()?.takeIf { it.isNotEmpty() }
val startPositionMs = call.argument<Number>("startPositionMs")?.toLong() ?: 0L
@@ -516,14 +519,12 @@ class MainActivity : FlutterActivity() {
grantRead = true
}
val intent = Intent(Intent.ACTION_VIEW).apply {
fun buildIntent(packageName: String?): Intent = Intent(Intent.ACTION_VIEW).apply {
setDataAndType(uri, "video/*")
if (grantRead) {
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
if (packageName != null) {
setPackage(packageName)
}
packageName?.let { setPackage(it) }
val startPosition = startPositionMs.coerceAtLeast(0).coerceAtMost(Int.MAX_VALUE.toLong()).toInt()
if (startPosition > 0) {
putExtra(API_MX_RESULT_POSITION, startPosition)
@@ -538,11 +539,25 @@ class MainActivity : FlutterActivity() {
}
fileName?.let { putExtra(API_MX_FILENAME, it) }
}
pendingExternalPlayerResult = result
startActivityForResult(intent, EXTERNAL_PLAYER_REQUEST_CODE)
} catch (e: android.content.ActivityNotFoundException) {
val targetPackages = if (packageNames.isEmpty()) listOf<String?>(null) else packageNames
for (packageName in targetPackages) {
try {
pendingExternalPlayerResult = result
startActivityForResult(buildIntent(packageName), EXTERNAL_PLAYER_REQUEST_CODE)
return@setMethodCallHandler
} catch (e: ActivityNotFoundException) {
pendingExternalPlayerResult = null
}
}
pendingExternalPlayerResult = null
result.error("APP_NOT_FOUND", "No app found for package: $packageName", null)
val message = if (packageNames.isEmpty()) {
"No app found for video"
} else {
"No app found for packages: ${packageNames.joinToString(", ")}"
}
result.error("APP_NOT_FOUND", message, null)
} catch (e: Exception) {
pendingExternalPlayerResult = null
result.error("LAUNCH_FAILED", e.message ?: e.javaClass.simpleName, null)