EnjoyLife

MediaBrowserService 와 MediaSessionCompat 을 이용해서 exoplayer 만들기 본문

안드로이드 개발/개발팁

MediaBrowserService 와 MediaSessionCompat 을 이용해서 exoplayer 만들기

Aiden96 2023. 10. 26. 00:09
class MyActivity : AppCompatActivity() {

    private lateinit var mediaBrowserService: MyMediaBrowserService
    private lateinit var mediaSession: MediaSessionCompat
    private lateinit var player: ExoPlayer

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        // MediaBrowserService를 만듭니다.
        mediaBrowserService = MyMediaBrowserService()
        startService(Intent(this, MyMediaBrowserService::class.java))

        // 미디어 세션을 만듭니다.
        mediaSession = MediaSessionCompat(this, "MyMediaSession")

        // 미디어 세션의 이벤트를 처리합니다.
        mediaSession.setCallback(object : MediaSessionCompat.Callback() {
            override fun onPlay() {
                // 재생을 시작합니다.
                player.play()
            }

            override fun onPause() {
                // 재생을 일시 중지합니다.
                player.pause()
            }

            override fun onStop() {
                // 재생을 중지합니다.
                player.stop()
            }

            override fun onSeekTo(pos: Long) {
                // 재생 위치를 변경합니다.
                player.seekTo(pos)
            }

            override fun onSkipToNext() {
                // 다음 미디어 항목으로 건너뜁니다.
                player.next()
            }

            override fun onSkipToPrevious() {
                // 이전 미디어 항목으로 건너뜁니다.
                player.previous()
            }
        })

        // 미디어 세션을 ExoPlayer에 연결합니다.
        mediaSession.setActive(true)
        player.setMediaSession(mediaSession)

        // 미디어를 준비합니다.
        val mediaSource = ProgressiveMediaSource.Factory(DefaultDataSourceFactory(this))
            .createMediaSource(Uri.parse("https://주소 /app/bunny.mp4"))
        player.prepare(mediaSource)

        // 재생을 시작합니다.
        player.play()
    }
}

class MyMediaBrowserService : MediaBrowserServiceCompat() {

    override fun onGetRoot(
        clientPackageName: String,
        clientUid: Int,
        rootHints: Bundle?
    ): BrowserRoot? {
        // 루트 노드를 반환합니다.
        return BrowserRoot(MediaIDHelper.ROOT_ID, null)
    }

    override fun onLoadChildren(
        parentId: String,
        result: Result<List<MediaBrowserCompat.MediaItem>>
    ) {
        // 하위 노드를 반환합니다.
        val mediaItems = mutableListOf<MediaBrowserCompat.MediaItem>()

        // 미디어 항목을 추가합니다.
        mediaItems.add(
            MediaBrowserCompat.MediaItem(
                MediaMetadataCompat.Builder()
                    .setMediaId("bunny")
                    .setTitle("토끼")
                    .setDescription("토끼 동영상")
                    .setMediaUri(Uri.parse("https://주소../app/bunny.mp4"))
                    .build(),
                MediaBrowserCompat.MediaItem.FLAG_PLAYABLE
            )
        )

        result.sendResult(mediaItems)
    }
}