Android
Youtube-API
수색…
비고
- 우선 아래 링크에서 최신 jar 파일을 다운로드해야합니다. https://developers.google.com/youtube/android/player/downloads/
- 프로젝트에이 항아리를 포함시켜야합니다. 이 jar를 libs 폴더에 복사하여 붙여 넣고 gradle 파일 종속성에 추가하는 것을 잊지 마십시오 {{libs / YouTubeAndroidPlayerApi.jar '}}
- youtube API에 액세스하려면 API 키가 있어야합니다. api 키를 생성 하려면 https://developers.google.com/youtube/android/player/register 링크를 클릭 하십시오 .
- 프로젝트를 정리하고 빌드하십시오. 이제 youtubeAndroidPlayerApi를 사용할 준비가되었습니다. YouTube 비디오를 재생하려면 YouTube에서 재생할 수 있도록 해당 비디오 ID가 있어야합니다. 예 : https://www.youtube.com/watch?v=B08iLAtS3AQ , B08iLAtS3AQ는 YouTube에서 재생해야하는 동영상 ID입니다.
StandAlonePlayerActivity 실행
독립형 플레이어 활동 시작
Intent standAlonePlayerIntent = YouTubeStandalonePlayer.createVideoIntent((Activity) context, Config.YOUTUBE_API_KEY, // which you have created in step 3 videoId, // video which is to be played 100, //The time, in milliseconds, where playback should start in the video true, //autoplay or not false); //lightbox mode or not; false will show in fullscreen context.startActivity(standAlonePlayerIntent);
YouTubeBaseActivity 확장 활동
public class CustomYouTubeActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener, YouTubePlayer.PlayerStateChangeListener {
private YouTubePlayerView mPlayerView;
private YouTubePlayer mYouTubePlayer;
private String mVideoId = "B08iLAtS3AQ";
private String mApiKey;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApiKey = Config.YOUTUBE_API_KEY;
mPlayerView = new YouTubePlayerView(this);
mPlayerView.initialize(mApiKey, this); // setting up OnInitializedListener
addContentView(mPlayerView, new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT)); //show it in full screen
}
//Called when initialization of the player succeeds.
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider,
YouTubePlayer player,
boolean wasRestored) {
player.setPlayerStateChangeListener(this); // setting up the player state change listener
this.mYouTubePlayer = player;
if (!wasRestored)
player.cueVideo(mVideoId);
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult errorReason) {
Toast.makeText(this, "Error While initializing", Toast.LENGTH_LONG).show();
}
@Override
public void onAdStarted() {
}
@Override
public void onLoaded(String videoId) { //video has been loaded
if(!TextUtils.isEmpty(mVideoId) && !this.isFinishing() && mYouTubePlayer != null)
mYouTubePlayer.play(); // if we dont call play then video will not auto play, but user still has the option to play via play button
}
@Override
public void onLoading() {
}
@Override
public void onVideoEnded() {
}
@Override
public void onVideoStarted() {
}
@Override
public void onError(ErrorReason reason) {
Log.e("onError", "onError : " + reason.name());
}
}
세로 액티비티의 YoutubePlayerFragment
다음 코드는 간단한 YoutubePlayerFragment를 구현합니다. 액티비티의 레이아웃은 세로 모드로 고정되며 방향이 변경되거나 사용자가 YoutubePlayer에서 전체 화면을 클릭하면 YoutubePlayer가 화면을 채우면서 lansscape로 바뀝니다. YoutubePlayerFragment는 Youtube 라이브러리에서 제공하는 활동을 확장 할 필요가 없습니다. YoutubePlayer를 초기화하려면 YouTubePlayer.OnInitializedListener를 구현해야합니다. 그래서 우리의 활동 수업은 다음과 같습니다.
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayerFragment;
public class MainActivity extends AppCompatActivity implements YouTubePlayer.OnInitializedListener {
public static final String API_KEY ;
public static final String VIDEO_ID = "B08iLAtS3AQ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
YouTubePlayerFragment youTubePlayerFragment = (YouTubePlayerFragment) getFragmentManager()
.findFragmentById(R.id.youtubeplayerfragment);
youTubePlayerFragment.initialize(API_KEY, this);
}
/**
*
* @param provider The provider which was used to initialize the YouTubePlayer
* @param youTubePlayer A YouTubePlayer which can be used to control video playback in the provider.
* @param wasRestored Whether the player was restored from a previously saved state, as part of the YouTubePlayerView
* or YouTubePlayerFragment restoring its state. true usually means playback is resuming from where
* the user expects it would, and that a new video should not be loaded
*/
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
youTubePlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_ORIENTATION |
YouTubePlayer.FULLSCREEN_FLAG_ALWAYS_FULLSCREEN_IN_LANDSCAPE);
if(!wasRestored) {
youTubePlayer.cueVideo(VIDEO_ID);
}
}
/**
*
* @param provider The provider which failed to initialize a YouTubePlayer.
* @param error The reason for this failure, along with potential resolutions to this failure.
*/
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult error) {
final int REQUEST_CODE = 1;
if(error.isUserRecoverableError()) {
error.getErrorDialog(this,REQUEST_CODE).show();
} else {
String errorMessage = String.format("There was an error initializing the YoutubePlayer (%1$s)", error.toString());
Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
}
}
}
YoutubePlayerFragment는 활동의 레이아웃 xaml에 추가 할 수 있습니다.
<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:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<fragment
android:id="@+id/youtubeplayerfragment"
android:name="com.google.android.youtube.player.YouTubePlayerFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:text="This is a YoutubePlayerFragment example"
android:textStyle="bold"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
마지막으로 활동의 태그 안에 Manifest 파일에 다음 속성을 추가해야합니다.
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
YouTube 플레이어 API
Android API 키 얻기 :
먼저 java keytool을 사용하여 컴퓨터에서 SHA-1 지문을 얻어야합니다. cmd / terminal에서 아래 명령을 실행하여 SHA-1 지문을 얻습니다.
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
MainActivity.java
public class Activity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
private static final int RECOVERY_DIALOG_REQUEST = 1;
// YouTube player view
private YouTubePlayerView youTubeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_main);
youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
// Initializing video player with developer key
youTubeView.initialize(Config.DEVELOPER_KEY, this);
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult errorReason) {
if (errorReason.isUserRecoverableError()) {
errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
} else {
String errorMessage = String.format(
getString(R.string.error_player), errorReason.toString());
Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
}
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider,
YouTubePlayer player, boolean wasRestored) {
if (!wasRestored) {
// loadVideo() will auto play video
// Use cueVideo() method, if you don't want to play it automatically
player.loadVideo(Config.YOUTUBE_VIDEO_CODE);
// Hiding player controls
player.setPlayerStyle(YouTubePlayer.PlayerStyle.CHROMELESS);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECOVERY_DIALOG_REQUEST) {
// Retry initialization if user performed a recovery action
getYouTubePlayerProvider().initialize(Config.DEVELOPER_KEY, this);
}
}
private YouTubePlayer.Provider getYouTubePlayerProvider() {
return (YouTubePlayerView) findViewById(R.id.youtube_view);
}
}
이제 Config.java
파일을 작성하십시오. 이 파일에는 Google 콘솔 API 개발자 키와 YouTube 동영상 ID가 들어 있습니다.
Config.java
public class Config {
// Developer key
public static final String DEVELOPER_KEY = "AIzaSyDZtE10od_hXM5aXYEh6Zn7c6brV9ZjKuk";
// YouTube video id
public static final String YOUTUBE_VIDEO_CODE = "_oEA18Y8gM0";
}
XML 파일
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp" />
Android에서 YouTube 데이터 API 사용하기
이 예는 Android에서 YouTube Data API를 사용하여 재생 목록 데이터를 가져 오는 방법을 안내합니다.
SHA-1 지문
먼저 SHA-1 지문을 컴퓨터에 가져와야합니다. 여러 가지 검색 방법이 있습니다. 이 Q & A 에서 제공하는 방법을 선택할 수 있습니다.
Android 용 Google API 콘솔 및 YouTube 키
이제 SHA-1 지문을 가지고 Google API 콘솔을 열고 프로젝트를 만듭니다. 이 페이지로 이동하여 해당 SHA-1 키를 사용하여 프로젝트를 만들고 YouTube 데이터 API를 사용하도록 설정합니다. 이제 열쇠를 얻을 수 있습니다. 이 키는 Android에서 요청을 보내고 데이터를 가져 오는 데 사용됩니다.
요람 부분
YouTube Data API의 Gradle 파일에 다음 줄을 추가해야합니다.
compile 'com.google.apis:google-api-services-youtube:v3-rev183-1.22.0'
YouTube의 기본 클라이언트를 사용하여 요청을 보내려면 Gradle에 다음 줄을 추가해야합니다.
compile 'com.google.http-client:google-http-client-android:+'
compile 'com.google.api-client:google-api-client-android:+'
compile 'com.google.api-client:google-api-client-gson:+'
충돌을 피하기 위해 다음 구성도 Gradle에 추가해야합니다.
configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.2'
}
아래에는 gradle.build 가 어떻게 생겼는지 보여줍니다.
build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.aam.skillschool"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.2'
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.google.apis:google-api-services-youtube:v3-rev183-1.22.0'
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
compile 'com.google.http-client:google-http-client-android:+'
compile 'com.google.api-client:google-api-client-android:+'
compile 'com.google.api-client:google-api-client-gson:+'
}
이제 자바가 등장합니다. 우리는 네트워킹을 위해 HttpTransport
를 사용하고 JSON을 POJO로 변환하기 위해 GsonFactory
를 사용할 것이기 때문에 요청을 보내기 위해 다른 라이브러리가 필요하지 않습니다.
이제 재생 목록 ID를 제공하여 YouTube API를 통해 재생 목록을 가져 오는 방법을 보여 드리겠습니다. 이 작업을 위해 AsyncTask
를 사용할 것입니다. 매개 변수를 요청하는 방법과 흐름을 이해하는 방법을 이해하려면 YouTube Data API를 살펴보십시오.
public class GetPlaylistDataAsyncTask extends AsyncTask<String[], Void, PlaylistListResponse> {
private static final String YOUTUBE_PLAYLIST_PART = "snippet";
private static final String YOUTUBE_PLAYLIST_FIELDS = "items(id,snippet(title))";
private YouTube mYouTubeDataApi;
public GetPlaylistDataAsyncTask(YouTube api) {
mYouTubeDataApi = api;
}
@Override
protected PlaylistListResponse doInBackground(String[]... params) {
final String[] playlistIds = params[0];
PlaylistListResponse playlistListResponse;
try {
playlistListResponse = mYouTubeDataApi.playlists()
.list(YOUTUBE_PLAYLIST_PART)
.setId(TextUtils.join(",", playlistIds))
.setFields(YOUTUBE_PLAYLIST_FIELDS)
.setKey(AppConstants.YOUTUBE_KEY) //Here you will have to provide the keys
.execute();
} catch (IOException e) {
e.printStackTrace();
return null;
}
return playlistListResponse;
}
}
위의 비동기 작업은 YouTube SDK의 빌드 인 클래스 인 PlaylistListResponse
의 인스턴스를 반환합니다. 필수 필드가 모두 있으므로 POJO를 직접 만들 필요가 없습니다.
마지막으로 MainActivity
에서 다음을 수행해야합니다.
public class MainActivity extends AppCompatActivity {
private YouTube mYoutubeDataApi;
private final GsonFactory mJsonFactory = new GsonFactory();
private final HttpTransport mTransport = AndroidHttp.newCompatibleTransport();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_review);
mYoutubeDataApi = new YouTube.Builder(mTransport, mJsonFactory, null)
.setApplicationName(getResources().getString(R.string.app_name))
.build();
String[] ids = {"some playlists ids here seperated by "," };
new GetPlaylistDataAsyncTask(mYoutubeDataApi) {
ProgressDialog progressDialog = new ProgressDialog(getActivity());
@Override
protected void onPreExecute() {
progressDialog.setTitle("Please wait.....");
progressDialog.show();
super.onPreExecute();
}
@Override
protected void onPostExecute(PlaylistListResponse playlistListResponse) {
super.onPostExecute(playlistListResponse);
//Here we get the playlist data
progressDialog.dismiss();
Log.d(TAG, playlistListResponse.toString());
}
}.execute(ids);
}
}