Существует сервис, в котором создается объект Media Player для воспроизведения звука с сервера:
class AudioService : Service() {
private lateinit var mediaPlayer: MediaPlayer
private val CHANNEL_ID = "AudioService"
private val audioBinder = AudioBinder()
fun initialiseAudio(urlFromAPI: String) {
mediaPlayer = MediaPlayer()
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
try {
mediaPlayer.setDataSource(urlFromAPI)
mediaPlayer.prepare()
mediaPlayer.start()
} catch (e: IOException) {
e.printStackTrace()
}
}
fun playAudio() {
if (!mediaPlayer.isPlaying)
mediaPlayer.start()
}
fun pauseAudio() {
if (mediaPlayer.isPlaying)
mediaPlayer.pause()
}
fun getMP(): MediaPlayer {
return mediaPlayer
}
fun getMPDuration(): Int {
return mediaPlayer.duration
}
fun getMPPosition(): Int {
return mediaPlayer.currentPosition
}
override fun onDestroy() {
mediaPlayer.reset()
super.onDestroy()
}
override fun onBind(intent: Intent?): IBinder {
return audioBinder
}
inner class AudioBinder : Binder() {
fun getService(): AudioService {
return this@AudioService
}
}
}
Сервис подключается во фрагменте с помощью функции связывания.
Мне необходимо создать SeekBar и два TextView с позицией и продолжительностью аудио во фрагменте.
onViewCreated:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
bindToAudioService()
initialiseSeekBar()
binding.skAudioSeekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) audioService!!.getMP().seekTo(progress)
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
if (seekBar.progress > 70) {
ObjectAnimator.ofInt(seekBar, "progress", 100).setDuration(100).start()
} else if (seekBar.progress < 30) {
ObjectAnimator.ofInt(seekBar, "progress", 0).setDuration(100).start()
} else {
ObjectAnimator.ofInt(seekBar, "progress", 50).setDuration(100).start()
}
}
})
}
Метод инициализации SeekBar во фрагменте:
private fun initialiseSeekBar() {
binding.skAudioSeekBar.max = audioService!!.getMPDuration()
val handler = Handler()
handler.postDelayed(object : Runnable {
override fun run() {
try {
binding.skAudioSeekBar.progress = audioService!!.getMPPosition()
handler.postDelayed(this, 1000)
val durationLength: Int = audioService!!.getMPDuration()
val durationText: String =
DateUtils.formatElapsedTime((durationLength / 1000).toLong())
binding.tvAudioDuration.text = durationText
val positionLength: Int = audioService!!.getMPPosition()
val positionText: String =
DateUtils.formatElapsedTime((positionLength / 1000).toLong())
binding.tvAudioPosition.text = positionText
} catch (e: Exception) {
binding.skAudioSeekBar.progress = 0
}
}
}, 0)
}
Проблема в том, что приложение вылетает при запуске службы (FATAL EXCEPTION: main java.lang.NullPointerException). LogCat указывает на первую строку инициализацииSeekBar(). Если этот метод не используется, служба запускается нормально.
UPD Full stacktrace:
FATAL EXCEPTION: main
Process: ru.aspavlov.theoaesthetics, PID: 6553
java.lang.NullPointerException
at ru.aspavlov.theoaesthetics.ui.AudioFragment.initialiseSeekBar(AudioFragment.kt:128)
at ru.aspavlov.theoaesthetics.ui.AudioFragment.onViewCreated(AudioFragment.kt:67)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3128)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1899)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1817)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1760)
at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:547)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7562)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Подробнее здесь: https://stackoverflow.com/questions/786 ... he-service
SeekBar для медиаплеера в сервисе ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как полностью уничтожить медиаплеера на спине, нажимая на деятельность?
Anonymous » » в форуме Android - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-