Существует сервис, в котором создается объект 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
Форум для тех, кто программирует под Android
1719581899
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(). Если этот метод не используется, служба запускается нормально.
[b]UPD[/b] 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)
Подробнее здесь: [url]https://stackoverflow.com/questions/78679878/seekbar-for-the-media-player-in-the-service[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия