Android Media Player:从文件下载到文件和流

Hin*_*ton 19 audio streaming android download media-player

我正在使用Android MediaPlayer来播放同时从互联网上下载的MP3文件DownloadManager.我知道MediaPlayer直接流的功能,但我不想使用它:

通过下载和同时从文件流式传输获得的明显优势就是这样,文件被存储并且之后可在本地获得.

  • 这原则上起作用 - MediaPlayer即使没有完全下载也会开始播放文件.(顺便说一下,我的问题不在于我无法MediaPlayer上场.)
  • 问题是,当MediaPlayer它开始播放时到达下载状态的位置时,它会停止并调用onCompletion.(澄清:假设我开始玩时,我们假设该文件下载了12%.当玩家以12%的比例到达该位置时,它会停止.)
  • 快速注释:OnBufferingUpdateListener.onBufferingUpdate(...)当MP3文件通过附加内容添加时,不会调用DownloadManager.

所以问题是:如何同时将音频文件下载到文件系统并播放?(Android 4+就足够了,如果这有所不同.)

Ore*_*ren 9

我假设您将MediaPlayer指向该文件.在这种情况下,我不认为它支持流式传输,并且它可能提前检查文件的大小等,因此它不会随着更多文件的进入而自动更新.

您必须将其指向可与流式处理相关的内容源,例如HTTP.我刚刚检查了"ES文件资源管理器"是如何做到的(使用LogCat) - 当您单击远程文件共享中的视频文件时,它会打开一个本地HTTP服务器,并向MediaPlayer发送一个HTTP Uri到其本地服务器,还包括远程路径.

当它通过HTTP获取请求时,本地服务器开始从远程位置读取文件,并通过HTTP将其本地提供给MediaPlayer.您可以这样做,除了通过HTTP提供它还将其保存到磁盘.


Nik*_* G. 5

它帮助了我,我希望能帮助其他人。

播放器下载和播放音乐。

mMediaPlayer.setDataSource(DOWNLOAD_URL);

   File root = Environment.getExternalStorageDirectory();
   File dir = new File(root + "/Folder");
   if (!dir.exists()) {
        dir.mkdirs();

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
            Uri downloadUri = Uri.parse(DOWNLOAD_URL);
            DownloadManager.Request request = new DownloadManager.Request(downloadUri);
            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
            request.setAllowedOverRoaming(false);
            request.setTitle(TITLE);
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, TITLE);
            request.allowScanningByMediaScanner();
Run Code Online (Sandbox Code Playgroud)

下载文件后:

mMediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/Folder/" + TITLE + ".mp3");
Run Code Online (Sandbox Code Playgroud)