android - 如何在播放视频之前检查互联网连接?
问题描述
我已经创建了 的活动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()
}
}
解决方案
您可以使用来自 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
}
})
推荐阅读
- python - 根据python数据框中的条件对行值求和
- javascript - 使用 Next.js 和 Redux 进行身份验证
- html - 为什么我的 CSS 在 Safari 中无法正常工作,但在 Chrome 上却可以正常工作
- r - 在任何列中查找特定值
- ios - 为某些字符串应用字体
- html - 基本的 html/css 浮动/除法问题
- wordpress - 上传图片时如何处理 Wordpress Http 错误
- neo4j - Neo4j Cypher - 如何限制 50% 的 MATCH 结果
- reactjs - React Azure AD 返回空白页
- php - 使用 AJAX 和 PHP,创建的表单提交错误的错误值