안녕하세요. 이번에는 activity 에서 youtubeplayer를 운용해볼 것입니다. 차후에는 FragmentContainerView 를 생성해서 레이아웃을 더 상세하게 설정해 줄 예정입니다.
아시겠지만 제가 앱개발 처음하던시절에 나왔던 YOUTUBE API JAR 는 업데이트가 되지않고 있습니다. 이제는 앱개발하는데 jar는 사용하지 않는데 아직도 gradle library를 제공해주지는 않네요. (돈이 안되기 때문인것 같습니다)
참고로 이렇게 하지 않아도 간편하게 playerlibrary를 지원해주는 곳을 정리해준 곳이 있습니다. 나 처럼 살지 마시오.
라이브러리를 다운 받는 방법은 생략하겠습니다
제일 하단에 있는 reference를 누르시고 사이트로 이동하시면 더 간편합니다
<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부터는 패키지 공개 상태 관리
라는 접근제한이 생겼다고 합니다. 이내용을 참고하세요.
<?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를 해주던 시절에 비하면 참 좋아졌다고 생각했는데? 더 좋아졌네요....
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를 어떤식으로 해서 메모리를 줄이고 있는지 보면 더 재밌을것 같아요!
많은 분들의 프로젝트가 영감이 되네요.
제가 생각하기에 아무래도 api-key 같은 것에는 제약이 따릅니다. 요청횟수를 무한정 호출 할 수 없기 때문이죠. 그래서 위에 고수님께서 작성해주신 library의 구조를 잠깐봤는데 youtube jar libray를 정석적으로 활용하지는 않아서 요청횟수에도 제약이 없다는 것 같습니다.
player를 더 파볼지.. 일단은 저의 과제로 남겨두고 저의 토이프로젝트에는 다른 기능이 더 급해서 차후에는 글이 더 수정될 수 있을것 같아요