[android] Youtube player API - activity

sundays·2022년 11월 7일
0
post-thumbnail

안녕하세요. 이번에는 activity 에서 youtubeplayer를 운용해볼 것입니다. 차후에는 FragmentContainerView 를 생성해서 레이아웃을 더 상세하게 설정해 줄 예정입니다.

아시겠지만 제가 앱개발 처음하던시절에 나왔던 YOUTUBE API JAR 는 업데이트가 되지않고 있습니다. 이제는 앱개발하는데 jar는 사용하지 않는데 아직도 gradle library를 제공해주지는 않네요. (돈이 안되기 때문인것 같습니다)

참고로 이렇게 하지 않아도 간편하게 playerlibrary를 지원해주는 곳을 정리해준 곳이 있습니다. 나 처럼 살지 마시오.

라이브러리를 다운 받는 방법은 생략하겠습니다
제일 하단에 있는 reference를 누르시고 사이트로 이동하시면 더 간편합니다

AndroidMeanifest.xml

<manifest>
	<application>
    ....
    </application>
	<queries>
        <intent>
            <action android:name="com.google.android.youtube.api.service.START" />
        </intent>
    </queries>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

이작업을 하지 않으면 SERVICE_MISSING 이라는 에러가 뜨는데, 내용은 대충 11부터는 패키지 공개 상태 관리 라는 접근제한이 생겼다고 합니다. 이내용을 참고하세요.

youtube_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".YoutubeActivity">

    <com.google.android.youtube.player.YouTubePlayerView
        android:id="@+id/youtubePlayer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

library에서 제공해주고 있는 youtubeplayerview 를 사용할 것입니다. 그리고 이번에는

// build.gradle

plugins {
    ..
    id 'kotlin-android-extensions'
}

kotlin-android-extensions을 사용해 줄 겁니다. 이거 현재는 deprecated 되었다고 하네요! 어쩐지 inital app에도 없더라니. 제가 너무 옛날 옛적에 databinding를 해주던 시절에 비하면 참 좋아졌다고 생각했는데? 더 좋아졌네요....

YoutubeActivity.kt

import android.os.Bundle
import android.widget.Toast
import com.google.android.youtube.player.YouTubeBaseActivity
import com.google.android.youtube.player.YouTubeInitializationResult
import com.google.android.youtube.player.YouTubePlayer
import kotlinx.android.synthetic.main.youtube_layout.*

class YoutubeActivity : YouTubeBaseActivity() {

    lateinit var youtubePlayerInit: YouTubePlayer.OnInitializedListener
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.youtube_layout)
        intent.getStringExtra("video_id")?.let { initUI(it) }
    }

    private fun initUI(video_id:String) {
        youtubePlayerInit = object : YouTubePlayer.OnInitializedListener {
            override fun onInitializationSuccess(p0: YouTubePlayer.Provider?, youtubePlayer: YouTubePlayer?, p2: Boolean) {
                youtubePlayer?.loadVideo(video_id)
            }

            override fun onInitializationFailure(p0: YouTubePlayer.Provider?, p1: YouTubeInitializationResult?) {
                Toast.makeText(applicationContext, "Something went wrong !! ", Toast.LENGTH_SHORT).show()
            }
        }
        youtubePlayer.initialize(getString(R.string.GOOGLE_API_KEY), youtubePlayerInit)
    }

}

video_id는 intent 할때 set해줘서 다른 액티비티로부터 받아오게 설정하였습니다.

val intent = Intent(ctx, YoutubeActivity::class.java)
intent.putExtra("video_id", post.id.videoId)
ctx.startActivity(intent)

솔직히 이 구조도 옛날방식같긴한데요. 다른 토이 프로젝트들이 데이터 intent를 어떤식으로 해서 메모리를 줄이고 있는지 보면 더 재밌을것 같아요!
많은 분들의 프로젝트가 영감이 되네요.

using

제가 생각하기에 아무래도 api-key 같은 것에는 제약이 따릅니다. 요청횟수를 무한정 호출 할 수 없기 때문이죠. 그래서 위에 고수님께서 작성해주신 library의 구조를 잠깐봤는데 youtube jar libray를 정석적으로 활용하지는 않아서 요청횟수에도 제약이 없다는 것 같습니다.

player를 더 파볼지.. 일단은 저의 과제로 남겨두고 저의 토이프로젝트에는 다른 기능이 더 급해서 차후에는 글이 더 수정될 수 있을것 같아요

reference

profile
develop life

0개의 댓글