我在其中一个活动中添加了ExoPlayer来播放视频并且它正常运行。但是当播放视频并且用户按下后退按钮时,视频仍然继续在后台播放。我希望它被停止。我尝试捕获后退按钮并尝试暂停视频,但它无法正常工作。除非您杀死该活动,否则视频会一直播放直至完成。这是一个错误,或者这是图书馆的工作方式吗?
这是expPlayr的工作代码
String url = getIntent().getStringExtra("videoURL");
String title = getIntent().getStringExtra("title");
exoPlayerView = (SimpleExoPlayerView) findViewById(R.id.exo_player_id);
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelector trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory(bandwidthMeter));
exoPlayer = ExoPlayerFactory.newSimpleInstance(this, trackSelector);
DefaultHttpDataSourceFactory dataSourceFactory = new DefaultHttpDataSourceFactory(title);
ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
MediaSource m = new HlsMediaSource(Uri.parse(url), dataSourceFactory, null,null);
exoPlayerView.setPlayer(exoPlayer);
exoPlayer.prepare(m);
exoPlayer.setPlayWhenReady(true);
以下是我试图用来停止视频的代码。
@Override
public void onBackPressed(){
try{
exoPlayer.stop();
}catch(Exception e){
e.printStackTrace();
}
}
我在调试模式下查看代码并执行此语句,但仍未停止视频。
答案 0 :(得分:2)
试试这个......
if (exoPlayer != null) {
exoPlayer.setPlayWhenReady(false);
exoPlayer.stop();
exoPlayer.seekTo(0);
}
答案 1 :(得分:1)
我建议在Activity的生命周期方法中初始化并释放播放器。如果你正确地执行此操作,则不需要onBackPressed方法,因为您的代码是在生命周期方法中执行的。
PlayerActivity of the ExoPlayer demo application on Github基本上具有以下生命周期方法:
@Override
public void onStart() {
super.onStart();
if (Util.SDK_INT > 23) {
initializePlayer();
}
}
@Override
public void onResume() {
super.onResume();
if (Util.SDK_INT <= 23 || player == null) {
initializePlayer();
}
}
@Override
public void onPause() {
super.onPause();
if (Util.SDK_INT <= 23) {
releasePlayer();
}
}
@Override
public void onStop() {
super.onStop();
if (Util.SDK_INT > 23) {
releasePlayer();
}
}
答案 2 :(得分:0)
您可以使用exoplayer,releasePlayer方法的示例:
componentDidMount(){
setTimeout( setInterval( () => this.minusOne(), 1000), 1000);
};
请参阅ExoPlayer演示中的PlayerActivity课程。
答案 3 :(得分:0)
我的代码正在进行音频活动:
import React, { Component } from 'react'
import Menu from './menu/view'
import Props from 'prop-types'
import { Container } from 'native-base'
import { updateAlertModalIsOpen } from './formControls/alertModal/action'
import AlertModalComponent from './formControls/alertModal/view'
import UserLoginModal from './user/login/loginModal/view'
import NavigationService from './navigationService'
class Vepo extends Component {
componentDidMount() {
const { store } = this.context
this.unsubscribe = store.subscribe(() => {})
store.dispatch(this.props.fetchUserGeoCoords())
store.dispatch(this.props.fetchSearchQueryPageCategories())
store.dispatch(this.props.fetchCategories())
}
componentWillUnmount() {
this.unsubscribe()
}
render(): Object {
return (
<Container>
<Menu
store={this.context}
ref={navigatorRef => {
NavigationService.setTopLevelNavigator(navigatorRef)
}}>
<AlertModalComponent
yesClicked={() => {
updateAlertModalIsOpen(false)
}}
/>
</Menu>
<UserLoginModal />
</Container>
)
}
}
Vepo.contextTypes = {
store: Props.object
}
export default Vepo
答案 4 :(得分:0)
我在项目中也遇到了同样的问题。我遇到的问题是-加载屏幕时,Exoplayer初始化了两次,并根据SDK版本在onPause或onResume()中调用realeseExoplayer()时释放了一个实例。即使关闭活动,第二个实例仍在后台继续播放。因此,请仔细检查Exoplayer是否已初始化两次。如果多次初始化,请进行必要的更改以初始化一次。
答案 5 :(得分:0)
以下代码对我来说很好:
O(n)
答案 6 :(得分:0)
这是一个示例,您可以如何实现Naveen Dew所说的话。
@Override
public void onDestroyView() {
super.onDestroyView();
if (exoPlayer != null) {
exoPlayer.setPlayWhenReady(false);
exoPlayer.stop();
exoPlayer.seekTo(0);
}
}