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 是有效的,因为我正在调用另一个函数来检查 Artist 和 Current 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);
}
奇怪的问题,我有一个 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 是有效的,因为我正在调用另一个函数来检查 Artist 和 Current 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);
}