我正在使用网址启动媒体播放器。 URL假定链接到视频/音频。但我已经删除了该位置的视频/音频文件,因此我希望IOException id在该链接上没有任何可用的内容。
但我没有得到IO异常。相反,mediaplayer本身会尝试转到linkl 10次,最后将错误抛给onErrorListner。 follwings是mediaPlayer准备时打印的日志。
注意: - 我的网址不适用于本地存储文件!!它用于服务器端文件。
E/NuCachedSource2: source returned error -1, 10 retries left
E/NuCachedSource2: source returned error -1, 9 retries left
E/NuCachedSource2: source returned error -1, 8 retries left
E/NuCachedSource2: source returned error -1, 7 retries left
E/NuCachedSource2: source returned error -1, 6 retries left
E/NuCachedSource2: source returned error -1, 5 retries left
E/NuCachedSource2: source returned error -1, 4 retries left
E/NuCachedSource2: source returned error -1, 3 retries left
E/NuCachedSource2: source returned error -1, 2 retries left
E/NuCachedSource2: source returned error -1, 1 retries left
E/NuCachedSource2: source returned error -1, 0 retries left
E/GenericSource: Failed to init from data source!
我不想等待媒体播放器尝试重新连接相同的URL 10次。我第一次想立即发生IOException或错误。
以下是我的代码。请帮助!!
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(getContext(), Uri.parse(url));
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(false);
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
OnErrorReceive("Something is wrong with media player states");
return false;
}
});
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
enter code here
strong text mMediaPlayer.start();
}
});
mMediaPlayer.prepareAsync();
答案 0 :(得分:1)
如果您正在播放远程媒体资源,我建议使用其他mediaPlayer实施,例如google/ExoPlayer2。
Android默认播放器的重试次数为10. HTTP 404响应没有错误处理。
struct NuCachedSource2 : public DataSource {
...
enum {
kMaxNumRetries = 10,
};
google / ExoPlayer2有2.但如果你愿意,你可以改变。 my commit in github
if (retryAction == DONT_RETRY_FATAL) {
fatalError = currentError;
} else if (retryAction != DONT_RETRY) { // DONT_RETRY = 2
errorCount = retryAction == RETRY_RESET_ERROR_COUNT ? 1 : errorCount + 1;
start(getRetryDelayMillis());
}
答案 1 :(得分:0)
如果prepareAsync()链接错误,Android Mediaplayer不会抛出异常。
对于prepareAsync,请尝试使用以下方法捕获错误:
\0
使用MediaPlayer.setOnErrorListener()。
而是使用onError(MediaPlayer mp, int what, int extra);
另一种选择是使用
mMediaPlayer.prepare();
如果您的链接存在,请立即检查!
答案 2 :(得分:0)
调用setDataSource(String path)并且文件不存在时抛出IOException。
Uri uri = Uri.parse(url)
final String scheme = uri.getScheme();
if ("file".equals(scheme)) {
path = uri.getPath();
mMediaPlayer.setDataSource(path); // IOException
} else {
mMediaPlayer.setDataSource(getContext(), uri);
}