Android 如果文件在 link 处不可用,媒体播放器不会抛出 IO 异常
Android Mediaplayer doesnt throw IO exception If file not available at the link
我正在使用 URL 启动媒体播放器。 URL 假设 link 到 video/Audio 。但是我已经从该位置删除了 video/audio 文件,因此我希望得到一个 IOException id,但 link 上没有任何可用的东西。
但我没有收到 IO 异常。相反,媒体播放器本身尝试转到 linkl 10 次,最后在 onErrorListner 上抛出错误。
以下是mediaPlayer准备时打印的日志。
注意:- 我的 url 不适用于本地存储文件!!它用于服务器端文件。
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();
Android 如果 prepareAsync() 的 link 错误,Mediaplayer 不会抛出异常。
对于 prepareAsync 尝试使用以下方法捕获错误:
onError(MediaPlayer mp, int what, int extra);
使用 MediaPlayer.setOnErrorListener()。
改为使用mMediaPlayer.prepare();
另一种选择是使用
URLUtil.isValidUrl(url)
立即检查您的 link 是否存在!
当调用 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);
}
如果您使用的是远程媒体资源,我建议您使用其他 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());
}
我正在使用 URL 启动媒体播放器。 URL 假设 link 到 video/Audio 。但是我已经从该位置删除了 video/audio 文件,因此我希望得到一个 IOException id,但 link 上没有任何可用的东西。
但我没有收到 IO 异常。相反,媒体播放器本身尝试转到 linkl 10 次,最后在 onErrorListner 上抛出错误。 以下是mediaPlayer准备时打印的日志。
注意:- 我的 url 不适用于本地存储文件!!它用于服务器端文件。
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();
Android 如果 prepareAsync() 的 link 错误,Mediaplayer 不会抛出异常。
对于 prepareAsync 尝试使用以下方法捕获错误:
onError(MediaPlayer mp, int what, int extra);
使用 MediaPlayer.setOnErrorListener()。
改为使用mMediaPlayer.prepare();
另一种选择是使用
URLUtil.isValidUrl(url)
立即检查您的 link 是否存在!
当调用 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);
}
如果您使用的是远程媒体资源,我建议您使用其他 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());
}