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

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

这是从音乐应用程序中打开选择器的 Intent

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();
            }
        });
    }
}

最佳答案

这个问题可能是因为 prepareAsync() 是异步的,所以当您调用 start() 时,MediaPlayer 可能还没有准备好。有两种方法可以解决此问题:

  1. 使用 prepare() 而不是 prepareAsync()

    test.setOnClickListener(new View.OnClickListener() {
    
        @Override
        public void onClick(View v) {
            testSong.prepare(); 
            testSong.start();
        }
    });
    
  2. setOnPreparedListener() 中调用 start() 方法

    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();
                }
            }
    });
    

请参阅此处的文档 http://developer.android.com/reference/android/media/MediaPlayer.html

关于Android - 如何从用户选择的歌曲创建 MediaPlayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31649584/

相关文章:

java - 监控 BufferedInputStream 下载进度

android - 从广播接收器发送 Intent 并附加到 Activity (服务问题)

android - 在调试器工具窗口中看不到协程选项卡

java - 为什么我得到 "incompatible types: Object cannot be converted to String"?

android - 升级到最新的Android Gradle Plugin AndoidX后Gradle报错

java - 如何使用 twitter4j 显示来自 Twitter 帐户的推文和来自 Android 应用程序的同一帐户的推文?

android - Firebase 使用政策实现

android - Android 中的应用程序交互

android - 奇怪 - Android IntentService 杀死了我应用程序的其余部分,但继续自行运行

Android Studio : No resource identifier found for attribute 'targetSdkversion' in package 'android'