Android 启动videoview时,应用程序有时会崩溃
我正在使用VideoView来播放实时流,它在大多数情况下运行良好,但有时应用程序会冻结片刻,要么继续播放,要么崩溃并将我发送到主屏幕。 这是当我从列表视图中选择一个项目或单击“向下键/向上键”时发生的情况:Android 启动videoview时,应用程序有时会崩溃,android,crash,android-videoview,freeze,Android,Crash,Android Videoview,Freeze,我正在使用VideoView来播放实时流,它在大多数情况下运行良好,但有时应用程序会冻结片刻,要么继续播放,要么崩溃并将我发送到主屏幕。 这是当我从列表视图中选择一个项目或单击“向下键/向上键”时发生的情况: public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { if (mVideoView != null &&
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
if (mVideoView != null && mListView == null) {
if (listViewNext != listViewCurrent) { playChannel(listViewNext, 0); }
return true;
}
}
}
private void playChannel(int channel, int id) {
listViewCurrent = channel;
listViewNext = listViewCurrent + 1;
listViewPrev = listViewCurrent - 1;
if (mListViewChannels == "Danish") {
if (listViewNext >= arrayDanishChannels.size()) { listViewNext = 0; }
if (listViewPrev < 0) { listViewPrev = arrayDanishChannels.size() - 1; }
mListViewLink = arrayDanishLinks.get(listViewCurrent);
} else if (mListViewChannels == "World") {
if (listViewNext >= arrayWorldChannels.size()) { listViewNext = 0; }
if (listViewPrev < 0) { listViewPrev = arrayWorldChannels.size() - 1; }
mListViewLink = arrayWorldLinks.get(listViewCurrent);
}
String listViewName = (String) listView.getItemAtPosition(listViewCurrent);
String[] links = mListViewLink.split(";"); int temp = id + 1;
if (id < 0 || temp > links.length) { id = 0; temp = 1; }
mListViewLink = links[id]; listViewLinkId = temp; listViewLinkIds = links.length;
startVideo(listViewName+" ("+listViewLinkId+"/"+listViewLinkIds+")", mListViewLink);
mListViewCurrent = mListViewChannels;
}
private void startVideo(String title, String link) {
toastDisplay.cancel();
setInfoView(title);
imageView.setVisibility(ImageView.INVISIBLE);
videoView.removeCallbacks(videoRunnable);
videoView.stopPlayback();
MediaController media = new MediaController(MainActivity.this); media.setAnchorView(videoView); media.setMediaPlayer(videoView);
videoView.setMediaController(media);
videoView.setVideoPath(link);
videoView.setOnPreparedListener(videoViewPreparedListener);
videoView.setOnErrorListener(videoViewErrorListener);
videoView.setVisibility(VideoView.VISIBLE);
videoView.postDelayed(videoRunnable, videoViewTimeOut);
videoView.start();
mVideoView = "true";
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
SharedPreferences.Editor edit = pref.edit();
edit.putString("setLastStream", title+";"+mListViewChannels);
edit.apply();
}
private void setInfoView(String title) {
infoView.removeCallbacks(infoRunnable);
infoView.setText(title);
infoView.setVisibility(TextView.VISIBLE);
progressBar.setVisibility(ProgressBar.VISIBLE);
}
public boolean onKeyDown(int-keyCode,KeyEvent事件){
if(keyCode==KeyEvent.keyCode\u DPAD\u DOWN){
if(mVideoView!=null&&mListView==null){
如果(listViewNext!=listViewCurrent){playChannel(listViewNext,0);}
返回true;
}
}
}
专用void播放频道(int频道,int id){
listViewCurrent=通道;
listViewNext=listViewCurrent+1;
listViewPrev=listViewCurrent-1;
如果(MListViewChannel==“丹麦文”){
如果(listViewNext>=ArrayDanishChannel.size()){listViewNext=0;}
如果(listViewPrev<0){listViewPrev=ArrayDanishChannel.size()-1;}
mListViewLink=arrayDanishLinks.get(listViewCurrent);
}else if(MListViewChannel==“世界”){
如果(listViewNext>=arrayWorldChannels.size()){listViewNext=0;}
如果(listViewPrev<0){listViewPrev=arrayWorldChannels.size()-1;}
mListViewLink=arrayWorldLinks.get(listViewCurrent);
}
字符串listViewName=(字符串)listView.getItemAtPosition(listViewCurrent);
字符串[]links=mListViewLink.split(“;”);int-temp=id+1;
如果(id<0 | | temp>links.length){id=0;temp=1;}
mListViewLink=links[id];listViewLinkId=temp;listViewLinkId=links.length;
startVideo(listViewName+”(“+listViewLinkId+”/“+listViewLinkId+”),mListViewLink);
mListViewCurrent=mListViewChannels;
}
私有void startVideo(字符串标题、字符串链接){
toastDisplay.cancel();
setInfoView(标题);
设置可见性(imageView.INVISIBLE);
videoView.removeCallbacks(videoRunnable);
videoView.stopPlayback();
MediaController媒体=新的MediaController(MainActivity.this);media.setAnchorView(videoView);media.setMediaPlayer(videoView);
videoView.setMediaController(媒体);
设置视频路径(链接);
videoView.setOnPreparedListener(videoViewPreparedListener);
videoView.SetOneErrorListener(videoViewErrorListener);
设置可见性(videoView.VISIBLE);
videoView.postDelayed(videoRunnable,videoViewTimeOut);
videoView.start();
mVideoView=“true”;
SharedReferences pref=PreferenceManager.GetDefaultSharedReferences(MainActivity.this);
SharedReferences.Editor edit=pref.edit();
edit.putString(“setLastStream”,title+”;“+mListViewChannels);
edit.apply();
}
私有void setInfoView(字符串标题){
infoView.removeCallbacks(infoRunnable);
infoView.setText(标题);
setVisibility(TextView.VISIBLE);
progressBar.setVisibility(progressBar.VISIBLE);
}
请注意:我已经为这些流支付了费用,有些流是任何人都可以自由访问的,没有非法内容。
我正在使用固件为4.4.2的android机顶盒
我尝试在任何地方添加try{..}最后{..}
,但有时它仍然会在随机时间冻结。
请帮助我,我是一个新的应用程序开发者,这真的让我发疯了。
很抱歉我的英语不好。你能分享记录的崩溃异常吗?我很乐意,但正如我说的,我在这方面还很新,所以我不知道从哪里可以得到它。你能告诉我正确的方向吗?这在很大程度上取决于你的测试系统。如果您使用的是IDE,请查找logcat输出。如果你使用的是实际的设备,你可以安装logcat reader我使用的是实际的设备,我的机顶盒,我已经安装了logcat reader,但它并没有给我任何东西。它需要root吗?我已经输入了,当它随机崩溃时,它仍然没有报告任何错误,但是当我添加
String a=null;a、 toString()代码>它报告了NullPointerException错误,所以我猜它不是任何异常错误?但它还能是什么呢?