package com.c9mj.platform.live.ui; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Color; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.PowerManager; import android.support.v4.content.ContextCompat; import android.text.TextUtils; import android.util.Log; import android.view.Gravity; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.blankj.utilcode.utils.ScreenUtils; import com.blankj.utilcode.utils.SizeUtils; import com.blankj.utilcode.utils.ToastUtils; import com.c9mj.platform.R; import com.c9mj.platform.live.mvp.model.DanmuBean; import com.c9mj.platform.live.mvp.model.LiveDetailBean; import com.c9mj.platform.live.mvp.model.LivePandaBean; import com.c9mj.platform.live.mvp.presenter.impl.LivePlayPresenterImpl; import com.c9mj.platform.live.mvp.view.ILivePlayActivity; import com.c9mj.platform.util.retrofit.exception.MediaException; import com.c9mj.platform.widget.activity.BaseSwipeActivity; import com.pili.pldroid.player.AVOptions; import com.pili.pldroid.player.PLMediaPlayer; import net.lucode.hackware.magicindicator.FragmentContainerHelper; import net.lucode.hackware.magicindicator.MagicIndicator; import net.lucode.hackware.magicindicator.buildins.UIUtil; import net.lucode.hackware.magicindicator.buildins.commonnavigator.CommonNavigator; import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter; import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IPagerTitleView; import net.lucode.hackware.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator; import net.lucode.hackware.magicindicator.buildins.commonnavigator.titles.CommonPagerTitleView; import java.io.IOException; import java.util.ArrayList; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import master.flame.danmaku.controller.DrawHandler; import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.DanmakuTimer; import master.flame.danmaku.danmaku.model.IDanmakus; import master.flame.danmaku.danmaku.model.android.DanmakuContext; import master.flame.danmaku.danmaku.model.android.Danmakus; import master.flame.danmaku.danmaku.parser.BaseDanmakuParser; import master.flame.danmaku.ui.widget.DanmakuView; import me.yokeyword.fragmentation.SupportFragment; /** * author: LMJ * date: 2016/9/12 * 观看直播Activity */ public class LivePlayActivity extends BaseSwipeActivity implements ILivePlayActivity, PLMediaPlayer.OnPreparedListener, PLMediaPlayer.OnVideoSizeChangedListener, PLMediaPlayer.OnCompletionListener, PLMediaPlayer.OnInfoListener, PLMediaPlayer.OnErrorListener, Handler.Callback { public static final String LIVE_TYPE = "live_type"; //直播平台 public static final String LIVE_ID = "live_id"; //直播房间ID public static final String GAME_TYPE = "game_type"; //直播游戏类型 private static final int HANDLER_HIDE_CONTROLLER = 100;//隐藏MediaController private static final int HANDLER_CONTROLLER_DURATION = 5 * 1000;//MediaController显示时间 private final String[] indicatorText = new String[]{ "聊天", "主播" }; private final int[] normalResId = new int[]{ R.drawable.ic_danmu_on_normal_dark, R.drawable.ic_avatar_normal }; private final int[] pressedResId = new int[]{ R.drawable.ic_danmu_on_pressed, R.drawable.ic_avatar_pressed }; private final BaseDanmakuParser parser = new BaseDanmakuParser() { @Override protected IDanmakus parse() { return new Danmakus(); } }; private final FragmentContainerHelper fragmentContainerHelper = new FragmentContainerHelper(); private final List<String> titleList = new ArrayList<>(); private final SupportFragment[] fragments = new SupportFragment[2]; @BindView(R.id.surfaceview) SurfaceView surfaceView; //用于显示播放画面 @BindView(R.id.danmuview) DanmakuView danmuView; //横屏控件 @BindView(R.id.iv_back_landscape) ImageView iv_back_landscape; @BindView(R.id.tv_roomname_landscape) TextView tv_roomname_landscape; @BindView(R.id.btn_stream_1080p_landscape) Button btn_stream_1080p_landscape; @BindView(R.id.btn_stream_360p_landscape) Button btn_stream_360p_landscape; @BindView(R.id.iv_play_pause_landscape) ImageView iv_play_pause_landscape; @BindView(R.id.iv_refresh_landscape) ImageView iv_refresh_landscape; @BindView(R.id.et_danmu_landscape) EditText et_danmu_landscape; @BindView(R.id.btn_send_landscape) Button btn_send_landscape; @BindView(R.id.iv_danmu_visible_landscape) ImageView iv_danmu_visible_landscape; @BindView(R.id.iv_fullscreen_exit_landscape) ImageView iv_fullscreen_exit_landscape; @BindView(R.id.layout_landscape) RelativeLayout layout_landscape; //竖屏控件 @BindView(R.id.iv_back_portrait) ImageView iv_back_portrait; @BindView(R.id.iv_danmu_visible_portrait) ImageView iv_danmu_visible_portrait; @BindView(R.id.iv_fullscreen_portrait) ImageView iv_fullscreen_portrait; @BindView(R.id.layout_portrait) RelativeLayout layout_portrait; @BindView(R.id.progressbar) FrameLayout progressbar; @BindView(R.id.layout_top) FrameLayout layout_top; //底部Layout相关 @BindView(R.id.layout_bottom) LinearLayout layout_bottom; @BindView(R.id.magic_indicator) MagicIndicator indicator; private boolean isSurfaceViewInit = false; //SurfaceView初始化标志位 private boolean isVideoPrepared = false; //Video加载标志位,用于显示隐藏ProgreeBar private boolean isPause = false; //直播暂停标志位 private boolean isFullscreen = false; //全屏标志位 private boolean isControllerHiden = false; //MediaController显示隐藏标志位 private String live_type; //直播平台 private String live_id; //直播房间号ID private String game_type; //直播游戏类型 private String live_url; //直播url private int surfacePortraitWidth; private int surfacePortraitHeight; private int videoWidth; private int videoHeight; private int playWidth; private int playHeight; private List<LiveDetailBean.StreamListBean> streamList = new ArrayList<>();//直播流列表 private Context context; private LivePlayPresenterImpl presenter; private Handler controllerHandler; private boolean isShowDanmu = false;// 弹幕显示标志位 private DanmakuContext danmakuContext; private CommonNavigatorAdapter navigatorAdapter; private LivePlayChatFragment chatFragment;//弹幕聊天室Fragment private LivePlayAvatarFragment avatarFragment;//主播详情Fragment private int current; private PLMediaPlayer mediaPlayer; //媒体控制器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_live_play); ButterKnife.bind(this); context = this; controllerHandler = new Handler(this); //得到传入的参数 Intent intent = getIntent(); live_type = intent.getStringExtra(LIVE_TYPE); live_id = intent.getStringExtra(LIVE_ID); game_type = intent.getStringExtra(GAME_TYPE); initView(); presenter.getLiveDetail(live_type, live_id, game_type); //请求直播详情 presenter.getDanmuDetail(live_id, live_type); //请求弹幕服务器相关参数 } @Override protected void onResume() { super.onResume(); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); if (mediaPlayer != null && isPause && !TextUtils.isEmpty(live_url)) { try { // AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); mediaPlayer.reset(); mediaPlayer.setDataSource(live_url); mediaPlayer.prepareAsync(); isPause = false; } catch (IOException e) { e.printStackTrace(); } } if (danmuView != null && danmuView.isPrepared() && danmuView.isPaused()) { danmuView.resume(); } } @Override protected void onPause() { super.onPause(); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); if (mediaPlayer != null && mediaPlayer.isPlaying()) { mediaPlayer.pause(); isPause = true; // AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // audioManager.abandonAudioFocus(null); } if (danmuView != null && danmuView.isPrepared()) { danmuView.pause(); } } @Override protected void onDestroy() { super.onDestroy(); if (mediaPlayer != null) { mediaPlayer.pause(); mediaPlayer.stop(); mediaPlayer.release(); mediaPlayer = null; // AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // audioManager.abandonAudioFocus(null); } //断开弹幕服务器连接 presenter.closeConnection(); //关闭弹幕 isShowDanmu = false; if (danmuView != null) { danmuView.release(); danmuView = null; } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); progressbar.setVisibility(isVideoPrepared ? View.GONE : View.VISIBLE); } @Override public void onBackPressedSupport() { if (isFullscreen) { exitFullscreen(); } else { super.onBackPressedSupport(); } } private void initView() { //初始化MVP presenter = new LivePlayPresenterImpl(this); //设置RefreshLayout //设置RecyclerView /***设置其他View***/ tv_roomname_landscape.setSelected(true); //SurfaceView监听回调 surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { progressbar.setVisibility(View.VISIBLE); prepareMediaPlayer(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (!isSurfaceViewInit) { //竖屏 surfacePortraitWidth = width; surfacePortraitHeight = height; isSurfaceViewInit = true; } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mediaPlayer != null) { mediaPlayer.setDisplay(null); } } }); //MediaController controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); et_danmu_landscape.setOnTouchListener((v, event) -> { //点击弹幕编辑时取消隐藏Controller controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); return false; }); //弹幕烈焰使 iv_danmu_visible_landscape.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); iv_danmu_visible_portrait.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); danmuView.enableDanmakuDrawingCache(true);//打开绘图缓存,提升绘制效率 danmuView.setCallback(new DrawHandler.Callback() { @Override public void prepared() { try { isShowDanmu = true; danmuView.start(); iv_danmu_visible_landscape.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); iv_danmu_visible_portrait.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); } catch (Exception e) { e.printStackTrace(); } } @Override public void updateTimer(DanmakuTimer timer) { } @Override public void danmakuShown(BaseDanmaku danmaku) { } @Override public void drawingFinished() { } }); danmakuContext = DanmakuContext.create(); danmakuContext.setDuplicateMergingEnabled(true);//设置合并重复弹幕 danmuView.prepare(parser, danmakuContext); //ViewPager + Indicator titleList.add(indicatorText[0]); titleList.add(indicatorText[1]); chatFragment = LivePlayChatFragment.newInstance(); avatarFragment = LivePlayAvatarFragment.newInstance(); fragments[0] = chatFragment; fragments[1] = avatarFragment; loadMultipleRootFragment(R.id.layout_container, 0, fragments); current = 0; CommonNavigator navigator = new CommonNavigator(context); navigator.setAdjustMode(true); navigator.setFollowTouch(true); navigatorAdapter = new CommonNavigatorAdapter() { @Override public int getCount() { return fragments.length; } @Override public IPagerTitleView getTitleView(final Context context, final int index) { CommonPagerTitleView titleView = new CommonPagerTitleView(context); titleView.setContentView(R.layout.item_live_play_indicator_layout);//加载自定义布局作为Tab final ImageView live_play_iv_icon = (ImageView) titleView.findViewById(R.id.live_play_iv_icon); final TextView live_play_tv_title = (TextView) titleView.findViewById(R.id.live_play_tv_title); live_play_tv_title.setText(indicatorText[index]); titleView.setOnPagerTitleChangeListener(new CommonPagerTitleView.OnPagerTitleChangeListener() { @Override public void onSelected(int index, int totalCount) { live_play_iv_icon.setImageResource(pressedResId[index]); live_play_tv_title.setTextColor(ContextCompat.getColor(context, R.color.color_primary)); } @Override public void onDeselected(int index, int totalCount) { live_play_iv_icon.setImageResource(normalResId[index]); live_play_tv_title.setTextColor(ContextCompat.getColor(context, R.color.color_secondary_text)); } @Override public void onLeave(int i, int i1, float v, boolean b) { } @Override public void onEnter(int i, int i1, float v, boolean b) { } }); titleView.setOnClickListener(v -> { fragmentContainerHelper.handlePageSelected(index); showHideFragment(fragments[index], fragments[current]); current = index; }); return titleView; } @Override public IPagerIndicator getIndicator(Context context) { LinePagerIndicator indicator = new LinePagerIndicator(context); indicator.setMode(LinePagerIndicator.MODE_MATCH_EDGE); indicator.setLineHeight(UIUtil.dip2px(context, 3)); indicator.setRoundRadius(UIUtil.dip2px(context, 2)); // indicator.setYOffset(UIUtil.dip2px(context, 0.5)); indicator.setColors(ContextCompat.getColor(context, R.color.color_primary)); return indicator; } }; navigator.setAdapter(navigatorAdapter); indicator.setNavigator(navigator); fragmentContainerHelper.attachMagicIndicator(indicator); } /** * 配置MediaPlayer相关参数 */ private void prepareMediaPlayer() { if (mediaPlayer != null) { mediaPlayer.setDisplay(surfaceView.getHolder()); return; } try { AVOptions avOptions = new AVOptions(); avOptions.setInteger(AVOptions.KEY_LIVE_STREAMING, 0); //直播流:1->是 0->否 avOptions.setInteger(AVOptions.KEY_MEDIACODEC, 0); //解码类型 1->硬解 0->软解 avOptions.setInteger(AVOptions.KEY_START_ON_PREPARED, 0);//缓冲结束后自动播放 avOptions.setInteger(AVOptions.KEY_DELAY_OPTIMIZATION, 1); avOptions.setInteger(AVOptions.KEY_PREPARE_TIMEOUT, 10 * 1000); avOptions.setInteger(AVOptions.KEY_BUFFER_TIME, 10 * 1000); avOptions.setInteger(AVOptions.KEY_GET_AV_FRAME_TIMEOUT, 10 * 1000); avOptions.setInteger(AVOptions.KEY_CACHE_BUFFER_DURATION, 10 * 1000); avOptions.setInteger(AVOptions.KEY_MAX_CACHE_BUFFER_DURATION, 15 * 1000); // AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); // audioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); mediaPlayer = new PLMediaPlayer(context, avOptions); mediaPlayer.setOnPreparedListener(this); mediaPlayer.setOnVideoSizeChangedListener(this); mediaPlayer.setOnCompletionListener(this); mediaPlayer.setOnInfoListener(this); mediaPlayer.setOnErrorListener(this); mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); // mediaPlayer.setDataSource(live_url); mediaPlayer.setDisplay(surfaceView.getHolder()); mediaPlayer.prepareAsync(); } catch (Exception e) { e.printStackTrace(); } } @Override public void updateLiveDetail(LiveDetailBean detailBean) { try { tv_roomname_landscape.setText(detailBean.getLive_title()); streamList = detailBean.getStream_list(); LiveDetailBean.StreamListBean stream = streamList.get(streamList.size() - 1); live_url = stream.getUrl(); if (streamList.size() == 1) { if (stream.getType().equals(getString(R.string.stream_1080p))) { btn_stream_360p_landscape.setVisibility(View.GONE); } if (stream.getType().equals(getString(R.string.stream_360p))) { btn_stream_1080p_landscape.setVisibility(View.GONE); } } if (stream.getType().equals(getString(R.string.stream_1080p))) { btn_stream_1080p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_pressed)); btn_stream_360p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_normal)); btn_stream_1080p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_primary)); btn_stream_360p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_icons)); } if (stream.getType().equals(getString(R.string.stream_360p))) { btn_stream_1080p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_normal)); btn_stream_360p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_pressed)); btn_stream_1080p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_icons)); btn_stream_360p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_primary)); } } catch (NullPointerException e) { e.printStackTrace(); live_url = "rtmp://live.hkstv.hk.lxdns.com/live/hks"; } try { mediaPlayer.setDataSource(live_url);//加载直播链接进行播放 mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } //把LiveDetail传入主播页面Fragment avatarFragment.updateLiveDetail(detailBean); } @Override public void updateChatDetail(LivePandaBean pandaBean) { presenter.connectToChatRoom(live_id, pandaBean); } @Override public void receiveDanmu(DanmuBean danmuBean, boolean withBorder) { this.addDanmuOnDanmakuView(danmuBean, false); if (chatFragment != null) { chatFragment.addDanmuOnRecyclerView(danmuBean); } } @Override public void showError(String message) { ToastUtils.showShortToast(message); } /******** * 以下实现的Interface都是MediaPlayer的监听 *********/ @Override public void onPrepared(PLMediaPlayer plMediaPlayer) { progressbar.setVisibility(isVideoPrepared ? View.GONE : View.VISIBLE); mediaPlayer.start(); } @Override public void onVideoSizeChanged(PLMediaPlayer plMediaPlayer, int width, int height, int i2, int i3) { videoWidth = width; videoHeight = height; if (videoWidth != 0 && videoHeight != 0) { float ratioW = (float) videoWidth / (float) (isFullscreen ? ScreenUtils.getScreenWidth() : surfacePortraitWidth); float ratioH = (float) videoHeight / (float) (isFullscreen ? ScreenUtils.getScreenHeight() : surfacePortraitHeight); float ratio = Math.max(ratioW, ratioH); playWidth = (int) Math.ceil((float) videoWidth / ratio); playHeight = (int) Math.ceil((float) videoHeight / ratio); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(playWidth, playHeight); lp.gravity = Gravity.CENTER; surfaceView.setLayoutParams(lp); } } @Override public void onCompletion(PLMediaPlayer plMediaPlayer) { } @Override public boolean onInfo(PLMediaPlayer plMediaPlayer, int what, int extra) { switch (what) { case PLMediaPlayer.MEDIA_INFO_BUFFERING_START://开始缓冲 // isVideoPrepared = false; Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_BUFFERING_START"); break; case PLMediaPlayer.MEDIA_INFO_BUFFERING_END://缓冲结束 Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_BUFFERING_END"); break; case PLMediaPlayer.MEDIA_INFO_BUFFERING_BYTES_UPDATE: Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_BUFFERING_BYTES_UPDATE"); break; case PLMediaPlayer.MEDIA_INFO_NOT_SEEKABLE: Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_NOT_SEEKABLE"); break; case PLMediaPlayer.MEDIA_INFO_VIDEO_ROTATION_CHANGED: Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_VIDEO_ROTATION_CHANGED"); break; case PLMediaPlayer.MEDIA_INFO_AUDIO_RENDERING_START: Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_AUDIO_RENDERING_START"); break; case PLMediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START://视频缓冲完成可播放 progressbar.setVisibility(View.GONE); isVideoPrepared = true; isPause = false; iv_play_pause_landscape.setImageResource(isPause ? R.drawable.selector_btn_play : R.drawable.selector_btn_pause); Log.d("PLMediaPlayer", "onInfo: MEDIA_INFO_VIDEO_RENDERING_START"); break; default: Log.d("PLMediaPlayer", "onInfo: " + what); break; } return true; } @Override public boolean onError(PLMediaPlayer plMediaPlayer, int errorCode) { showError(new MediaException(errorCode).getMessage()); return true; } @OnClick({ R.id.surfaceview, R.id.iv_back_landscape, R.id.btn_stream_1080p_landscape, R.id.btn_stream_360p_landscape, R.id.iv_play_pause_landscape, R.id.iv_refresh_landscape, R.id.btn_send_landscape, R.id.iv_danmu_visible_landscape, R.id.iv_fullscreen_exit_landscape, R.id.iv_back_portrait, R.id.iv_danmu_visible_portrait, R.id.iv_fullscreen_portrait }) public void onClick(View view) { switch (view.getId()) { case R.id.surfaceview: if (isFullscreen) { if (isControllerHiden) {//全屏&&隐藏 layout_landscape.setVisibility(View.VISIBLE); layout_portrait.setVisibility(View.GONE); controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); isControllerHiden = false; } else if (!isControllerHiden) {//全屏&&显示 controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessage(HANDLER_HIDE_CONTROLLER); } } else if (!isFullscreen) { if (isControllerHiden) {//非全屏&&隐藏 layout_landscape.setVisibility(View.GONE); layout_portrait.setVisibility(View.VISIBLE); controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); isControllerHiden = false; } else if (!isControllerHiden) {//非全屏&&显示 controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessage(HANDLER_HIDE_CONTROLLER); } } break; //全屏Back case R.id.iv_back_landscape: onBackPressedSupport(); break; //直播流连接切换(超清) case R.id.btn_stream_1080p_landscape: controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); btn_stream_1080p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_pressed)); btn_stream_360p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_normal)); btn_stream_1080p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_primary)); btn_stream_360p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_icons)); for (LiveDetailBean.StreamListBean stream : streamList) { if (stream.getType().equals(getString(R.string.stream_1080p))) { live_url = stream.getUrl(); } } mediaPlayer.reset(); //显示ProgressBar isVideoPrepared = false; progressbar.setVisibility(isVideoPrepared ? View.GONE : View.VISIBLE); try { mediaPlayer.setDataSource(live_url);//加载直播链接进行播放 } catch (IOException e) { e.printStackTrace(); } mediaPlayer.prepareAsync(); break; //直播流连接切换(普清) case R.id.btn_stream_360p_landscape: controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); btn_stream_1080p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_normal)); btn_stream_360p_landscape.setBackground(ContextCompat.getDrawable(context, R.drawable.background_btn_stream_pressed)); btn_stream_1080p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_icons)); btn_stream_360p_landscape.setTextColor(ContextCompat.getColor(context, R.color.color_primary)); for (LiveDetailBean.StreamListBean stream : streamList) { if (stream.getType().equals(getString(R.string.stream_360p))) { live_url = stream.getUrl(); } } mediaPlayer.reset(); //显示ProgressBar isVideoPrepared = false; progressbar.setVisibility(isVideoPrepared ? View.GONE : View.VISIBLE); try { mediaPlayer.setDataSource(live_url);//加载直播链接进行播放 } catch (IOException e) { e.printStackTrace(); } mediaPlayer.prepareAsync(); break; //播放&暂停 case R.id.iv_play_pause_landscape: if (isPause) { onResume(); } else if (!isPause) { onPause(); } iv_play_pause_landscape.setImageResource(isPause ? R.drawable.selector_btn_play : R.drawable.selector_btn_pause); controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); break; //重新加载 case R.id.iv_refresh_landscape: try { mediaPlayer.reset(); isVideoPrepared = false; progressbar.setVisibility(isVideoPrepared ? View.GONE : View.VISIBLE); mediaPlayer.setDataSource(live_url);//加载直播链接进行播放 mediaPlayer.prepareAsync(); } catch (IOException e) { e.printStackTrace(); } controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); break; //横屏发送弹幕 case R.id.btn_send_landscape: controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); String danmu = et_danmu_landscape.getText().toString(); if (TextUtils.isEmpty(danmu)) { ToastUtils.showShortToast("发送弹幕内容不能为空"); return; } //新建弹幕对象 DanmuBean danmuBean = new DanmuBean(); DanmuBean.DataBean dataBean = new DanmuBean.DataBean(); DanmuBean.DataBean.FromBean fromBean = new DanmuBean.DataBean.FromBean(); fromBean.setNickName(getString(R.string.chat_name)); fromBean.setUserName(getString(R.string.chat_name)); dataBean.setFrom(fromBean); dataBean.setContent(danmu); danmuBean.setData(dataBean); this.addDanmuOnDanmakuView(danmuBean, true); //添加弹幕至DanmakuView chatFragment.addDanmuOnRecyclerView(danmuBean);//添加弹幕至RecyclerView et_danmu_landscape.setText(null); break; //横屏弹幕显示&隐藏 case R.id.iv_danmu_visible_landscape: if (isShowDanmu) {//已开启弹幕 isShowDanmu = false; iv_danmu_visible_landscape.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); iv_danmu_visible_portrait.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); ToastUtils.showShortToast("弹幕已关闭!"); } else if (!isShowDanmu) {//已关闭弹幕 isShowDanmu = true; iv_danmu_visible_landscape.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); iv_danmu_visible_portrait.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); ToastUtils.showShortToast("弹幕已开启!"); } controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); break; //退出全屏 case R.id.iv_fullscreen_exit_landscape: exitFullscreen(); break; //竖屏Back case R.id.iv_back_portrait: onBackPressedSupport(); break; //竖屏弹幕显示隐藏 case R.id.iv_danmu_visible_portrait: if (isShowDanmu) {//已开启弹幕 isShowDanmu = false; iv_danmu_visible_landscape.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); iv_danmu_visible_portrait.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); ToastUtils.showShortToast("弹幕已关闭!"); } else if (!isShowDanmu) {//已关闭弹幕 isShowDanmu = true; iv_danmu_visible_landscape.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); iv_danmu_visible_portrait.setImageResource(isShowDanmu ? R.drawable.selector_btn_danmu_on : R.drawable.selector_btn_danmu_off); ToastUtils.showShortToast("弹幕已开启!"); } controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); break; case R.id.iv_fullscreen_portrait://进入全屏 enterFullscreen(); break; } } /** * ListPlayChatFragment调用,添加弹幕到DanmakuView * * @param danmuBean * @param withBorder */ public void addDanmuOnDanmakuView(DanmuBean danmuBean, boolean withBorder) { if (!isShowDanmu) { return; } BaseDanmaku danmaku = danmakuContext.mDanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); danmaku.text = danmuBean.getData().getContent(); danmaku.textSize = SizeUtils.sp2px(12 * 1.0f); danmaku.textColor = Color.WHITE; danmaku.setTime(danmuView.getCurrentTime()); if (withBorder) { danmaku.borderColor = ContextCompat.getColor(context, R.color.color_primary); } danmuView.addDanmaku(danmaku); } //进入全屏 private void enterFullscreen() { layout_top.removeView(surfaceView); layout_top.removeView(progressbar); layout_top.removeView(danmuView); layout_top.removeView(layout_landscape); layout_top.removeView(layout_portrait); ScreenUtils.setLandscape(this); isFullscreen = true; isControllerHiden = false; controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); layout_top.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(progressbar, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(danmuView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(layout_landscape, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(layout_portrait, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); //全屏隐藏状态栏 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(lp); layout_bottom.setVisibility(View.GONE); // progressbar.setVisibility(isVideoPrepared == true ? View.GONE : View.VISIBLE); layout_landscape.setVisibility(View.VISIBLE); layout_portrait.setVisibility(View.GONE); iv_play_pause_landscape.setImageResource(isPause ? R.drawable.selector_btn_play : R.drawable.selector_btn_pause); } //退出全屏 private void exitFullscreen() { layout_top.removeView(surfaceView); layout_top.removeView(progressbar); layout_top.removeView(danmuView); layout_top.removeView(layout_landscape); layout_top.removeView(layout_portrait); ScreenUtils.setPortrait(this); isFullscreen = false; isControllerHiden = false; controllerHandler.removeMessages(HANDLER_HIDE_CONTROLLER); controllerHandler.sendEmptyMessageDelayed(HANDLER_HIDE_CONTROLLER, HANDLER_CONTROLLER_DURATION); layout_top.addView(surfaceView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(progressbar, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(danmuView, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(layout_landscape, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); layout_top.addView(layout_portrait, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); onVideoSizeChanged(mediaPlayer, videoWidth, videoHeight, 0, 0); //显示状态栏 WindowManager.LayoutParams lp = getWindow().getAttributes(); lp.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(lp); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); layout_bottom.setVisibility(View.VISIBLE); // progressbar.setVisibility(isVideoPrepared == true ? View.GONE : View.VISIBLE); layout_landscape.setVisibility(View.GONE); layout_portrait.setVisibility(View.VISIBLE); } @Override public boolean handleMessage(Message msg) { if (msg.what == HANDLER_HIDE_CONTROLLER) { //hide controller layout_landscape.setVisibility(View.GONE); layout_portrait.setVisibility(View.GONE); isControllerHiden = true; } return true; } }