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 аудио последовательно: старый звук, который не останавливался, и новый сейчас.
Это происходит только после навигации. фрагмента и возвращаемся обратно, в противном случае запуск и остановка работают нормально.
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" } }
[/code] Проигрыватель работает нормально, когда я использую его для этого фрагмента. Мое условие таково: когда я воспроизвожу звук и перехожу к другому фрагменту, он должен продолжать воспроизводиться, когда я возвращаюсь обратно, если это так затем показать пользовательский интерфейс воспроизведения, если он был остановлен мной, а затем показать остановленный пользовательский интерфейс. Но сейчас происходит следующее: когда я перехожу к другому фрагменту и возвращаюсь обратно, он показывает соответствующий пользовательский интерфейс, если он воспроизводится, затем воспроизводится, если пауза, затем пауза, но когда я возвращаюсь из другого фрагмента и пытаюсь остановить звук, он меняет пользовательский интерфейс, меняя кнопку и gif, но звук не останавливается, но в пользовательском интерфейсе он остановился на интерфейсе , теперь, если пользователь снова нажмет кнопку для воспроизведения, он начнет потоковую передачу другого аудио одновременно: 2 аудио последовательно: старый звук, который не останавливался, и новый сейчас. Это происходит только после навигации. фрагмента и возвращаемся обратно, в противном случае запуск и остановка работают нормально.
Я создаю приложение для видеоплеера для Android, в котором мне нужно воспроизводить 2 (может быть, 4) прямых трансляции одновременно в одном и том же представлении.
Можно ли использовать один экземпляр exoplayer? Если да, предложите, как и как...
Я воспроизвожу звук с помощью аудиоплееров. Тем не менее, я получаю эту ошибку:
V/MediaPlayer(13566): resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
V/MediaPlayer(13566): cleanDrmObj:...
Я пытаюсь передать аудио, сгенерированное ElevenLabs (через их веб-сокет), обратно в Twilio. Однако я мог слышать только белый шум.
Однако, когда я использовал их API для получения звука, открыл его и передал в twilio, он воспроизводился на телефоне...
Я пытаюсь передать аудио, сгенерированное ElevenLabs (через их веб-сокет), обратно в Twilio. Однако я мог слышать только белый шум.
Однако, когда я использовал их API для получения звука, открыл его и передал в twilio, он воспроизводился на телефоне...