Exoplayer в Android-приложении для потокового аудио | exoplayer воспроизводит несколько аудио с URL-адреса потоковой перAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Exoplayer в Android-приложении для потокового аудио | exoplayer воспроизводит несколько аудио с URL-адреса потоковой пер

Сообщение Anonymous »

Это мой фрагмент кода, размещенный на MainActivity:

Код: Выделить всё

class RadioPlayerFragment : Fragment() {

private lateinit var player: SimpleExoPlayer
private lateinit var mBinding: FragmentRadioPlayerBinding
private var isPlaying: Boolean = false
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
mBinding = FragmentRadioPlayerBinding.inflate(inflater, container, false)
return mBinding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

Log.d(TAG, "onViewCreated \n $isPlaying")
isPlaying = SharedPrefs.getBoolean(requireContext(), "isPlaying")
initializePlayer()
updateUI()
mBinding.btnPlayPause.setOnClickListener {
if (isPlaying) {
Log.d(TAG, "onViewCreated: $isPlaying pausing audio")
pauseRadio()
} else {
Log.d(TAG, "onViewCreated: $isPlaying playing audio")
playRadio()
}
}

requireContext().registerReceiver(
notificationActionReceiver, IntentFilter("ACTION_STOP")
)
}
override fun onStart() {
super.onStart()
Log.d(TAG, "onStart")
if (isPlaying) {
Log.d(TAG, "onStart: isPlaying")
player.playWhenReady = true
updateUI()
updateNotification()
}
}

private fun initializePlayer() {
if (::player.isInitialized &&  isPlaying) {
player.stop()
player.release()
}

player = SimpleExoPlayer.Builder(requireContext())
.setTrackSelector(DefaultTrackSelector(requireContext()))
.setLoadControl(DefaultLoadControl())
.build()

val mediaItem = MediaItem.fromUri(Uri.parse(Constants.k_STREAM_URL))

player.setMediaItem(mediaItem)
player.prepare()
Log.d(TAG, "initializePlayer: $isPlaying")
player.playWhenReady = false
}
private fun playRadio() {
player.playWhenReady = true
isPlaying = true
SharedPrefs.setBoolean(requireContext(), "isPlaying", true)
updateNotification()
updateUI()
}
private fun pauseRadio() {
player.playWhenReady = false
isPlaying = false
Log.d(TAG, "pauseRadio: $isPlaying")
SharedPrefs.setBoolean(requireContext(), "isPlaying", false)
updateNotification()
updateUI()
}
private fun updateUI() {
if (isPlaying) {
mBinding.gif.setImageResource(R.drawable.vuplay)
mBinding.btnPlayPause.setImageResource(R.drawable.stopbutton)
} else {
mBinding.gif.setImageResource(R.drawable.vustop)
mBinding.btnPlayPause.setImageResource(R.drawable.playbutton)
}
}
private fun updateNotification() {
createNotificationChannel()

val stopIntent = Intent(requireContext(), NotificationActionReceiver::class.java).apply {
action = "ACTION_STOP"
}
val stopPendingIntent: PendingIntent = PendingIntent.getBroadcast(requireContext(), 0, stopIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

val notification = NotificationCompat.Builder(requireContext(), "radio_channel")
.setContentTitle("GUGS FM is playing")
.setContentText("App is running in the background")
.setSmallIcon(R.drawable.logo_2)
.addAction(R.drawable.stopbutton, "Stop", stopPendingIntent)
.build()

if (ActivityCompat.checkSelfPermission(
requireContext(),
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
return
}
NotificationManagerCompat.from(requireContext()).notify(1, notification)
}
private fun createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val name = "Radio Channel"
val descriptionText = "Channel for radio notifications"
val importance = NotificationManager.IMPORTANCE_LOW
val channel = NotificationChannel("radio_channel", name, importance).apply {
description = descriptionText
}
val notificationManager = requireContext().getSystemService(NotificationManager::class.java)
notificationManager.createNotificationChannel(channel)
}
}

private val notificationActionReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == "ACTION_STOP") {
pauseRadio()
}
}
}

companion object{
val TAG = "RadioPlayerFragment"
}
}

Проигрыватель работает нормально, когда я использую его для этого фрагмента. Мое условие таково: когда я воспроизвожу звук и перехожу к другому фрагменту, он должен продолжать воспроизводиться, когда я возвращаюсь обратно, если это так затем показать пользовательский интерфейс воспроизведения, если он был остановлен мной, а затем показать остановленный пользовательский интерфейс.
Но сейчас происходит следующее: когда я перехожу к другому фрагменту и возвращаюсь обратно, он показывает соответствующий пользовательский интерфейс, если он воспроизводится, затем воспроизводится, если пауза, затем пауза, но когда я возвращаюсь из другого фрагмента и пытаюсь остановить звук, он меняет пользовательский интерфейс, меняя кнопку и gif, но звук не останавливается, но в пользовательском интерфейсе он остановился на интерфейсе , теперь, если пользователь снова нажмет кнопку для воспроизведения, он начнет потоковую передачу другого аудио одновременно: 2 аудио последовательно: старый звук, который не останавливался, и новый сейчас.
Это происходит только после навигации. фрагмента и возвращаемся обратно, в противном случае запуск и остановка работают нормально.

Подробнее здесь: https://stackoverflow.com/questions/787 ... audios-fro
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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