Как проверить интернет-соединение перед воспроизведением видео? - PullRequest
0 голосов
/ 26 сентября 2019

Я создал активность exoplayer, когда я нажимаю кнопку воспроизведения из MainActivity. Она должна открыть мой файл активности exoplayer и воспроизвести мой источник hls.Несмотря на то, что нет мобильной передачи данных или Wi-Fi-соединения, он пытается открыть exoplayer и показывает черный с элементами управления.Как это исправить с некоторым условием.Мой андроид проект в котлине.Я использую 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()
        }

    }

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Вы можете использовать MutableLiveData из компонентов Android Jetpack, как показано ниже.Это поможет вам, даже если вы подключены к WiFi, но у WiFi нет подключения к Интернету.

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
            }
    })
0 голосов
/ 26 сентября 2019

Используйте эту функцию для проверки доступности сети

fun isNetwork(): Boolean{
        val connectivityManager = context?.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connectivityManager.activeNetworkInfo
        // In here we return true if network is not null and Network is connected
        return if(networkInfo != null && networkInfo.isConnected){
            true
        }

    }

Затем вызовите эту функцию

if(isNetwork()){

  //Do your work here
}
else{

  //Network is not available do another work
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...