添加本地文件选择功能,更新点播对话框和播放逻辑,支持多种播放源类型
This commit is contained in:
Binary file not shown.
@@ -15,6 +15,8 @@
|
|||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK"/>
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
|
||||||
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
|
||||||
|
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
|
||||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import android.view.Gravity
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.recyclerview.widget.GridLayoutManager
|
import androidx.recyclerview.widget.GridLayoutManager
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
@@ -56,6 +57,14 @@ class FeatureHubActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
private val uiScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
private val uiScope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
|
||||||
|
|
||||||
|
/** VOD 对话框中的输入框引用,用于文件选择器回填 */
|
||||||
|
private var pendingVodUrlInput: android.widget.EditText? = null
|
||||||
|
private val vodFilePicker = registerForActivityResult(
|
||||||
|
ActivityResultContracts.GetContent()
|
||||||
|
) { uri ->
|
||||||
|
uri?.let { pendingVodUrlInput?.setText(it.toString()) }
|
||||||
|
}
|
||||||
|
|
||||||
private lateinit var aliveAdapter: AliveStreamAdapter
|
private lateinit var aliveAdapter: AliveStreamAdapter
|
||||||
private val allAliveItems: MutableList<AliveStreamItem> = mutableListOf()
|
private val allAliveItems: MutableList<AliveStreamItem> = mutableListOf()
|
||||||
private var currentPage = 0
|
private var currentPage = 0
|
||||||
@@ -469,6 +478,9 @@ 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
|
||||||
|
dialog.setOnDismissListener { pendingVodUrlInput = null }
|
||||||
|
|
||||||
dialogBinding.btnClose.setOnClickListener { dialog.dismiss() }
|
dialogBinding.btnClose.setOnClickListener { dialog.dismiss() }
|
||||||
dialogBinding.btnStartVod.setOnClickListener {
|
dialogBinding.btnStartVod.setOnClickListener {
|
||||||
val input = dialogBinding.etVodUrl.text?.toString()?.trim().orEmpty()
|
val input = dialogBinding.etVodUrl.text?.toString()?.trim().orEmpty()
|
||||||
@@ -479,6 +491,13 @@ class FeatureHubActivity : AppCompatActivity() {
|
|||||||
dialog.dismiss()
|
dialog.dismiss()
|
||||||
startActivity(VodPlayActivity.createIntent(this, input))
|
startActivity(VodPlayActivity.createIntent(this, input))
|
||||||
}
|
}
|
||||||
|
dialogBinding.btnPickLocalFile.setOnClickListener {
|
||||||
|
vodFilePicker.launch("video/*")
|
||||||
|
}
|
||||||
|
dialogBinding.btnPlayAssetSample.setOnClickListener {
|
||||||
|
dialog.dismiss()
|
||||||
|
startActivity(VodPlayActivity.createIntent(this, "asset:///vod/sample.mp4"))
|
||||||
|
}
|
||||||
|
|
||||||
dialog.show()
|
dialog.show()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import androidx.core.content.ContextCompat
|
|||||||
import com.demo.SellyCloudSDK.R
|
import com.demo.SellyCloudSDK.R
|
||||||
import com.demo.SellyCloudSDK.databinding.ActivityVodPlayBinding
|
import com.demo.SellyCloudSDK.databinding.ActivityVodPlayBinding
|
||||||
import com.demo.SellyCloudSDK.live.util.GalleryImageSaver
|
import com.demo.SellyCloudSDK.live.util.GalleryImageSaver
|
||||||
|
import com.sellycloud.sellycloudsdk.SellyCloudManager
|
||||||
import com.sellycloud.sellycloudsdk.SellyLiveError
|
import com.sellycloud.sellycloudsdk.SellyLiveError
|
||||||
import com.sellycloud.sellycloudsdk.SellyPlayerState
|
import com.sellycloud.sellycloudsdk.SellyPlayerState
|
||||||
import com.sellycloud.sellycloudsdk.SellyVodPlayer
|
import com.sellycloud.sellycloudsdk.SellyVodPlayer
|
||||||
@@ -123,6 +124,8 @@ class VodPlayActivity : AppCompatActivity() {
|
|||||||
finish()
|
finish()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
// VOD 模式始终走直连,不使用 Kiwi 代理替换路径。
|
||||||
|
SellyCloudManager.setProxyAddress(null)
|
||||||
initPlayer(url)
|
initPlayer(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +146,21 @@ class VodPlayActivity : AppCompatActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun classifySource(url: String): String {
|
||||||
|
return when {
|
||||||
|
url.startsWith("content://", ignoreCase = true) -> "Content URI"
|
||||||
|
url.startsWith("android.resource://", ignoreCase = true) -> "Raw Resource"
|
||||||
|
url.startsWith("asset:///", ignoreCase = true) -> "Asset"
|
||||||
|
url.startsWith("file://", ignoreCase = true) -> "File URI"
|
||||||
|
url.startsWith("http://", ignoreCase = true) || url.startsWith("https://", ignoreCase = true) -> "Network"
|
||||||
|
url.startsWith("/") -> "Local Path"
|
||||||
|
else -> "Unknown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun initPlayer(url: String) {
|
private fun initPlayer(url: String) {
|
||||||
|
logEvent("播放源类型: ${classifySource(url)}")
|
||||||
|
logEvent("播放地址: $url")
|
||||||
val vodPlayer = SellyVodPlayer.initWithUrl(this, url).also { client ->
|
val vodPlayer = SellyVodPlayer.initWithUrl(this, url).also { client ->
|
||||||
client.autoPlay = true
|
client.autoPlay = true
|
||||||
client.delegate = object : SellyVodPlayerDelegate {
|
client.delegate = object : SellyVodPlayerDelegate {
|
||||||
|
|||||||
@@ -70,5 +70,25 @@
|
|||||||
android:textColor="@color/brand_primary_text_on"
|
android:textColor="@color/brand_primary_text_on"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btnPickLocalFile"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/av_primary_button_height"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:background="@drawable/bg_av_input_field"
|
||||||
|
android:text="@string/vod_pick_local_file"
|
||||||
|
android:textColor="@color/av_text_primary"
|
||||||
|
android:textSize="14sp" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btnPlayAssetSample"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/av_primary_button_height"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:background="@drawable/bg_av_input_field"
|
||||||
|
android:text="@string/vod_play_asset_sample"
|
||||||
|
android:textColor="@color/av_text_primary"
|
||||||
|
android:textSize="14sp" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|||||||
@@ -87,7 +87,9 @@
|
|||||||
<string name="play_start">开始播放</string>
|
<string name="play_start">开始播放</string>
|
||||||
<string name="close">关闭</string>
|
<string name="close">关闭</string>
|
||||||
<string name="vod_config_title">点播播放</string>
|
<string name="vod_config_title">点播播放</string>
|
||||||
<string name="vod_config_hint">请输入 MP4 / HLS URL</string>
|
<string name="vod_config_hint">请输入播放地址(URL、本地路径、asset:///...)</string>
|
||||||
|
<string name="vod_pick_local_file">选择本地文件</string>
|
||||||
|
<string name="vod_play_asset_sample">播放包内示例</string>
|
||||||
|
|
||||||
<string name="protocol_rtmp">RTMP</string>
|
<string name="protocol_rtmp">RTMP</string>
|
||||||
<string name="protocol_rtc">RTC</string>
|
<string name="protocol_rtc">RTC</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user