首页 > 解决方案 > 如何在播放视频之前检查互联网连接?

问题描述

我已经创建了 的活动exoplayer,当我单击播放按钮时,MainActivity它应该打开我的 exoplayer 活动文件并播放我的 hls 源。即使没有移动数据或 wifi 连接,它仍试图打开 exoplayer 并显示黑色控件。如何在某些条件下解决此问题。我的 android 项目在 kotlin 中。我正在使用 exoplayer 2.6.0 版。

    package com.example.sample

    import android.net.Uri
    import android.os.Bundle
    import android.os.Handler
    import android.view.View
    import android.view.WindowManager
    import androidx.appcompat.app.AppCompatActivity
    import com.google.android.exoplayer2.DefaultLoadControl
    import com.google.android.exoplayer2.DefaultRenderersFactory
    import com.google.android.exoplayer2.ExoPlayerFactory
    import com.google.android.exoplayer2.SimpleExoPlayer
    import com.google.android.exoplayer2.source.hls.HlsMediaSource
    import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
    import com.google.android.exoplayer2.ui.SimpleExoPlayerView
    import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory

    class playlive : AppCompatActivity() {

        private var player: SimpleExoPlayer? = null
        private val handler = Handler()

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_playlive)

            window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
            actionBar?.hide()
            window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)

         play()

        }

        private fun play(){
        player = 
        ExoPlayerFactory.newSimpleInstance(DefaultRenderersFactory(this), 
        DefaultTrackSelector(), DefaultLoadControl())
        val playerView = findViewById<SimpleExoPlayerView>(R.id.player_view)
        val uri = Uri.parse("http://localhost/tv2hls/live.m3u8")

        playerView.player = player

        val dataSourceFactory = DefaultDataSourceFactory(this, "user-agent")
        val mediaSource = HlsMediaSource(uri, dataSourceFactory, handler, null)

        player?.prepare(mediaSource)
        player?.playWhenReady = true
    }

        override fun onStop() {
            super.onStop()
            releasePlayer()
            releaseInstance()
        }

        override fun onResume() {
            super.onResume()
            releasePlayer()
            resumePlayer()
        }


        override fun onDestroy() {
            super.onDestroy()
            releasePlayer()
            releaseInstance()
        }

        private fun releasePlayer(){
            player?.release()
        }

        private fun resumePlayer(){
            play()
        }

    }

标签: androidkotlinexoplayer

解决方案


您可以使用来自 Android Jetpack 组件的 MutableLiveData,如下所示。即使您已连接到 WiFi 但 WiFi 没有 Internet 连接,这也会对您有所帮助。

object Network {

private var mMutableData : MutableLiveData<Boolean>? =null
fun isNetworkAvailableWithInternetAccess(mContext: Context): LiveData<Boolean> {
    mMutableData = MutableLiveData()
    val cm = mContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo: NetworkInfo?
    networkInfo = cm.activeNetworkInfo
    if (networkInfo != null && networkInfo.isConnected) isInternetAvailable()
    return mMutableData!!
}

private var parentJob = Job()
private val coRoutineContext: CoroutineContext
    get() = parentJob + Dispatchers.Main

private fun isInternetAvailable() {
    val scope = CoroutineScope(coRoutineContext)
    scope.launch(Dispatchers.IO) {
        try {
            val sock = Socket()
            val socketAddress = InetSocketAddress("8.8.8.8", 53)

            sock.connect(socketAddress, 2000) // This will block no more than timeoutMs
            sock.close()

            mMutableData!!.postValue(true)

        } catch (e: IOException) {
            mMutableData!!.postValue(false)
        }
    }
}
}

利用:

Network.isNetworkAvailableWithInternetAccess(context).observe(this, Observer {
        if (it != null) {
            if (it) {
             //Do your work here
            }else{
            //Network is not available do another work
            }
    })

推荐阅读