Android - MediaPlayer 未在 Android 9 设备上播放 SHOUTcast 流 URL

Android - MediaPlayer not playing SHOUTcast stream URL on Android 9 device

奇怪的问题,我有一个 Android 6.0 Huawei 和一个 9.0 Samsung 设备,我正在对它们进行以下测试:

String streamURL = radioObj.getString(RADIOSTATIONS_STREAM_URL) + "/stream"; 
        Log.i(TAG, "STREAM URL: " + streamURL);
        // prints: http://109.123.70.138:8136/stream

        // Play selected station
        if (mediaPlayer != null && mediaPlayer.isPlaying()) {
            mediaPlayer.pause();
            playPauseButton.setBackgroundResource(R.drawable.play_icon);
        }

        mediaPlayer = new MediaPlayer();

        try {
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDataSource(streamURL);
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
            }});

        } catch (IOException e) { e.printStackTrace();
            simpleAlert("Thers's something wrong with this stream's URL:" + e.getMessage(), ctx);
        }

我知道 URL 是有效的,因为我正在调用另一个函数来检查 ArtistCurrent Song ,并且通过在 Logcat 中打印该信息可以正常工作,但我的 Android 9 设备 Samsung A40 根本没有音乐。音量全开。
相反,在我的 6.0 设备上,播放音乐!

我也在尝试接收这样的 Logcat 消息:

public void onPrepared(MediaPlayer mp) {
    Log.i(TAG, "MEDIA PLAYER: " + mp.getDuration());
    mediaPlayer.start();
}});

但是什么也没有打印出来,就像我的代码忽略了 onPreparedListener 调用一样。

我还尝试将我的 mediaPlayer 分配给 mp,如下所示:

@Override
public void onPrepared(MediaPlayer mp) {
    Log.i(TAG, "MEDIA PLAYER: " + mp.getDuration());
    mediaPlayer = mp;
    mp.start();

}});

同样,完全没有成功。
我做错了什么?

解决方案

我在 res/xml 文件夹中创建了一个 network_security_config.xml 文件,并将此代码放入其中:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

然后我更新了我的 Manifest.xml:

<application
        ...
        android:networkSecurityConfig="@xml/network_security_config"
        android:usesCleartextTraffic="true"
        tools:targetApi="n">

最后,我更新了我的 Java 代码:

// Initialize mediaPlayer
mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes( new AudioAttributes.Builder()
              .setUsage(AudioAttributes.USAGE_MEDIA)
              .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
              .build());

try {
            mediaPlayer.setDataSource(ctx, Uri.parse(streamURL));
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                public void onPrepared(MediaPlayer mp) {
                    mediaPlayer.start();
            }});
        } catch (IllegalArgumentException e) { e.printStackTrace();
            simpleAlert(e.getMessage(), ctx);
        } catch (IllegalStateException e) { e.printStackTrace();
            simpleAlert(e.getMessage(), ctx);
        } catch (IOException e) { e.printStackTrace();
            simpleAlert(e.getMessage(), ctx);
        }