I have an app that streams music for the user, this code works fine ok on devices running Android up to API 25, when i test in a device running API 26 or greater the Music wont play and wont show an error message either, attached is my log when using API 28 device.
What i have tried:
Search in the docs and examples, but all look the same i see no difference in my code
private void playMusic() {
try {
mMediaPlayer.reset();
// For Android API 26 (Android 8 Oreo) and newer, specify AudioAttributes.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
Log.d("Record", "setAudioAttributes()");
AudioAttributes.Builder builder = new AudioAttributes.Builder();
builder.setUsage(AudioAttributes.USAGE_MEDIA);
builder.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC);
AudioAttributes attributes = builder.build();
mMediaPlayer.setAudioAttributes(attributes);
} else {
Log.d("Record", "setAudioStreamType()");
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
mMediaPlayer.setDataSource(String.format("http://www.server.com/mp3/%s.mp3", mp3File));
mMediaPlayer.prepareAsync();
mMediaPlayer.start();
} catch (IOException e) {
Log.d("Record", "error playing mp3");
e.printStackTrace();
}
}
Log
2019-04-04 17:51:38.911 2947-24864/com.roneskinder.karaoke
V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
2019-04-04 17:51:38.911 2947-24864/com.roneskinder.karaoke V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
2019-04-04 17:51:38.913 2947-3054/com.roneskinder.karaoke D/EGL_emulation: eglMakeCurrent: 0xe830ce20: ver 3 0 (tinfo 0xe8315bd0)
2019-04-04 17:51:38.915 2947-24864/com.roneskinder.karaoke V/MediaHTTPService: MediaHTTPService(android.media.MediaHTTPService@aa03fa3): Cookies: null
2019-04-04 17:51:38.920 2947-4147/com.roneskinder.karaoke V/MediaHTTPService: makeHTTPConnection: CookieHandler (java.net.CookieManager@ead45b3) exists.
2019-04-04 17:51:38.920 2947-4147/com.roneskinder.karaoke V/MediaHTTPService: makeHTTPConnection(android.media.MediaHTTPService@aa03fa3): cookieHandler: java.net.CookieManager@ead45b3 Cookies: null
To play audio or video files in Android, the Android multimedia framework includes the support of MediaPlayer APIs. So, by using MediaPlayer APIs, you can play audio/video files from your Android filesystem or play files from your Application's resource file or even you can stream audio/video files just like Spotify.
MediaPlayer class can be used to control playback of audio/video files and streams.
You need to define a res/xml/network_security_config.xml
and permit HTTP
for that host:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">server.com</domain>
</domain-config>
</network-security-config>
That network_security_config.xml
also needs to be referenced in the Manifest.xml
:
<?xml version="1.0" encoding="utf-8"?>
<manifest
...>
<application
android:networkSecurityConfig="@xml/network_security_config"
...>
...
</application>
</manifest>
The SDK documentation explains it all in detail - and this applies to all network traffic an app creates.
Instead of lowering the security standards, upgrading the connection to HTTPS
should be preferred.
And concerning that one deprecated method .setAudioStreamType()
, use .setAudioAttributes() instead - as your code already does. It does not seem to be the "main problem" here; verified that.
application
Tag<application
.......
android:usesCleartextTraffic="true"
.......>
.......
</application>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With