如何从云存储服务播放流音乐文件?

时间:2019-06-06 18:06:27

标签: android android-mediaplayer

我想播放一个音乐文件,该文件将从云存储服务(例如Google驱动器或Mega.nz)中检索。我共享了文件,因此知道链接的任何人都可以访问它。

我正在使用MediaPlayer类来处理此播放。因此,当我尝试直接链接something like this时,效果很好。但是,当我尝试使用Google云端硬盘such as this中的链接时,该链接不起作用。

这是我用来播放音乐文件的一些代码:

MusicPlayerFragment类

public class MusicPlayerFragment extends Fragment {
            private MusicPlayer musicPlayer;
            boolean isPlaying;

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                // Inflate the layout for this fragment
                View layout = inflater.inflate(R.layout.fragment_music_player, container, false);

                final ImageButton buttonPlayPause = layout.findViewById(R.id.button_play_pause);
                buttonPlayPause.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (!isPlaying) {
                            musicPlayer.play();
                            buttonPlayPause.setImageResource(R.drawable.baseline_pause_24);
                            isPlaying = true;
                        }
                        else {
                            musicPlayer.pause();
                            buttonPlayPause.setImageResource(R.drawable.baseline_play_arrow_24);
                            isPlaying = false;
                        }
                    }
                });
                return layout;
            }
            @Override
            public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            musicPlayer = new MusicPlayer();
            musicPlayer.loadMedia("http://ssaurel.com/tmp/mymusic.mp3"); //work on physical device
         //musicPlayer.loadMedia("https://drive.google.com/file/d/1Tj0a5f4dUMNnlPILr3vZzpPOwHKsP3Va/view?usp=sharing"); //doesn't work at all
            }
}

MusicPlayer类

public class MusicPlayer{
    private MediaPlayer mediaPlayer;

    public void loadMedia(String url) {
        if (mediaPlayer == null) {
            mediaPlayer = new MediaPlayer();
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
            try {
                mediaPlayer.setDataSource(url);
                mediaPlayer.prepareAsync();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void play() {
        if (mediaPlayer != null && !mediaPlayer.isPlaying()) {
            mediaPlayer.start();
        }
    }

    public void pause() {
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
        }
    }

    public void reset() {
        if (mediaPlayer != null) {
            mediaPlayer.reset();
        }
    }

    public void release() {
        if (mediaPlayer != null) {
            mediaPlayer.release();
        }
    }
}

我也在使用SQL Server,它将存储音乐数据和该音乐文件的URL进行播放。但是由于它不起作用,所以我想知道两件事:

  • 第一:我在哪里错了?我认为我怀疑没有以正确的方式使用setDataSource(url)方法。
  • 第二个:Google云端硬盘的网址使用的格式正确吗?如果它不是与任何(重载)setDataSource()方法一起使用的正确格式,那么如何存储具有所需URL格式的音乐文件? (正确的格式,我认为:“ http://domain/path/audiofilename.mp3”)。我正在访问本地计算机上的数据库。

1 个答案:

答案 0 :(得分:0)

您将答案隐藏在问题本身中。当您将直接下载链接传递到音乐时,它可以正常工作,这意味着您需要使用能够直接下载文件的工具。

当您提供Google云端硬盘链接时,并没有提供文件的完整地址,而是转到了告诉您手动下载文件的页面。

您应该使用FirebaseStorage之类的歌曲来存储歌曲,这样就可以直接获得这些歌曲的下载链接。