Commit ae3c8ee633d112780925c596810206528bc6d062

Authored by 朱显松
1 parent 3f87575c

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

.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   -}