Java Android MediaPlayer无法';无法在客户端打开文件
最近我用ButterKnife更新代码,重构后我遇到了视频流的问题。每次调用Java Android MediaPlayer无法';无法在客户端打开文件,java,android,video-streaming,android-mediaplayer,android-videoview,Java,Android,Video Streaming,Android Mediaplayer,Android Videoview,最近我用ButterKnife更新代码,重构后我遇到了视频流的问题。每次调用VideoView.setVisibility()时,都会报告以下错误:图像不可见,但可以听到音频。我确信它和布局无关,因为并没有任何变化,只有下面提供的类 有没有人经历过类似的问题?谢谢你的建议 默认情况下,我想对用户隐藏VideoView,直到按下播放按钮 W/MediaPlayer: Couldn't open file on client side; trying server side: java.io.Fil
VideoView.setVisibility()
时,都会报告以下错误:图像不可见,但可以听到音频。我确信它和布局无关,因为并没有任何变化,只有下面提供的类
有没有人经历过类似的问题?谢谢你的建议
默认情况下,我想对用户隐藏VideoView,直到按下播放按钮
W/MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: http://img.jbzd.pl/2016/06/7c5ed467a0e8ae7d04c80d009851d391.webm
D/MediaPlayer: setDataSource IOException | SecurityException happend :
java.io.FileNotFoundException: No content provider: http://img.jbzd.pl/2016/06/7c5ed467a0e8ae7d04c80d009851d391.webm
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1141)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:991)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:914)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1121)
at android.widget.VideoView.openVideo(VideoView.java:371)
at android.widget.VideoView.access$2100(VideoView.java:71)
at android.widget.VideoView$7.surfaceCreated(VideoView.java:652)
at android.view.SurfaceView.updateWindow(SurfaceView.java:712)
at android.view.SurfaceView.setVisibility(SurfaceView.java:334)
at xxxooo.jbzd.fragments.SinglePostFragment.startPlayback(SinglePostFragment.java:236)
at xxxooo.jbzd.fragments.SinglePostFragment_ViewBinding$3.doClick(SinglePostFragment_ViewBinding.java:56)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
at android.view.View.performClick(View.java:5697)
at android.view.View$PerformClick.run(View.java:22526)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
此代码在重构之前正常工作,但我找不到问题:
public class SinglePostFragment extends CustomFragment implements MediaPlayer.OnCompletionListener {
@BindView(R.id.postImage) ImageView m_postImage;
@BindView(R.id.playbackIcon) ImageView m_playIcon;
@BindView(R.id.singlepost_postVideo) VideoView m_postVideo;
@BindView(R.id.single_postTitle) TextView m_postTitle;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_singlepost, container, false);
ButterKnife.setDebug(true);
ButterKnife.bind(this, view);
m_prevImgBtn.setVisibility(View.INVISIBLE);
MediaController mc = new MediaController(context);
mc.setAnchorView(v);
mc.setMediaPlayer(v);
m_postVideo.setMediaController(mc);
m_postVideo.setKeepScreenOn(true);
m_postVideo.setVideoURI(Uri.EMPTY);
m_postVideo.setOnCompletionListener(this);
m_progressDialog = new ProgressDialog(getContext());
m_progressDialog.setIndeterminate(true);
m_progressDialog.setCancelable(true);
m_progressDialog.setMessage(getResources().getString(R.string.progress_dialog_message));
m_progressDialog.setTitle(getResources().getString(R.string.progress_dialog_loading_image));
m_currentPost = m_postsHandler.getPostsList(MainActivity.Category.RandomPosts).get(0);
updateView();
return view;
}
private void updateView() {
m_postTitle.setText(m_currentPost.getPostTitle());
m_postVideo.setVisibility(View.INVISIBLE);
m_postImage.setVisibility(View.VISIBLE);
switch (m_currentPost.getPostKind()) {
case IMAGE:
m_playIcon.setVisibility(View.INVISIBLE);
m_postVideo.setVideoURI(Uri.EMPTY);
m_postImage.setAlpha(1.0F);
loadImage(((IImagePost) m_currentPost).getImageLink());
break;
case VIDEO:
m_playIcon.setVisibility(View.VISIBLE);
m_postVideo.setVideoURI(Uri.parse(((IVideoPost) m_currentPost).getVideoLink()));
m_postImage.setAlpha(0.5F);
loadImage(((IVideoPost) m_currentPost).getPosterLink());
break;
}
Log.i("PostKind", m_currentPost.getPostKind().toString());
}
private void loadImage(String imageLink) {
Picasso.with(getContext()).load(imageLink).into(m_postImage, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
m_progressDialog.dismiss();
}
@Override
public void onError() {
//TODO: Show either toast or message dialog to user + rollback to previous post
}
});
}
@SuppressWarnings("unused") // Injected by ButterKnife
@OnClick(R.id.playbackIcon)
public void startPlayback(View v) {
v.setVisibility(View.INVISIBLE);
m_postImage.setVisibility(View.INVISIBLE);
m_postVideo.setVisibility(View.VISIBLE);
m_progressDialog.setTitle(getResources().getString(R.string.progress_dialog_buffering_video));
m_progressDialog.show();
m_postVideo.requestFocus();
m_postVideo.start();
m_postVideo.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
mp.setOnInfoListener(new MediaPlayer.OnInfoListener() {
@Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
if (what == MediaPlayer.MEDIA_INFO_BUFFERING_START)
m_progressDialog.show();
if (what == MediaPlayer.MEDIA_INFO_BUFFERING_END)
m_progressDialog.dismiss();
return false;
}
});
}
});
m_postVideo.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
m_progressDialog.dismiss();
return false;
}
});
}
@Override
public void onCompletion(MediaPlayer mp) {
m_postVideo.setVisibility(View.INVISIBLE);
m_playIcon.setVisibility(View.VISIBLE);
m_postImage.setVisibility(View.VISIBLE);
}
}
我已经弄明白了:问题是VideoView可见性设置为View.INVISIBLE(不使用时不可见)。更改为VIEW.GONE后,所有问题都消失了。