如果链接中的文件不可用,Android Mediaplayer不会引发IO异常

如果链接中的文件不可用,Android Mediaplayer不会引发IO异常,android,android-mediaplayer,Android,Android Mediaplayer,我正在用URL启动mediaplayer。假定链接到视频/音频的URL。但是我已经从该位置删除了视频/音频文件,因此我希望得到一个IOException id,因为该链接没有可用的内容 但是我没有得到IO异常。相反,mediaplayer本身尝试去链接10次,最后在OneErrorListner上抛出错误。 以下是mediaPlayer准备时打印的日志 注意:-我的url不适用于本地存储文件!!它用于服务器端文件 我不想等待太久,以至于mediaplayer尝试重新连接同一URL 10次。我希望

我正在用URL启动mediaplayer。假定链接到视频/音频的URL。但是我已经从该位置删除了视频/音频文件,因此我希望得到一个IOException id,因为该链接没有可用的内容

但是我没有得到IO异常。相反,mediaplayer本身尝试去链接10次,最后在OneErrorListner上抛出错误。 以下是mediaPlayer准备时打印的日志

注意:-我的url不适用于本地存储文件!!它用于服务器端文件

我不想等待太久,以至于mediaplayer尝试重新连接同一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();

如果prepareAsync的链接错误,Android Mediaplayer不会抛出异常。 对于prepareAsync,请尝试使用以下方法捕获错误:

onError(MediaPlayer mp, int what, int extra);
使用MediaPlayer.SetOneErrorListener

相反,使用mmediplayer.prepare

另一种选择是使用

URLUtil.isValidUrl(url)

立即检查您的链接是否存在

调用setDataSourceString路径且文件不存在时引发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实现,如

Android默认播放器的重试次数为10次。HTTP 404响应上没有错误处理

struct NuCachedSource2 : public DataSource {

...
enum {
    kMaxNumRetries = 10,
};
google/ExoPlayer2有2个。但是如果你愿意,你可以改变


我正在用onError收听,但问题是至少需要30秒的时间才能回复。当我看到日志时,我发现mediaplayer内部收到404错误,但尝试了10次重新连接,最后抛出错误。尝试10次重新连接需要30秒以上。看看上面我的问题。我写了一些日志,在那里你可以看到mediaplayer尝试了10次,而报告errormMediaPlayer.prepare根本不能解决问题。isValidUrlurl只是查看url是否为valis。这里我关心的是URL是有效的。但是我们已经从服务器上删除了与此url对应的内容。现在我想尽快得到IOException。默认情况下,在检查了10次之后需要30-40秒,就像我在文章中提到的那样question@user2228673如果您不想等待,URLUtil.isvalidurll是您最好的选择。MediaPlayer API有很多限制。您可以尝试使用NDK构建自己的播放器。但这需要时间和大量的工作,我不明白URLUtil.isvalidurll如何解决我的问题。如果你看看Isvalidul。它只是检查它是否是http或ot,文件是否为orl等等。它不会转到服务器并检查该url上的内容是否可用。在我的例子中,url是有效的url,唯一的问题是服务器上这个url没有可用的内容。在我的应用程序中,我必须处理这种情况,因此我已从该url中删除了内容,以便在服务器上没有内容时可以在mediaplayer上捕获IOException。我的url不适用于本地文件。我的服务器上有文件,因此我使用mmediplayer.setDataSourcegetContext,uri;正如您从我的代码中看到的,我没有得到异常。相反,无论我得到什么日志,我已经粘贴了。它在OneRorListnerhi上检查10次,然后返回错误。我们不打算使用任何第三方库,而且我们只是制作一个基本的音频/视频播放器,这只是项目的一小部分。因此我想寻求你的帮助!!我只是在使用Android Mediaplayer API。如何将此kMaxNumRetries从10更改为1或2。我必须使用NDK吗?如果您使用HTTP协议访问远程媒体资源,请使用简单的HTTP客户端,同时检查响应代码。我认为在Android媒体框架中很难更改默认重试次数。
struct NuCachedSource2 : public DataSource {

...
enum {
    kMaxNumRetries = 10,
};
      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());
      }