SeekBar для медиаплеера в сервисеAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 SeekBar для медиаплеера в сервисе

Сообщение Anonymous »

Существует сервис, в котором создается объект 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»