Android - 如何从用户选择的歌曲创建MediaPlayer

时间:2015-07-27 09:33:25

标签: android android-intent android-studio android-mediaplayer filechooser

这是从音乐应用程序打开选择器的意图

public void launchMusicPlayer(View view) {
        Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i,1);
    }

及以下是尝试获取歌曲的 onActivityResult 代码 ,但问题是按下测试按钮时,不会播放任何内容 因为我不熟悉编码我不知道我做错了什么。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK && requestCode == 1) {
        final MediaPlayer testSong = new MediaPlayer();
        Uri songUri = data.getData();

            try {
                testSong.setDataSource(this, songUri);
            } catch (IOException e) {
                e.printStackTrace();
            }
        testSong.prepareAsync();

        test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                testSong.start();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

问题可能是因为prepareAsync()是异步的,因此当您致电start()时,MediaPlayer可能尚未就绪。有两种方法可以解决这个问题:

  1. 使用prepare()代替prepareAsync()

    test.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            testSong.prepare(); 
            testSong.start();
        }
    });
    
  2. start()

    中调用setOnPreparedListener()方法
    test.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            testSong.prepareAsync(); 
            testSong.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    
                @Override
                public void onPrepared(MediaPlayer player) {
                    player.start();
                }
            }
    });
    
  3. 请参阅此处的文档http://developer.android.com/reference/android/media/MediaPlayer.html