編輯:關於android開發
在Android版YouTube播放器API使您可以將視頻播放功能到你的Android應用程序。該API允許您加載和播放YouTube視頻(和播放列表),並自定義和控制視頻播放體驗。
您可以加載或暗示的視頻嵌入到你的應用程序的用戶界面的球員視圖。然後,您可以通過編程控制播放。例如播放,暫停,或尋求在加載視頻的特定點。您可以注冊事件偵聽器來獲取某些事件,比如玩家加載視頻或播放狀態改變回調。API還具有輔助功能,支持方向的變化,以及過渡到全屏播放。
使用Android的Youtube API之前,您需要注冊您的應用程序,包括您的數字簽名的apk在谷歌開發者控制台文件的公證書。要注冊應用程序,請按照下列步驟。要開始,創建一個新的項目。我打電話給我VideoTube。在Android Studio的向導的下一個屏幕上選擇API 10,空白活動和MainActivity作為活動的名稱。
keytool -list -v -keystore ~/.android/debug.keystore
輸入的android系統提示時作為密碼。上位於調試密鑰庫上面的命令打印資料〜/ .android / debug.keystore您的計算機上。這是通過Eclipse中或Android工作室當你第一次建立了一個Android應用程序自動生成的。在終端方面,你會看到MD5和SHA-1證書指紋。復制SHA-1指紋,並將其粘貼在谷歌開發者控制台,然後點擊創建按鈕。API密鑰將會產生。稍後我們將使用此。
早在Android應用程序,創建一個名為類Config.java並粘貼以下。
package com.echessa.videotube;
/**
* Created by echessa on 7/17/15.
*/
public final class Config {
private Config() {
}
public static final String YOUTUBE_API_KEY = "YOUR API KEY";
}
粘貼您的API密鑰。
下載(在寫作的時候1.2.1)的最新版本的Android版YouTube播放器API的。解壓下載的文件,以找到庫的jar文件,並且你可以用它來 看看有什麼的庫提供的一個示例應用程序。該JAR文件位於庫文件夾中。復制並粘貼到你的項目的庫文件夾中。要訪問的庫文件夾,使用項目在Android Studio的工程資源管理器的角度來看。然後,展開VideoTube - >程序- >庫。
變回Android的角度來看,選擇的build.gradle(模塊:應用程序)文件,並添加以下的依賴關系。
compile files('libs/YouTubeAndroidPlayerApi.jar')
同步項目的文件的gradle。
添加下面的權限,互聯網接入到的AndroidManifest.xml文件作為一個孩子明顯
標簽和同級的應用程序
。
<uses-permission android:name="android.permission.INTERNET"/>
編輯的strings.xml文件,如圖所示。這些都是我們需要的字符串資源。
<resources>
<string name="app_name">VideoTube</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="player_error">Error initializing YouTube player</string>
<string name="seek_to">Jump To</string>
<string name="seek_to_hint">Seconds</string>
</resources>
接下來,我們將添加一個YouTubePlayerView
到布局文件。該視圖用於顯示YouTube視頻。
修改activity_main.xml中,如圖所示。
<RelativeLayout 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"
tools:context=".MainActivity">
<com.google.android.youtube.player.YouTubePlayerView
android:id="@+id/youtube_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
我們將直接使用YouTubePlayerView在我們的活動,而不是使用YouTubePlayerFragment。正因為如此,該活動需要延長YouTubeBaseActivity
類。
修改MainActivity.java如圖所示。
package com.echessa.videotube;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
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 com.google.android.youtube.player.YouTubePlayer.Provider;
import com.google.android.youtube.player.YouTubePlayerView;
public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
private static final int RECOVERY_REQUEST = 1;
private YouTubePlayerView youTubeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
youTubeView.initialize(Config.YOUTUBE_API_KEY, this);
}
@Override
public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
if (!wasRestored) {
player.cueVideo("fhWaJi1Hsfo"); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo
}
}
@Override
public void onInitializationFailure(Provider provider, YouTubeInitializationResult errorReason) {
if (errorReason.isUserRecoverableError()) {
errorReason.getErrorDialog(this, RECOVERY_REQUEST).show();
} else {
String error = String.format(getString(R.string.player_error), errorReason.toString());
Toast.makeText(this, error, Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == RECOVERY_REQUEST) {
// Retry initialization if user performed a recovery action
getYouTubePlayerProvider().initialize(Config.YOUTUBE_API_KEY, this);
}
}
protected Provider getYouTubePlayerProvider() {
return youTubeView;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
在上面的代碼中,我們創建一個類,是的子類YouTubeBaseActivity
。這需要利用YouTubePlayerView
。我們實施YouTubePlayer.OnInitializedListener
偵聽初始化成功或失敗。該接口有兩個方法,一個名為onInitializationFailure()
和onInitializationSuccess()
。如果初始化成功,cueVideo()
方法播放YouTube視頻的櫃面和失敗,會檢查錯誤是否是由用戶追討。
如果它不是那麼錯誤的吐司是顯示給用戶,如果它的用戶可恢復的,那麼getErrorDialog()
方法顯示一個對話框,使用戶能夠從錯誤中恢復。
例如,如果YouTube應用是不是安裝在用戶的設備上或已過期,對話將有一個提示,經確認後,將打開谷歌Play商店安裝或相應地更新它的用戶。如果YouTube應用在設備上禁用,則該提示將打開系統設置為用戶啟用它。
當用戶從錯誤恢復對話返回,的onActivityResult()
被調用檢查,查看是否用戶執行的恢復操作。如果是這樣,我們重試初始化。
運行該應用程序,你應該能夠發揮在代碼中指定的視頻。請注意,您將需要您的設備上的YouTube應用。該API客戶端庫與分布的YouTube應用為Android平台的部分服務進行交互。用戶需要運行移動版YouTube應用程式(或更高)的版本4.2.16使用API。通常情況下,運行Android 2.2(升級Froyo)或更高版本有谷歌Play商店應用的設備應該能夠運行向上的最新版本的YouTube應用。
這意味著什麼,是,除非你已經安裝了谷歌Apps的虛擬設備,您將無法測試在模擬器上的代碼。默認的Android模擬器不支持在設備上安裝谷歌企業應用套件,但如果你使用的模擬器像Genymotion,你將能夠(盡管球隊停止對谷歌Apps支持)。即使在我的模擬器安裝了谷歌企業應用套件,我仍然無法播放視頻。視頻縮略圖加載沒關系的看法,但在攻播放按鈕,加載指示燈會出現,但再裝載會失敗,“連接到服務器丟失”的消息。您可能需要為這個真正的設備。
在應用中,你可能需要采取取決於YouTube播放器的事件,如緩沖,播放,暫停了一些行動,尋求和停止。您可能需要向用戶顯示一個消息或覆蓋與另一種觀點認為,一旦視頻播放停止或結束播放器視圖。
該YouTubePlayer
具有以下接口定義來聽這樣的事件:
YouTubePlayer.PlayerStateChangeListener
-接口調用哪個高水平球員的狀態發生變化時回調的定義。YouTubePlayer.PlaybackEventListener
-接口時,視頻播放的事件發生時調用的回調定義。YouTubePlayer.OnFullscreenListener
-接口調用哪些回調定義時,打開或關閉全屏的播放器切換,無論是由於用戶點擊全屏按鈕或將呼叫setFullscreen(布爾)
。YouTubePlayer.PlaylistEventListener
-接口時,相關的播放列表的事件發生時調用的回調定義。我們將著眼於前兩個為這個應用程序。
下面的方法添加到MainActivity
類。
private void showMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
這將創建傳遞給函數的消息敬酒。這將節省我們從編寫代碼的類似的思路。
接著,下面的兩個子類添加到MainActivity
類。
private final class MyPlaybackEventListener implements YouTubePlayer.PlaybackEventListener {
@Override
public void onPlaying() {
// Called when playback starts, either due to user action or call to play().
showMessage("Playing");
}
@Override
public void onPaused() {
// Called when playback is paused, either due to user action or call to pause().
showMessage("Paused");
}
@Override
public void onStopped() {
// Called when playback stops for a reason other than being paused.
showMessage("Stopped");
}
@Override
public void onBuffering(boolean b) {
// Called when buffering starts or ends.
}
@Override
public void onSeekTo(int i) {
// Called when a jump in playback position occurs, either
// due to user scrubbing or call to seekRelativeMillis() or seekToMillis()
}
}
private final class MyPlayerStateChangeListener implements YouTubePlayer.PlayerStateChangeListener {
@Override
public void onLoading() {
// Called when the player is loading a video
// At this point, it's not ready to accept commands affecting playback such as play() or pause()
}
@Override
public void onLoaded(String s) {
// Called when a video is done loading.
// Playback methods such as play(), pause() or seekToMillis(int) may be called after this callback.
}
@Override
public void onAdStarted() {
// Called when playback of an advertisement starts.
}
@Override
public void onVideoStarted() {
// Called when playback of the video starts.
}
@Override
public void onVideoEnded() {
// Called when the video reaches its end.
}
@Override
public void onError(YouTubePlayer.ErrorReason errorReason) {
// Called when an error occurs.
}
}
以上創建實現類YouTubePlayer.PlaybackEventListener
和YouTubePlayer.PlayerStateChangeListener
接口。對於每個類,我已經實現了接口的方法,其中包括調用回調時的注釋。你可以把你的每次回調想要的任何行動。在我們的例子,我已經包括了一個吐司輸出onPlaying()
,onPaused()
和onStopped()
當事件發生時會輸出一個消息的方法。
下面的類變量添加到MainActivity
文件。
private MyPlayerStateChangeListener playerStateChangeListener;
private MyPlaybackEventListener playbackEventListener;
下面添加到的底部的onCreate()
來初始化上述目的。
playerStateChangeListener = new MyPlayerStateChangeListener();
playbackEventListener = new MyPlaybackEventListener();
修改onInitializationSuccess()
,如圖所示。這台對聽眾YouTubePlayer
對象。
@Override
public void onInitializationSuccess(Provider provider, YouTubePlayer player, boolean wasRestored) {
player.setPlayerStateChangeListener(playerStateChangeListener);
player.setPlaybackEventListener(playbackEventListener);
if (!wasRestored) {
player.cueVideo("fhWaJi1Hsfo"); // Plays https://www.youtube.com/watch?v=fhWaJi1Hsfo
}
}
運行應用程序,你應該看到,當你開始播放視頻出現不同敬酒消息,當您暫停它,當它停止(除被暫停其他原因,如結束視頻或播放錯誤)。
在YouTube庫確實創造一個不折不扣的現成用戶友好的界面來播放YouTube視頻的好工作。作為開發人員,你可能想這進一步采取提供,這將使用戶在播放更多的控制自定義控件。例如,使他們能夠來回跳轉視頻,或使它們在播放列表播放下一首或上一個視頻。
我們將創造我們的應用程序的控制,使用戶可以跳轉到視頻的具體時間。
該API提供了兩種方法來跳回放:
seekToMillis()
-搜索到在視頻中指定的時間。seekRelativeMillis()
-由指定的秒數尋求前進或後退。我們將使用第一個跳出來的視頻指定的時間。
修改活動 main.xml_如圖所示。
<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"
tools:context=".MainActivity">
<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">
<EditText
android:id="@+id/seek_to_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:hint="@string/seek_to_hint"/>
<Button
android:id="@+id/seek_to_button"
android:text="@string/seek_to"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
在MainActivity
添加以下類變量。
private YouTubePlayer player;
在onInitializationSuccess()
設置此變量。
this.player = player;
下面添加到的底部的onCreate()
。
final EditText seekToText = (EditText) findViewById(R.id.seek_to_text);
Button seekToButton = (Button) findViewById(R.id.seek_to_button);
seekToButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int skipToSecs = Integer.valueOf(seekToText.getText().toString());
player.seekToMillis(skipToSecs * 1000);
}
});
運行該應用程序,你應該能夠輸入一個數字(以秒為單位),並有視頻跳到這一點。如果輸入一個數字,它是比視頻的持續時間大時,則視頻將跳到結束。
在本教程中,我們了解了如何在你的應用程序中嵌入YouTube播放器。如果你希望你的應用程序的用戶能夠播放YouTube視頻,而剩余的在你的應用程序,而不是YouTube應用開來播放視頻,然後在用戶播放後返回到您的應用程序這是非常方便。
Android版YouTube庫提供了一個很好的API,使您可以自定義此經驗,我們僅僅觸及了它的能力。要了解更多關於庫,一定要通過文檔閱讀並隨附庫下載示例應用程序。
你可以在這裡下載完成的項目。記得放置在您的密鑰Config.java文件。
如果您嘗試教程和你的經歷和你有任何問題,我當然很希望聽到的。更多資源請訪問 源碼搜藏網
Android Activity生命周期與啟動模式,androidactivityActivity的完整生命周期如下圖: Activity的加載模式有四種: stand
Android自定義View入門(一),androidview最近在寫一個關於音樂播放的應用,寫到播放界面UI時,就想自己實現的一個播放界面。那麼如何實現自定義View呢
Android開發學習之路--圖表實現(achartengine/MPAndroidChart)之初體驗 ??已經有一段時間沒有更新博客了,在上周離開工作了4年的公司,從
Android動畫解析(一)—— Frame Animation(幀動畫) 動畫在我們實際開發中占有很重要的地位,一個優秀的動畫能為我們的app應用增色很多,同時