我最近尝试在我的android项目中使用谷歌的ExoPlayer。即使我已经打电话给所有必要的东西,Exoplayer也会继续播放视频。播放器没有被释放。看来releasePlayer()根本不起作用。即使我转移到其他活动,视频也会继续播放。我已经尝试了堆栈或codelabs网站上提供的所有解决方案等。这让我把这个问题放在堆栈上。
package com.android.maccino.ui
import android.content.Intent
import android.media.MediaPlayer
import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import com.android.maccino.R
import com.android.maccino.models.SponsorModel
import com.android.maccino.utils.AppConstants
import com.android.maccino.utils.AppUtils
import com.google.android.exoplayer2.*
import com.google.android.exoplayer2.source.ExtractorMediaSource
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.*
import com.kaopiz.kprogresshud.KProgressHUD
import com.orhanobut.logger.Logger
import com.squareup.picasso.Picasso
import kotlinx.android.synthetic.main.activity_dashboard.*
import java.util.*
class DashboardActivity : AppCompatActivity() {
lateinit var sponsorModel: SponsorModel
lateinit var mDatabaseRef: DatabaseReference
lateinit var kProgressHud: KProgressHUD
lateinit var mSponsorList: MutableList<SponsorModel>
lateinit var player: SimpleExoPlayer
var currentWindow: Int = 0
var playbackPosition: Long = 0;
var wasPlayingBefore: Boolean = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dashboard)
mDatabaseRef = FirebaseDatabase.getInstance().reference
sponsorModel = SponsorModel()
mSponsorList = ArrayList<SponsorModel>()
Logger.d(FirebaseAuth.getInstance().currentUser!!.uid)
if (intent != null &&
intent.getSerializableExtra(AppConstants.INTENT_SPONSOR_MODEL) != null) {
sponsorModel = intent.getSerializableExtra(AppConstants.INTENT_SPONSOR_MODEL) as SponsorModel
setValues()
}
btnAnswer1.setOnClickListener {
if (sponsorModel.answers.get(0).getValue(btnAnswer1.text.toString()) == true) {
makeAnsweredSponsorEntry()
startActivity(Intent(this@DashboardActivity, CorrectAnswer::class.java).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra(AppConstants.INTENT_SPONSOR_MODEL, sponsorModel))
this.finish()
} else if (sponsorModel.answers.get(0).getValue(btnAnswer1.text.toString()) == false) {
startActivity(Intent(this@DashboardActivity, WrongAnswer::class.java))
}
}
btnAnswer2.setOnClickListener {
if (sponsorModel.answers.get(1).getValue(btnAnswer2.text.toString()) == true) {
makeAnsweredSponsorEntry()
startActivity(Intent(this@DashboardActivity, CorrectAnswer::class.java).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra(AppConstants.INTENT_SPONSOR_MODEL, sponsorModel))
this.finish()
} else if (sponsorModel.answers.get(1).getValue(btnAnswer2.text.toString()) == false) {
startActivity(Intent(this@DashboardActivity, WrongAnswer::class.java))
}
}
btnAnswer3.setOnClickListener {
if (sponsorModel.answers.get(2).getValue(btnAnswer3.text.toString()) == true) {
makeAnsweredSponsorEntry()
startActivity(Intent(this@DashboardActivity, CorrectAnswer::class.java).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP).putExtra(AppConstants.INTENT_SPONSOR_MODEL, sponsorModel))
this.finish()
} else if (sponsorModel.answers.get(2).getValue(btnAnswer3.text.toString()) == false) {
startActivity(Intent(this@DashboardActivity, WrongAnswer::class.java))
}
}
tvSearch.setOnClickListener { startActivity(Intent(this@DashboardActivity, SearchActivity::class.java).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) }
}
override fun onResume() {
super.onResume()
initializePlayer()
}
override fun onPause() {
super.onPause()
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
private fun setValues() {
try {
tvQuestion.setText(sponsorModel.question)
sponsorModel.answers.get(0).keys.forEach { key: String ->
btnAnswer1.setText(key)
}
sponsorModel.answers.get(1).keys.forEach { key: String ->
btnAnswer2.setText(key)
}
sponsorModel.answers.get(2).keys.forEach { key: String ->
btnAnswer3.setText(key)
}
tvSponsorName.setText(sponsorModel.sponsor_name)
Picasso.with(this@DashboardActivity).load(sponsorModel.logo).into(ivSponsorLogo)
ivFlag.setOnClickListener { startActivity(Intent(Intent.ACTION_VIEW).setDataAndType(Uri.parse(sponsorModel.video_url), "video/*")) }
initializePlayer()
} catch (e: Exception) {
e.printStackTrace()
}
}
//Player implementation
private fun initializePlayer() {
try {
player = ExoPlayerFactory.newSimpleInstance(
DefaultRenderersFactory(this@DashboardActivity),
DefaultTrackSelector(), DefaultLoadControl())
player.repeatMode = Player.REPEAT_MODE_ALL
playerView.player = player
playerView.hideController()
player.setPlayWhenReady(true)
player.seekTo(currentWindow, playbackPosition);
val uri = Uri.parse(sponsorModel.video_url)
val mediaSource = buildMediaSource(uri)
player.prepare(mediaSource, true, false)
wasPlayingBefore = true
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun buildMediaSource(uri: Uri): MediaSource {
return ExtractorMediaSource.Factory(
DefaultHttpDataSourceFactory("exoplayer-maccino")).createMediaSource(uri)
}
private fun releasePlayer() {
if (player != null) {
playbackPosition = player.currentPosition
currentWindow = player.currentWindowIndex
player.playWhenReady = false
player.setRepeatMode(Player.REPEAT_MODE_OFF)
player.stop()
player.release()
playerView.player = null
// player = null
}
}
}