Android kotlin开发ViewPage2动态添加的Fragment页面使用MediaPlayer+SurfaceView视频播放 网络状态监听详细代码
以下是一个示例代码,演示了在使用ViewPager2动态添加Fragment页面时如何使用MediaPlayer和SurfaceView进行视频播放,并且添加了网络状态监听。
MainActivity.kt:
import android.content.Context
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkRequest
import android.os.Bundle
import android.view.SurfaceHolder
import android.view.SurfaceView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
class MainActivity : AppCompatActivity() {
private lateinit var viewPager: ViewPager2
private lateinit var mediaPlayer: MediaPlayer
private lateinit var surfaceView: SurfaceView
private lateinit var networkCallback: ConnectivityManager.NetworkCallback
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewPager = findViewById(R.id.viewPager)
surfaceView = findViewById(R.id.surfaceView)
// Initialize MediaPlayer
mediaPlayer = MediaPlayer()
// Set up ViewPager2 with FragmentStateAdapter
val adapter = MyFragmentStateAdapter(this)
viewPager.adapter = adapter
// SurfaceHolder for SurfaceView
val surfaceHolder = surfaceView.holder
surfaceHolder.addCallback(object : SurfaceHolder.Callback {
override fun surfaceCreated(holder: SurfaceHolder) {
mediaPlayer.setDisplay(holder)
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
// No implementation needed
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
mediaPlayer.setDisplay(null)
}
})
// Network state change listener
networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
// Network is available
Toast.makeText(applicationContext, "Network available", Toast.LENGTH_SHORT).show()
}
override fun onLost(network: Network) {
// Network is lost
Toast.makeText(applicationContext, "Network lost", Toast.LENGTH_SHORT).show()
}
}
// Register network callback
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkRequest = NetworkRequest.Builder().build()
connectivityManager.registerNetworkCallback(networkRequest, networkCallback)
}
override fun onDestroy() {
super.onDestroy()
// Release MediaPlayer resources
mediaPlayer.release()
// Unregister network callback
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager.unregisterNetworkCallback(networkCallback)
}
private inner class MyFragmentStateAdapter(activity: AppCompatActivity) : FragmentStateAdapter(activity) {
override fun getItemCount(): Int {
return 3
}
override fun createFragment(position: Int): Fragment {
return MyFragment()
}
}
}
MyFragment.kt:
import android.media.MediaPlayer
import android.os.Bundle
import android.view.LayoutInflater
import android.view.SurfaceHolder
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
class MyFragment : Fragment() {
private lateinit var mediaPlayer: MediaPlayer
private lateinit var surfaceHolder: SurfaceHolder
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_my, container, false)
val surfaceView = view.findViewById<SurfaceView>(R.id.surfaceView)
surfaceHolder = surfaceView.holder
// Initialize MediaPlayer
mediaPlayer = MediaPlayer()
// SurfaceHolder callback
surfaceHolder.addCallback(object : SurfaceHolder.Callback {
override fun surfaceCreated(holder: SurfaceHolder) {
mediaPlayer.setDisplay(holder)
}
override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) {
// No implementation needed
}
override fun surfaceDestroyed(holder: SurfaceHolder) {
mediaPlayer.setDisplay(null)
}
})
// Set data source for MediaPlayer (replace with your video URL)
mediaPlayer.setDataSource("YOUR_VIDEO_URL")
mediaPlayer.prepareAsync()
return view
}
override fun onDestroyView() {
super.onDestroyView()
// Release MediaPlayer resources
mediaPlayer.release()
}
}
activity_main.xml:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</androidx.constraintlayout.widget.ConstraintLayout>
fragment_my.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</FrameLayout>
请注意,您需要将“YOUR_VIDEO_URL”替换为实际的视频URL。此外,还需要在您的AndroidManifest.xml文件中添加适当的权限和配置,以便进行网络访问和视频播放
原文地址: https://www.cveoy.top/t/topic/iyg2 著作权归作者所有。请勿转载和采集!