Commit ae3c8ee633d112780925c596810206528bc6d062
1 parent
3f87575c
修复VideoView释放后setVideoScalingMode空指针问题
Showing
4 changed files
with
27 additions
and
252 deletions
.idea/misc.xml
| 1 | 1 | <?xml version="1.0" encoding="UTF-8"?> |
| 2 | 2 | <project version="4"> |
| 3 | + <component name="EntryPointsManager"> | |
| 4 | + <entry_points version="2.0" /> | |
| 5 | + </component> | |
| 6 | + <component name="NullableNotNullManager"> | |
| 7 | + <option name="myDefaultNullable" value="android.support.annotation.Nullable" /> | |
| 8 | + <option name="myDefaultNotNull" value="android.support.annotation.NonNull" /> | |
| 9 | + <option name="myNullables"> | |
| 10 | + <value> | |
| 11 | + <list size="4"> | |
| 12 | + <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" /> | |
| 13 | + <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" /> | |
| 14 | + <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" /> | |
| 15 | + <item index="3" class="java.lang.String" itemvalue="android.support.annotation.Nullable" /> | |
| 16 | + </list> | |
| 17 | + </value> | |
| 18 | + </option> | |
| 19 | + <option name="myNotNulls"> | |
| 20 | + <value> | |
| 21 | + <list size="4"> | |
| 22 | + <item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" /> | |
| 23 | + <item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" /> | |
| 24 | + <item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" /> | |
| 25 | + <item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" /> | |
| 26 | + </list> | |
| 27 | + </value> | |
| 28 | + </option> | |
| 29 | + </component> | |
| 3 | 30 | <component name="ProjectLevelVcsManager" settingsEditedManually="false"> |
| 4 | 31 | <OptionsSetting value="true" id="Add" /> |
| 5 | 32 | <OptionsSetting value="true" id="Remove" /> | ... | ... |
app/libs/libcnlivevideo.jar
No preview for this file type
app/src/main/java/com/cnlive/demo/video/MainActivity.java
| ... | ... | @@ -35,7 +35,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe |
| 35 | 35 | startActivity(new Intent(this, SltVideoActivity.class)); |
| 36 | 36 | break; |
| 37 | 37 | case R.id.videoStatus: |
| 38 | - startActivity(new Intent(this, VideoStatusActivity.class)); | |
| 39 | 38 | break; |
| 40 | 39 | } |
| 41 | 40 | } | ... | ... |
app/src/main/java/com/cnlive/demo/video/VideoStatusActivity.java deleted
100644 → 0
| 1 | -package com.cnlive.demo.video; | |
| 2 | - | |
| 3 | -import android.app.Activity; | |
| 4 | -import android.os.Bundle; | |
| 5 | -import android.view.View; | |
| 6 | -import android.widget.Button; | |
| 7 | -import android.widget.TextView; | |
| 8 | -import android.widget.Toast; | |
| 9 | - | |
| 10 | -import com.cnlive.libs.video.video.VideoStatusUtil; | |
| 11 | -import com.cnlive.libs.video.video.VideoView; | |
| 12 | -import com.cnlive.libs.video.video.base.IDataSource; | |
| 13 | -import com.cnlive.libs.video.video.base.IMediaPlayer; | |
| 14 | -import com.cnlive.libs.video.video.base.IVideoStatus; | |
| 15 | - | |
| 16 | -/** | |
| 17 | - * Created by gujun on 2017/3/1. | |
| 18 | - */ | |
| 19 | - | |
| 20 | -public class VideoStatusActivity extends Activity implements View.OnClickListener { | |
| 21 | - private VideoView videoView; | |
| 22 | - | |
| 23 | - private Button playBtn; | |
| 24 | - private View statusView; | |
| 25 | - private TextView statusViewText; | |
| 26 | - private Button statusRetry; | |
| 27 | - | |
| 28 | - //记录当前视频播放状态 | |
| 29 | - private boolean isPlay = false; | |
| 30 | - //记录当前视频是否能播 | |
| 31 | - private boolean canPlay = true; | |
| 32 | - | |
| 33 | - @Override | |
| 34 | - protected void onCreate(Bundle savedInstanceState) { | |
| 35 | - super.onCreate(savedInstanceState); | |
| 36 | - setContentView(R.layout.activity_videoview_status); | |
| 37 | - | |
| 38 | - initView(); | |
| 39 | - } | |
| 40 | - | |
| 41 | - private IMediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new IMediaPlayer.OnBufferingUpdateListener() { | |
| 42 | - | |
| 43 | - @Override | |
| 44 | - public void onBufferingUpdate(IMediaPlayer iMediaPlayer, int percent) { | |
| 45 | - } | |
| 46 | - }; | |
| 47 | - | |
| 48 | - private IMediaPlayer.OnPreparedListener mOnPrepareListener = new IMediaPlayer.OnPreparedListener() { | |
| 49 | - @Override | |
| 50 | - public void onPrepared(IMediaPlayer iMediaPlayer) { | |
| 51 | - if (canPlay) { | |
| 52 | - setPlayState(true); | |
| 53 | - isPlay = true; | |
| 54 | - } else { | |
| 55 | - setPlayState(false); | |
| 56 | - isPlay = false; | |
| 57 | - } | |
| 58 | - | |
| 59 | - } | |
| 60 | - }; | |
| 61 | - | |
| 62 | - private IMediaPlayer.OnCompletionListener mOnCompletionListener = new IMediaPlayer.OnCompletionListener() { | |
| 63 | - @Override | |
| 64 | - public void onCompletion(IMediaPlayer iMediaPlayer) { | |
| 65 | - isPlay = false; | |
| 66 | - if (playBtn != null) playBtn.setText("开始"); | |
| 67 | - } | |
| 68 | - }; | |
| 69 | - | |
| 70 | - private IMediaPlayer.OnInfoListener mOnInfoListener = new IMediaPlayer.OnInfoListener() { | |
| 71 | - @Override | |
| 72 | - public boolean onInfo(IMediaPlayer iMediaPlayer, int what, int extra) { | |
| 73 | - | |
| 74 | - return false; | |
| 75 | - } | |
| 76 | - }; | |
| 77 | - | |
| 78 | - private IMediaPlayer.OnErrorListener mOnErrorListener = new IMediaPlayer.OnErrorListener() { | |
| 79 | - @Override | |
| 80 | - public boolean onError(IMediaPlayer mp, int what, int extra) { | |
| 81 | - | |
| 82 | - return false; | |
| 83 | - } | |
| 84 | - }; | |
| 85 | - | |
| 86 | - private IMediaPlayer.OnSeekCompleteListener mOnSeekCompleteListener = new IMediaPlayer.OnSeekCompleteListener() { | |
| 87 | - @Override | |
| 88 | - public void onSeekComplete(IMediaPlayer iMediaPlayer) { | |
| 89 | - | |
| 90 | - } | |
| 91 | - }; | |
| 92 | - | |
| 93 | - private IMediaPlayer.OnVideoSizeChangedListener mOnVideoSizeChangedListener = new IMediaPlayer.OnVideoSizeChangedListener() { | |
| 94 | - @Override | |
| 95 | - public void onVideoSizeChanged(IMediaPlayer mp, int width, int height, int sarNum, int sarDen) { | |
| 96 | - | |
| 97 | - } | |
| 98 | - }; | |
| 99 | - | |
| 100 | - private IMediaPlayer.OnPlayStateListener mOnPlayStateListener = new IMediaPlayer.OnPlayStateListener() { | |
| 101 | - @Override | |
| 102 | - public void onPlayState(boolean isPlay) { | |
| 103 | - if (isPlay) playBtn.setText("暂停"); | |
| 104 | - else playBtn.setText("开始"); | |
| 105 | - } | |
| 106 | - }; | |
| 107 | - | |
| 108 | - private IVideoStatus.VideoStatusCallback mOnVideoStatusCallback = new IVideoStatus.VideoStatusCallback() { | |
| 109 | - @Override | |
| 110 | - public void onSuccess(int status) { | |
| 111 | - switch (status) { | |
| 112 | - case IVideoStatus.MEDIA_STATUS_LIVING: | |
| 113 | - //直播中' | |
| 114 | - canPlay = true; | |
| 115 | - if (videoView != null) | |
| 116 | - videoView.reload(); | |
| 117 | - setStatusViewVisible(false, "", false); | |
| 118 | - Toast.makeText(VideoStatusActivity.this, "直播中", Toast.LENGTH_LONG).show(); | |
| 119 | - break; | |
| 120 | - case IVideoStatus.MEDIA_STATUS_LEAVE: | |
| 121 | - //主播暂时离开 | |
| 122 | - canPlay = false; | |
| 123 | - if (videoView != null) | |
| 124 | - videoView.stop(); | |
| 125 | - setStatusViewVisible(true, "主播暂时离开", false); | |
| 126 | - Toast.makeText(VideoStatusActivity.this, "主播暂时离开", Toast.LENGTH_LONG).show(); | |
| 127 | - break; | |
| 128 | - case IVideoStatus.MEDIA_STATUS_END: | |
| 129 | - //直播结束 | |
| 130 | - canPlay = false; | |
| 131 | - if (videoView != null) | |
| 132 | - videoView.stop(); | |
| 133 | - setStatusViewVisible(true, "直播已经结束", false); | |
| 134 | - Toast.makeText(VideoStatusActivity.this, "直播结束", Toast.LENGTH_LONG).show(); | |
| 135 | - break; | |
| 136 | - } | |
| 137 | - | |
| 138 | - } | |
| 139 | - | |
| 140 | - @Override | |
| 141 | - public void onError() { | |
| 142 | - //需求1.连接直播状态异常时,用户可以重连 | |
| 143 | - // 此时停止播放器 | |
| 144 | - canPlay = false; | |
| 145 | - if (videoView != null) | |
| 146 | - videoView.stop(); | |
| 147 | - setStatusViewVisible(true, "获取直播状态异常,请点击重试", true); | |
| 148 | - Toast.makeText(VideoStatusActivity.this, "获取直播状态异常", Toast.LENGTH_LONG).show(); | |
| 149 | - //此时展示错误提示页,添加重试功能 重试按钮点击时可调用 | |
| 150 | - //VideoStatusUtil.retryObtainVideoStatus() | |
| 151 | - | |
| 152 | - //需求2.连接直播状态异常时,用户不操作重连,交给播放器自己处理能否播放 | |
| 153 | - //如果不能播放会执行播放器的OnErrorListener | |
| 154 | - } | |
| 155 | - }; | |
| 156 | - | |
| 157 | - private void setStatusViewVisible(boolean show, String warnText, boolean showRetry) { | |
| 158 | - statusView.setVisibility(show ? View.VISIBLE : View.GONE); | |
| 159 | - statusRetry.setVisibility(showRetry ? View.VISIBLE : View.GONE); | |
| 160 | - statusViewText.setText(warnText); | |
| 161 | - } | |
| 162 | - | |
| 163 | - @Override | |
| 164 | - protected void onPause() { | |
| 165 | - super.onPause(); | |
| 166 | - if (videoView != null && videoView.isPlaying()) { | |
| 167 | - setPlayState(false); | |
| 168 | - } | |
| 169 | - } | |
| 170 | - | |
| 171 | - @Override | |
| 172 | - protected void onResume() { | |
| 173 | - super.onResume(); | |
| 174 | - if (videoView != null && !videoView.isPlaying() && isPlay) { | |
| 175 | - setPlayState(true); | |
| 176 | - } | |
| 177 | - } | |
| 178 | - | |
| 179 | - @Override | |
| 180 | - protected void onDestroy() { | |
| 181 | - super.onDestroy(); | |
| 182 | - videoView.release(); | |
| 183 | - VideoStatusUtil.quit(); | |
| 184 | - } | |
| 185 | - | |
| 186 | - private void initView() { | |
| 187 | - playBtn = (Button) findViewById(R.id.playerPlayPause); | |
| 188 | - playBtn.setOnClickListener(this); | |
| 189 | - | |
| 190 | - statusView = findViewById(R.id.statusView); | |
| 191 | - statusViewText = (TextView) findViewById(R.id.statusViewText); | |
| 192 | - statusRetry = (Button) findViewById(R.id.retry); | |
| 193 | - statusRetry.setOnClickListener(this); | |
| 194 | - | |
| 195 | - videoView = (VideoView) findViewById(R.id.videoview); | |
| 196 | - videoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener); | |
| 197 | - videoView.setOnCompletionListener(mOnCompletionListener); | |
| 198 | - videoView.setOnPreparedListener(mOnPrepareListener); | |
| 199 | - videoView.setOnInfoListener(mOnInfoListener); | |
| 200 | - videoView.setOnErrorListener(mOnErrorListener); | |
| 201 | - videoView.setOnSeekCompleteListener(mOnSeekCompleteListener); | |
| 202 | - videoView.setOnVideoSizeChangedListener(mOnVideoSizeChangedListener); | |
| 203 | - videoView.setOnPlayStateListener(mOnPlayStateListener); | |
| 204 | - VideoStatusUtil.setOnVideoPlayStatusCallback(mOnVideoStatusCallback); | |
| 205 | - | |
| 206 | - videoView.setVideoScalingMode(IMediaPlayer.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING); | |
| 207 | - videoView.setKeepScreenOn(true); | |
| 208 | - | |
| 209 | - startPlay(); | |
| 210 | - } | |
| 211 | - | |
| 212 | - private void setPlayState(boolean isPlay) { | |
| 213 | - if (isPlay) videoView.start(); | |
| 214 | - else videoView.pause(); | |
| 215 | - } | |
| 216 | - | |
| 217 | - private void startPlay() { | |
| 218 | - VideoStatusUtil.init("androidtest"); | |
| 219 | - videoView.setDataSource(new IDataSource() { | |
| 220 | - @Override | |
| 221 | - public String getDataSourceId() { | |
| 222 | - return "androidtest"; | |
| 223 | - } | |
| 224 | - | |
| 225 | - @Override | |
| 226 | - public String getDataSourceType() { | |
| 227 | - return "live"; | |
| 228 | - } | |
| 229 | - | |
| 230 | - @Override | |
| 231 | - public String getDataSourceRate() { | |
| 232 | - return "2"; | |
| 233 | - } | |
| 234 | - }); | |
| 235 | - } | |
| 236 | - | |
| 237 | - @Override | |
| 238 | - public void onClick(View v) { | |
| 239 | - switch (v.getId()) { | |
| 240 | - case R.id.playerPlayPause: | |
| 241 | - if (videoView != null) { | |
| 242 | - isPlay = !isPlay; | |
| 243 | - setPlayState(isPlay); | |
| 244 | - } | |
| 245 | - break; | |
| 246 | - case R.id.retry: | |
| 247 | - VideoStatusUtil.retryObtainVideoStatus(); | |
| 248 | - break; | |
| 249 | - } | |
| 250 | - } | |
| 251 | -} |