更新VOD对话框逻辑,支持从文件选择器获取播放源,优化播放启动流程

This commit is contained in:
2026-03-18 14:06:32 +08:00
parent af40d82982
commit 84050ab7ff
4 changed files with 24 additions and 8 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -4,6 +4,7 @@ import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.graphics.Rect import android.graphics.Rect
import android.graphics.Typeface import android.graphics.Typeface
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity import android.view.Gravity
@@ -65,12 +66,14 @@ class FeatureHubActivity : AppCompatActivity() {
private val uiScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate) private val uiScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
/** VOD 对话框中的输入框引用,用于文件选择器回填 */ /** 当前打开的 VOD 配置对话框,便于文件选择完成后直接进入播放页。 */
private var pendingVodUrlInput: android.widget.EditText? = null private var pendingVodDialog: Dialog? = null
private val vodFilePicker = registerForActivityResult( private val vodFilePicker = registerForActivityResult(
ActivityResultContracts.GetContent() ActivityResultContracts.GetContent()
) { uri -> ) { uri ->
uri?.let { pendingVodUrlInput?.setText(it.toString()) } if (uri == null) return@registerForActivityResult
pendingVodDialog?.dismiss()
startVodPlayback(uri.toString(), uri)
} }
private lateinit var aliveAdapter: AliveStreamAdapter private lateinit var aliveAdapter: AliveStreamAdapter
@@ -486,8 +489,12 @@ class FeatureHubActivity : AppCompatActivity() {
dialog.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) dialog.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
dialog.setCancelable(true) dialog.setCancelable(true)
pendingVodUrlInput = dialogBinding.etVodUrl pendingVodDialog = dialog
dialog.setOnDismissListener { pendingVodUrlInput = null } dialog.setOnDismissListener {
if (pendingVodDialog === dialog) {
pendingVodDialog = null
}
}
dialogBinding.btnClose.setOnClickListener { dialog.dismiss() } dialogBinding.btnClose.setOnClickListener { dialog.dismiss() }
dialogBinding.btnStartVod.setOnClickListener { dialogBinding.btnStartVod.setOnClickListener {
@@ -497,14 +504,14 @@ class FeatureHubActivity : AppCompatActivity() {
return@setOnClickListener return@setOnClickListener
} }
dialog.dismiss() dialog.dismiss()
startActivity(VodPlayActivity.createIntent(this, input)) startVodPlayback(input)
} }
dialogBinding.btnPickLocalFile.setOnClickListener { dialogBinding.btnPickLocalFile.setOnClickListener {
vodFilePicker.launch("video/*") vodFilePicker.launch("video/*")
} }
dialogBinding.btnPlayAssetSample.setOnClickListener { dialogBinding.btnPlayAssetSample.setOnClickListener {
dialog.dismiss() dialog.dismiss()
startActivity(VodPlayActivity.createIntent(this, "asset:///vod/sample.mp4")) startVodPlayback("asset:///vod/sample.mp4")
} }
loadVodList(dialogBinding) loadVodList(dialogBinding)
@@ -512,6 +519,10 @@ class FeatureHubActivity : AppCompatActivity() {
dialog.show() dialog.show()
} }
private fun startVodPlayback(input: String, sourceUri: Uri? = null) {
startActivity(VodPlayActivity.createIntent(this, input, sourceUri))
}
private fun loadVodList(dialogBinding: DialogVodInputBinding) { private fun loadVodList(dialogBinding: DialogVodInputBinding) {
dialogBinding.pbVodListFull.isVisible = true dialogBinding.pbVodListFull.isVisible = true
dialogBinding.pbVodList.isVisible = true dialogBinding.pbVodList.isVisible = true

View File

@@ -119,6 +119,7 @@ class VodPlayActivity : AppCompatActivity() {
}) })
val url = intent.getStringExtra(EXTRA_VOD_URL)?.trim().orEmpty() val url = intent.getStringExtra(EXTRA_VOD_URL)?.trim().orEmpty()
.ifEmpty { intent.dataString?.trim().orEmpty() }
if (url.isEmpty()) { if (url.isEmpty()) {
Toast.makeText(this, "请输入有效的播放地址", Toast.LENGTH_SHORT).show() Toast.makeText(this, "请输入有效的播放地址", Toast.LENGTH_SHORT).show()
finish() finish()
@@ -653,9 +654,13 @@ class VodPlayActivity : AppCompatActivity() {
private const val MAX_LOG_LINES = 200 private const val MAX_LOG_LINES = 200
private const val SEEK_FORWARD_MS = 10_000L private const val SEEK_FORWARD_MS = 10_000L
fun createIntent(context: Context, url: String): Intent { fun createIntent(context: Context, url: String, sourceUri: android.net.Uri? = null): Intent {
return Intent(context, VodPlayActivity::class.java).apply { return Intent(context, VodPlayActivity::class.java).apply {
putExtra(EXTRA_VOD_URL, url) putExtra(EXTRA_VOD_URL, url)
if (sourceUri != null) {
data = sourceUri
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
}
} }
} }
} }