所以很多人都以这种或那种形式提出这个问题,但没有人似乎有答案,所提出的答案都没有对我有用,所以我再次提问。
问题在于,从Android 5.1开始,某些视频网址无法播放。日志中唯一的错误是
06-02 23:22:53.940 32469-32469/com.example.myapp W/MediaPlayer: Couldn't open https://<URL...>: java.io.FileNotFoundException: No content provider: https://<URL...>
06-02 23:22:54.081 32469-32499/com.example.myapp D/OpenGLRenderer: endAllActiveAnimators on 0x7d9cc48800 (GridView) with handle 0x7d9c084400
06-02 23:22:54.857 32469-32480/com.example.myapp I/art: Background sticky concurrent mark sweep GC freed 53228(4MB) AllocSpace objects, 1(20KB) LOS objects, 33% free, 9MB/13MB, paused 7.612ms total 44.857ms
06-02 23:22:55.487 32469-3238/com.example.myapp E/MediaPlayer: error (1, -2147483648)
06-02 23:22:55.500 32469-32469/com.example.myapp E/MediaPlayer: Error (1,-2147483648)
06-02 23:22:55.500 32469-32469/com.example.myapp D/VideoView: Error: 1,-2147483648
06-02 23:22:55.503 32469-32469/com.example.myapp D/VideoPlayerActivity: MediaPlayer error: what = 1 extra = -2147483648
06-02 23:22:55.556 32469-32474/com.example.myapp I/art: Do partial code cache collection, code=62KB, data=52KB
06-02 23:22:55.556 32469-32474/com.example.myapp I/art: After code cache collection, code=62KB, data=52KB
06-02 23:22:55.556 32469-32474/com.example.myapp I/art: Increasing code cache capacity to 256KB
现在有些人会告诉您,您想播放的视频在设备上没有支持编解码器。没办法......首先,我仍然可以使用Android 5.0.2在同一设备上播放相同的视频,但不能使用5.1.1。其次,如果我将视频网址加载到5.1.1及更高版本的WebView中,它将会播放。所以它不是编解码器或硬件。我已经尝试了各种各样的URL编码/解码,但这些都没有用。
以下是我使用的代码:
Uri videoUri = Uri.parse(vidAddress);
MediaController mediaController = new MediaController(this);
mediaController.setAnchorView(videoView);
videoView.setMediaController(mediaController);
videoView.setVideoURI(videoUri, headers);
videoView.seekTo(resumePoint);
videoView.setMediaController(null);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(final MediaPlayer mp) {
View loadingIndicator = findViewById(R.id.loading_indicator);
loadingIndicator.setVisibility(View.GONE);
videoProgress.setMax(videoView.getDuration());
videoProgress.setSecondaryProgress(videoView.getDuration());
endTime.setText(getTimeString(videoView.getDuration()));
}
});
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(final MediaPlayer mp) {
finish();
}
});
videoView.start();
更新:由于某些网址确实可以使用上述代码,因此我添加了更多信息。我使用的网址是存储在Google云端硬盘中的MP4视频。使用Google云端硬盘文件响应中的videoUri
字段填充downloadUrl
变量,headers
包含授权标头以及登录帐户的令牌。就像我说的那样,所有这些代码,从上面不加改变,在API 5.0.2及更低版本上都没有问题,而不是在5.1.1上。测试是使用相同硬件的两个设备(两个Nexus 5x和两个Nexus播放器)进行的,只更改操作系统版本。上面的代码适用于5x和运行5.0.2的播放器,但不适用于运行5.1.1。
答案 0 :(得分:0)
在幕后,当您致电setVideoUri()
时,它正在调用MediaPlayer.setDataSource(Context, Uri)`,它只支持内容URI(即不支持http / https网址)。
相反,建议使用功能更全面的ExoPlayer,并完全支持来自网址的流式传输。如果您想维护VideoView类型界面,可以使用包装库,例如ExoMedia
答案 1 :(得分:0)
你试过用过吗?
videoView.start()
后
videoView.setVideoURI()
。我已经尝试使用HTTP URL地址,它可以工作。
或者HTTPs协议可能有问题?
答案 2 :(得分:0)
使用MediaController播放来自Url的视频
VideoView videoview;
MediaController mediacontroller;
try {
mediacontroller = new MediaController(VideoPlayActivity.this);
mediacontroller.setAnchorView(videoview);
Uri video = Uri.parse(VideoURL);
videoview.setMediaController(mediacontroller);
videoview.setVideoURI(video);
} catch (Exception e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}