android - 如何在exoplayer的后台停止音频播放

标签 android exoplayer

**

需要使用 exoplayer 在 fragment 中实现视频流。流式传输工作正常,但是当从 fragment Activity 移动到其他 Activity 或屏幕旋转时,相同音频的多个副本会在后台连续播放,直到应用程序被杀死。如何处理这个请帮忙。提前致谢。

**
    public class VideoFragment extends Fragment {
    private SimpleExoPlayerView simpleExoPlayerView;
    public SimpleExoPlayer player;
    Uri mp4VideoUri;
    String TAG ="LOGG";
    SharedPrefs sharedPrefs;
    TextView notavailable;
    String url;
    Connection connection;
    long media_length;

    public VideoFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.video_fragment,container,false);
        sharedPrefs = new SharedPrefs(getContext());
        connection = new Connection(getContext());
        notavailable= (TextView) rootView.findViewById(R.id.videonotavailable);
        BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
        TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
        TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
        LoadControl loadControl = new DefaultLoadControl();
        player = ExoPlayerFactory.newSimpleInstance(getContext(), trackSelector, loadControl);
        simpleExoPlayerView = new SimpleExoPlayerView(getContext());
        simpleExoPlayerView = (SimpleExoPlayerView) rootView.findViewById(R.id.player_view);
        simpleExoPlayerView.setUseController(true);
        simpleExoPlayerView.requestFocus();
        simpleExoPlayerView.setPlayer(player);
        DefaultBandwidthMeter bandwidthMeterA = new DefaultBandwidthMeter();
        DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(getContext(), Util.getUserAgent(getContext(), "exoplayer2example"), bandwidthMeterA);
        ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
        url=sharedPrefs.getvideoUrl();
        if (url==null || url.equals("")){
            simpleExoPlayerView.setVisibility(View.GONE);
            notavailable.setVisibility(View.VISIBLE);
        }else if (connection.isInternet()){
            mp4VideoUri=Uri.parse(sharedPrefs.getvideoUrl());
            MediaSource videoSource = new ExtractorMediaSource(mp4VideoUri,dataSourceFactory,extractorsFactory,null,null);
            final LoopingMediaSource loopingSource = new LoopingMediaSource(videoSource);

            player.prepare(loopingSource);

            player.addListener(new ExoPlayer.EventListener() {
                @Override
                public void onLoadingChanged(boolean isLoading) {
                    Log.v(TAG,"Listener-onLoadingChanged...");
                }

                @Override
                public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
                    Log.v(TAG,"Listener-onPlayerStateChanged...");
                }

                @Override
                public void onTimelineChanged(Timeline timeline, Object manifest) {
                    Log.v(TAG,"Listener-onTimelineChanged...");

                }

                @Override
                public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {

                }

                @Override
                public void onPlayerError(ExoPlaybackException error) {
                    Log.v(TAG,"Listener-onPlayerError...");
                    player.stop();
                }

                @Override
                public void onPositionDiscontinuity() {
                    Log.v("LOG","Listener-onPositionDiscontinuity...");

                }

                @Override
                public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {

                }
            });
            player.setPlayWhenReady(true);
        }else {
            simpleExoPlayerView.setVisibility(View.GONE);
            notavailable.setVisibility(View.VISIBLE);
            notavailable.setText(getString(R.string.nointernet));
        }
        return rootView;
    }

    @Override
    public void onPause() {
        super.onPause();
        if(player != null) {
            player.stop();
            player.release();
            media_length = player.getCurrentPosition();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if(player != null) {
            player.seekTo(media_length);
            player.setPlayWhenReady(true);
        }
    }
}

最佳答案

在您的 fragment 持有 Activity 中,您需要处理 onPause 中的情况。方法:

@Override
protected void onPause() {
    super.onPause();
    mPlayerFragment.pause();
}

您可以在 fragment 中定义一个方法来暂停播放,方法是将 false 传递给 setPlayWhenReady()。 .
public void pausePlayback() {
        mExoPlayer.setPlayWhenReady(false); //pauses the playback if it's playing
    }

关于android - 如何在exoplayer的后台停止音频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363079/

相关文章:

javascript - 音频播放器错误 : stopPlaying() called during invalid state: 0

android - 如何使用 Google Maps Android API v2 绘制动态线(路线)

java - 另一个谷歌地图 v2 无法充气,请

android - Admob 不使用 AsyncTask

android - 改变 Exo 播放器的比特率

android - 拔下耳机时暂停 ExoPlayer

java - 如何以编程方式获取 android exoplayer 中的帧速率?

android - Google Exoplayer 如何从 assets/media.exolist.json 更改播放

android - 放置自动完成 fragment 清除按钮设置可见性消失

android - 是否有使用字幕的 ExoPlayer + Leanback 库示例?