Android 播放视频前如何检查互联网连接?
我已经创建了Android 播放视频前如何检查互联网连接?,android,kotlin,exoplayer,Android,Kotlin,Exoplayer,我已经创建了exoplayer的活动,当我从main活动中单击播放按钮时,它将打开我的exoplayer活动文件并播放我的hls源代码。即使没有移动数据或wifi连接,它也试图打开exoplayer,并用控件显示黑色。如何在某些条件下修复此问题。我的android项目在科特林。我使用的是exoplayer 2.6.0版 package com.example.sample 导入android.net.Uri 导入android.os.Bundle 导入android.os.Handler 导入a
exoplayer
的活动,当我从main活动
中单击播放按钮时,它将打开我的exoplayer活动文件并播放我的hls源代码。即使没有移动数据或wifi连接,它也试图打开exoplayer,并用控件显示黑色。如何在某些条件下修复此问题。我的android项目在科特林。我使用的是exoplayer 2.6.0版
package com.example.sample
导入android.net.Uri
导入android.os.Bundle
导入android.os.Handler
导入android.view.view
导入android.view.WindowManager
导入androidx.appcompat.app.appcompat活动
导入com.google.android.exoplayer2.DefaultLoadControl
导入com.google.android.exoplayer2.defaultRendersFactory
导入com.google.android.exoplayer2.ExoPlayerFactory
导入com.google.android.exoplayer2.SimpleExoPlayer
导入com.google.android.exoplayer2.source.hls.HlsMediaSource
导入com.google.android.exoplayer2.trackselection.DefaultTrackSelector
导入com.google.android.exoplayer2.ui.SimpleExoPlayerView
导入com.google.android.exoplayer2.upstream.DefaultDataSourceFactory
类playlive:AppCompativeActivity(){
私有变量播放器:SimpleExoPlayer?=null
private val handler=handler()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u playlive)
window.decorView.systemui可见性=View.SYSTEM\u UI\u FLAG\u全屏
actionBar?.hide()
window.addFlags(WindowManager.LayoutParams.FLAG\u保持屏幕打开)
play()
}
私人娱乐{
玩家=
ExoPlayerFactory.newImpleInstance(默认渲染器工厂(此),
DefaultTrackSelector(),DefaultLoadControl())
val playerView=findviewbyd(R.id.player\u视图)
val uri=uri.parse(“http://localhost/tv2hls/live.m3u8")
playerView.player=玩家
val dataSourceFactory=DefaultDataSourceFactory(此“用户代理”)
val mediaSource=HlsMediaSource(uri、dataSourceFactory、handler、null)
播放器?准备(mediaSource)
玩家?.playwhenrady=true
}
覆盖桌面上的乐趣(){
super.onStop()
释放玩家()
releaseInstance()
}
重写onResume(){
super.onResume()
释放玩家()
resumePlayer()
}
重写onDestroy(){
super.ondestory()
释放玩家()
releaseInstance()
}
私人娱乐发布玩家(){
玩家?.release()
}
私人娱乐玩家(){
play()
}
}
使用此功能检查网络可用性
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
}
使用此功能检查网络可用性
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
}
您可以使用来自Android Jetpack组件的MutableLiveData,如下所示。这将帮助您,即使您已连接到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)
}
}
}
}
您可以使用来自Android Jetpack组件的MutableLiveData,如下所示。这将帮助您,即使您已连接到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)
}
}
}
}
兄弟,在你调用play()之前,请检查网络是否可用。你能解释一下怎么做吗兄弟,我是newbiefun isOnline(context:context):Boolean{val connectivityManager=context.getSystemService(context.CONNECTIVITY_SERVICE)由于ConnectivityManager val networkInfo=ConnectivityManager.activeNetworkInfo返回networkInfo!=null&&networkInfo.isConnected}如果上述方法返回true,则仅从MainActivityBrother调用play(),请在调用play()之前检查网络是否可用。请解释如何执行此操作,bro,我是newbiefun isOnline(context:context):Boolean{val connectivityManager=context.getSystemService(context.CONNECTIVITY_SERVICE)as connectivityManager val networkInfo=connectivityManager.activeNetworkInfo return networkInfo!=null&&networkInfo.isConnected}如果上述方法返回true,则只调用play()从您的Main Activity中,我收到两个错误未解决引用上下文和类型不匹配(必需的布尔值,找到:单位)这些错误。请告诉我们您是如何使用它的,如果您正在使用
Activity
我无法在注释部分添加代码,请将上下文更改为此。如何共享代码?我收到2个错误未解决引用上下文和类型不匹配(必需的布尔值,找到:单位)。这些错误出现请向我们展示您如何使用它,如果您正在使用活动
我无法在注释部分添加代码,请将上下文
更改为此
。如何共享代码?