Воспроизведение http-аудиопотока с сервера от icecast
Есть сервер на icecast2, с которого идет трансляция радио. Поток в формате http, ссылка на него. Есть так же расширение для chrome и андроид-версия, основанная на android-icecast-broadcast. Вот как раз андроид-версию я и хочу переделать. Хоть и воспроизведение работает безупречно, но сама программа получается чересчур большой.
Вот мой код, прога запускается без крашей, но воспроизведение не идет ни на апи 14-15, ни на 21-22, ни на 24
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val mp = MediaPlayer()
try {
mp.setDataSource("http://62.109.9.171:8000/autodj")
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
mp.setAudioAttributes(
AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build())
} else {
mp.setAudioStreamType(AudioManager.STREAM_MUSIC)
}
mp.setOnPreparedListener { mp.start() }
mp.prepareAsync()
} catch (e: IOException) {
e.printStackTrace();
}
mp.isLooping = true;
mp.start()
// println(mp.trackInfo)
}
}
Манифест:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ru.ursna.radio">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Radio">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Ответы (1 шт):
В итоге все таки решил все через ExoPlayer. Добавил зависимость:
implementation 'com.google.android.exoplayer:exoplayer-core:2.12.2'
Инициализировал все нужное:
val context = this
var isPaused = true
val playButton: ImageButton = findViewById(R.id.playButton)
val player = SimpleExoPlayer.Builder(context).build()
player.setMediaItem(MediaItem.fromUri(Uri.parse("http://62.109.9.171:8000/autodj")))
player.prepare()
Назначил слушателя на кнопку play/pause:
playButton.setOnClickListener {
if (isPaused) {
player.play()
isPaused = false
} else if (!isPaused) {
player.pause()
isPaused = true
}
updateButton(isPaused, theme, playButton)
}
Ну и методы theme()(Запускать перед super.onCreate(savedInstanceState)) и updateButton() если кому-то надо(у меня есть 2 иконки play и 2 иконки pause черного и белого цвета):
fun theme() {
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val theme = prefs.getBoolean("theme_key", true)
if (theme) {
setTheme(R.style.Theme_MaterialComponents_NoActionBar)
} else {
setTheme(R.style.Theme_MaterialComponents_Light_NoActionBar)
}
}
Проверка на белую тему уже после super.onCreate(savedInstanceState):
if (!theme) {
playButton.background = getDrawable(R.drawable.ic_play_dark)
}
Ну и метод для смены иконки play/pause на кнопке
fun updateButton(isPaused: Boolean, theme: Boolean, playButton: ImageButton) {
if(!isPaused) {
if (theme) {
playButton.background = getDrawable(R.drawable.ic_pause)
} else {
playButton.background = getDrawable(R.drawable.ic_pause_dark)
}
}
if(isPaused) {
if (theme) {
playButton.background = getDrawable(R.drawable.ic_play)
} else {
playButton.background = getDrawable(R.drawable.ic_play_dark)
}
}
}