更新VOD对话框逻辑,支持从文件选择器获取播放源,优化播放启动流程
This commit is contained in:
Binary file not shown.
BIN
example/src/main/assets/vod/sample.mp4
Normal file
BIN
example/src/main/assets/vod/sample.mp4
Normal file
Binary file not shown.
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user