Android Mediaplayer不会抛出IO异常如果文件在链接中不可用

时间:2017-03-28 09:24:33

标签: android android-mediaplayer

我正在使用网址启动媒体播放器。 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();

3 个答案:

答案 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);
        }