Google Recently have released the you tube api for android so now developers can play the youtube videos
in the youtube player view recently developers were using the webview to play the you tube video which was having so many limitations like controls,autoplay,seeking,etc
now i will show you how to implement the youtube player with api
in the youtube player view recently developers were using the webview to play the you tube video which was having so many limitations like controls,autoplay,seeking,etc
now i will show you how to implement the youtube player with api
package com.shir60bhushan.youtubeapi;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayer.ErrorReason;
import com.google.android.youtube.player.YouTubePlayer.PlaybackEventListener;
import com.google.android.youtube.player.YouTubePlayer.PlayerStateChangeListener;
import com.google.android.youtube.player.YouTubePlayer.PlayerStyle;
import com.google.android.youtube.player.YouTubePlayer.PlaylistEventListener;
import com.google.android.youtube.player.YouTubePlayerView;
import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent ;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;
import android.widget.TextView;
/**
* A simple YouTube Android API demo application demonstrating the use of {@link YouTubePlayer}
* programmatic controls.
*/
public class PlayerControlsDemoActivity extends YouTubeFailureRecoveryActivity implements
View.OnClickListener,
TextView.OnEditorActionListener,
CompoundButton.OnCheckedChangeListener,
AdapterView.OnItemSelectedListener {
private static final ListEntry[] ENTRIES = {
new ListEntry("Androidify App", "irH3OSOskcE", false),
new ListEntry("Chrome Speed Tests", "nCgQDjiotG0", false),
new ListEntry("Playlist: Google I/O 2012", "PL56D792A831D0C362", true)};
private static final String KEY_CURRENTLY_SELECTED_ID = "currentlySelectedId";
private YouTubePlayerView youTubePlayerView;
private YouTubePlayer player;
private TextView stateText;
private ArrayAdapter<ListEntry> videoAdapter;
private Spinner videoChooser;
private Button playButton;
private Button pauseButton;
private EditText skipTo;
private TextView eventLog;
private StringBuilder logString;
private RadioGroup styleRadioGroup;
private MyPlaylistEventListener playlistEventListener;
private MyPlayerStateChangeListener playerStateChangeListener;
private MyPlaybackEventListener playbackEventListener;
private int currentlySelectedPosition;
private String currentlySelectedId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.player_controls_demo);
youTubePlayerView = (YouTubePlayerView) findViewById(R.id.youtube_view);
stateText = (TextView) findViewById(R.id.state_text);
videoChooser = (Spinner) findViewById(R.id.video_chooser);
playButton = (Button) findViewById(R.id.play_button);
pauseButton = (Button) findViewById(R.id.pause_button);
skipTo = (EditText) findViewById(R.id.skip_to_text);
eventLog = (TextView) findViewById(R.id.event_log);
styleRadioGroup = (RadioGroup) findViewById(R.id.style_radio_group);
((RadioButton) findViewById(R.id.style_default)).setOnCheckedChangeListener(this);
((RadioButton) findViewById(R.id.style_minimal)).setOnCheckedChangeListener(this);
((RadioButton) findViewById(R.id.style_chromeless)).setOnCheckedChangeListener(this);
logString = new StringBuilder();
videoAdapter = new ArrayAdapter<ListEntry>(this, android.R.layout.simple_spinner_item, ENTRIES);
videoAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
videoChooser.setOnItemSelectedListener(this);
videoChooser.setAdapter(videoAdapter);
playButton.setOnClickListener(this);
pauseButton.setOnClickListener(this);
skipTo.setOnEditorActionListener(this);
youTubePlayerView.initialize(DeveloperKey.DEVELOPER_KEY, this);
/* enter your developer key from the google's developer account * /
playlistEventListener = new MyPlaylistEventListener();
playerStateChangeListener = new MyPlayerStateChangeListener();
playbackEventListener = new MyPlaybackEventListener();
setControlsEnabled(false);
}
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player,
boolean wasRestored) {
this.player = player;
player.setPlaylistEventListener(playlistEventListener);
player.setPlayerStateChangeListener(playerStateChangeListener);
player.setPlaybackEventListener(playbackEventListener);
if (!wasRestored) {
playVideoAtSelection();
}
setControlsEnabled(true);
}
@Override
protected YouTubePlayer.Provider getYouTubePlayerProvider() {
return youTubePlayerView;
}
private void playVideoAtSelection() {
ListEntry selectedEntry = videoAdapter.getItem(currentlySelectedPosition);
if (selectedEntry.id != currentlySelectedId && player != null) {
currentlySelectedId = selectedEntry.id;
if (selectedEntry.isPlaylist) {
player.cuePlaylist(selectedEntry.id);
} else {
player.cueVideo(selectedEntry.id);
}
}
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
currentlySelectedPosition = pos;
playVideoAtSelection();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing.
}
@Override
public void onClick(View v) {
if (v == playButton) {
player.play();
} else if (v == pauseButton) {
player.pause();
}
}
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (v == skipTo) {
int skipToSecs = parseInt(skipTo.getText().toString(), 0);
player.seekToMillis(skipToSecs * 1000);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(skipTo.getWindowToken(), 0);
return true;
}
return false;
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked && player != null) {
switch (buttonView.getId()) {
case R.id.style_default:
player.setPlayerStyle(PlayerStyle.DEFAULT);
break;
case R.id.style_minimal:
player.setPlayerStyle(PlayerStyle.MINIMAL);
break;
case R.id.style_chromeless:
player.setPlayerStyle(PlayerStyle.CHROMELESS);
break;
}
}
}
@Override
protected void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putString(KEY_CURRENTLY_SELECTED_ID, currentlySelectedId);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
currentlySelectedId = state.getString(KEY_CURRENTLY_SELECTED_ID);
}
private void updateText() {
stateText.setText(String.format("Current state: %s %s %s",
playerStateChangeListener.playerState, playbackEventListener.playbackState,
playbackEventListener.bufferingState));
}
private void log(String message) {
logString.append(message + "\n");
eventLog.setText(logString);
}
private void setControlsEnabled(boolean enabled) {
playButton.setEnabled(enabled);
pauseButton.setEnabled(enabled);
skipTo.setEnabled(enabled);
videoChooser.setEnabled(enabled);
for (int i = 0; i < styleRadioGroup.getChildCount(); i++) {
styleRadioGroup.getChildAt(i).setEnabled(enabled);
}
}
private static final int parseInt(String intString, int defaultValue) {
try {
return intString != null ? Integer.valueOf(intString) : defaultValue;
} catch (NumberFormatException e) {
return defaultValue;
}
}
private String formatTime(int millis) {
int seconds = millis / 1000;
int minutes = seconds / 60;
int hours = minutes / 60;
return (hours == 0 ? "" : hours + ":")
+ String.format("%02d:%02d", minutes % 60, seconds % 60);
}
private String getTimesText() {
int currentTimeMillis = player.getCurrentTimeMillis();
int durationMillis = player.getDurationMillis();
return String.format("(%s/%s)", formatTime(currentTimeMillis), formatTime(durationMillis));
}
private final class MyPlaylistEventListener implements PlaylistEventListener {
@Override
public void onNext() {
log("NEXT VIDEO");
}
@Override
public void onPrevious() {
log("PREVIOUS VIDEO");
}
@Override
public void onPlaylistEnded() {
log("PLAYLIST ENDED");
}
}
private final class MyPlaybackEventListener implements PlaybackEventListener {
String playbackState = "NOT_PLAYING";
String bufferingState = "";
@Override
public void onPlaying() {
playbackState = "PLAYING";
updateText();
log("\tPLAYING " + getTimesText());
}
@Override
public void onBuffering(boolean isBuffering) {
bufferingState = isBuffering ? "(BUFFERING)" : "";
updateText();
log("\t\t" + (isBuffering ? "BUFFERING " : "NOT BUFFERING ") + getTimesText());
}
@Override
public void onStopped() {
playbackState = "STOPPED";
updateText();
log("\tSTOPPED");
}
@Override
public void onPaused() {
playbackState = "PAUSED";
updateText();
log("\tPAUSED " + getTimesText());
}
@Override
public void onSeekTo(int endPositionMillis) {
log(String.format("\tSEEKTO: (%s/%s)",
formatTime(endPositionMillis),
formatTime(player.getDurationMillis())));
}
}
private final class MyPlayerStateChangeListener implements PlayerStateChangeListener {
String playerState = "UNINITIALIZED";
@Override
public void onLoading() {
playerState = "LOADING";
updateText();
log(playerState);
}
@Override
public void onLoaded(String videoId) {
playerState = String.format("LOADED %s", videoId);
updateText();
log(playerState);
}
@Override
public void onAdStarted() {
playerState = "AD_STARTED";
updateText();
log(playerState);
}
@Override
public void onVideoStarted() {
playerState = "VIDEO_STARTED";
updateText();
log(playerState);
}
@Override
public void onVideoEnded() {
playerState = "VIDEO_ENDED";
updateText();
log(playerState);
}
@Override
public void onError(ErrorReason reason) {
playerState = "ERROR (" + reason + ")";
if (reason == ErrorReason.UNEXPECTED_SERVICE_DISCONNECTION) {
// When this error occurs the player is released and can no longer be used.
player = null;
setControlsEnabled(false);
}
updateText();
log(playerState);
}
}
private static final class ListEntry {
public final String title;
public final String id;
public final boolean isPlaylist;
public ListEntry(String title, String videoId, boolean isPlaylist) {
this.title = title;
this.id = videoId;
this.isPlaylist = isPlaylist;
}
@Override
public String toString() {
return title;
}
}
}
and the
player_control_demo.xml is as follows:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/state_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingTop="5dp"
android:singleLine="true" />
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:orientation="horizontal"
android:padding="8dp" >
<include
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
layout="@layout/player_controls_container" />
</LinearLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
<TextView
android:id="@+id/event_log"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp" />
</ScrollView>
</LinearLayout>

4 comments :
Hi, can you post all the files for needed for the project, I'm getting errors regarding:
play_button, pause_button, skip_to_text, style_radio_group, style_default, style_minimal, style_chromeless.
e.g:
videoChooser = (Spinner) findViewById(R.id.video_chooser);
==>
video_chooser cannot be resolved or is not a field
Never mind, here's the original source code (Copyright by Google):
http://code.google.com/r/luonghien125-android-youtube-api/source/browse/android-player/src/com/examples/youtubeapidemo
Thanks for this blog postt
Post a Comment