【问题标题】:Android Studio : MediaPlayer setDataSource URL not playing musicAndroid Studio:MediaPlayer setDataSource URL 不播放音乐
【发布时间】:2021-07-30 23:12:03
【问题描述】:

打开应用程序没有任何错误。但是不能播放音乐。但可以从本地机器播放音乐。互联网连接良好。

我已在 AndroidManiFest.xml 中启用互联网权限

<uses-permission android:name="android.permission.INTERNET" />

我已启用 http 权限。

android:usesCleartextTraffic="true"

MediaPlayer mediaPlayer = new MediaPlayer();
try {
        mediaPlayer.setDataSource("http://penguinradio.dominican.edu/Sound%20FX%20Collection/Motorbike.mp3");
    } catch (IOException e) {
        e.printStackTrace();
}

mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mP) {
                Toast.makeText(MainActivity.this, "Ready to Play", Toast.LENGTH_SHORT).show();
                mP.start();
            }
        });
mediaPlayer.prepareAsync();

完整代码: https://paste.ubuntu.com/p/dsjbg7YMNn/

【问题讨论】:

    标签: android android-studio


    【解决方案1】:

    我已经测试了您的代码,有时它可以工作,有时它不能。如果你搜索Stack Overflow你会发现很多类似的问题。

    你有两个选择:

    1. 迁移到ExoPlayer2,这远远优于MediaPlayer
    2. OnPreparedListener中播放声音是不行的,但是你可以在准备好后点击按钮播放:
    public class MainActivity extends AppCompatActivity {
    
        private Button streamButton;
        private boolean isPrepared = false;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            MediaPlayer mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource("http://penguinradio.dominican.edu/Sound%20FX%20Collection/Motorbike.mp3");
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            mediaPlayer.setOnPreparedListener(mp -> {
                Toast.makeText(MainActivity.this, "Ready to Play", Toast.LENGTH_SHORT).show();
                isPrepared = true;
                streamButton.setVisibility(View.VISIBLE);
            });
    
            mediaPlayer.setOnCompletionListener(mp -> {
                mp.release();
                isPrepared = false;
                streamButton.setVisibility(View.INVISIBLE);
            });
    
            mediaPlayer.prepareAsync();
    
            streamButton = findViewById(R.id.streamButton);
            streamButton.setOnClickListener(v -> {
                if (isPrepared) {
                    mediaPlayer.start();
                }
            });
    
        }
    }
    

    【讨论】:

    • 我的代码适用于安卓手机,但不适用于 AVD 虚拟设备。您的代码也适用于 android 手机,在我的 AVD 中,您的代码也不会播放声音。可能是什么原因?
    • 我认为如果您想从 URL 流式传输声音,最好使用 ExoPlayer github.com/google/ExoPlayer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2014-04-13
    相关资源
    最近更新 更多