Commit ae3c8ee633d112780925c596810206528bc6d062

Authored by 朱显松
1 parent 3f87575c

修复VideoView释放后setVideoScalingMode空指针问题

.idea/misc.xml
1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <project version="4"> 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 <component name="ProjectLevelVcsManager" settingsEditedManually="false"> 30 <component name="ProjectLevelVcsManager" settingsEditedManually="false">
4 <OptionsSetting value="true" id="Add" /> 31 <OptionsSetting value="true" id="Add" />
5 <OptionsSetting value="true" id="Remove" /> 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,7 +35,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe
35 startActivity(new Intent(this, SltVideoActivity.class)); 35 startActivity(new Intent(this, SltVideoActivity.class));
36 break; 36 break;
37 case R.id.videoStatus: 37 case R.id.videoStatus:
38 - startActivity(new Intent(this, VideoStatusActivity.class));  
39 break; 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 -}