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());
      }