在Android應用程式使用YouTube API來嵌入視頻

来源:http://www.cnblogs.com/miaoqing/archive/2016/02/17/5195590.html
-Advertisement-
Play Games

在Android版YouTube播放器API使您可以將視頻播放功能到你的Android應用程式。該API允許您載入和播放YouTube視頻(和播放列表),並自定義和控制視頻播放體驗。 您可以載入或暗示的視頻嵌入到你的應用程式的用戶界面的球員視圖。然後,您可以通過編程式控制制播放。例如播放,暫停,或尋求在


Android版YouTube播放器API使您可以將視頻播放功能到你的Android應用程式該API允許您載入和播放YouTube視頻(和播放列表),並自定義和控制視頻播放體驗。

您可以載入或暗示的視頻嵌入到你的應用程式的用戶界面的球員視圖。然後,您可以通過編程式控制制播放。例如播放,暫停,或尋求在載入視頻的特定點。您可以註冊事件偵聽器來獲取某些事件,比如玩家載入視頻或播放狀態改變回調。API還具有輔助功能,支持方向的變化,以及過渡到全屏播放。


使用Android的Youtube API之前,您需要註冊您的應用程式,包括您的數字簽名的apk在谷歌開發者控制台文件的公證書。要註冊應用程式,請按照下列步驟。要開始,創建一個新的項目。我打電話給我VideoTube。在Android Studio的嚮導的下一個屏幕上選擇API 10空白活動MainActivity作為活動的名稱。

  1. 進入谷歌開發者控制台
  2. 創建一個新項目。我將其命名VideoTube
  3. 在該項目中創建後出現的頁面上,展開API和驗證左側邊欄。接下來,單擊的API在API的列表,點擊YouTube數據API並啟用YouTube數據API V3後面的頁面上。
  4. 在左側邊欄,選擇證書對於資格證書,API支持的OAuth 2.0,使用服務帳戶的API密鑰和。我們將使用API密鑰選項。
  5. 選擇API密鑰從添加憑據下拉菜單。會顯示一個彈出讓你指定密鑰類型。選擇Android的關鍵接下來選擇添加包名和指紋,並添加Android應用程式的包名(我的是com.echessa.videotube),然後在終端中運行以下命令來獲取SHA-1證書指紋。

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應用程式使用YouTube API來嵌入視頻

變回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支持)。即使在我的模擬器安裝了谷歌企業應用套件,我仍然無法播放視頻。視頻縮略圖載入沒關係的看法,但在攻播放按鈕,載入指示燈會出現,但再裝載會失敗,“連接到伺服器丟失”的消息。您可能需要為這個真正的設備。

在Android應用程式使用YouTube API來嵌入視頻

響應回放事件和狀態改變

在應用中,你可能需要採取取決於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.PlaybackEventListenerYouTubePlayer.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文件。

如果您嘗試教程和你的經歷和你有任何問題,我當然很希望聽到的。更多資源請訪問  源碼搜藏網


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是一款基於jQuery和CSS3的登錄表單,登錄表單的界面整體呈現扁平化風格,非常簡潔和清新。當焦點在表單的輸入欄位上時,表單提示文字會出現一個小動畫,同時這款CSS3登錄表單的最大特點是其個性化的登錄按鈕,滑鼠滑過也有不錯的效果。 線上預覽 源碼下載 實現的代碼。 html代碼: <div cl
  • 1.0 作者:cloudgamer http://www.cnblogs.com/cloudgamer/archive/2010/04/01/ImageZoom.html
  • Web技術的發展速度太快了,如果你不與時俱進,就會被淘汰。因此,為了應對即將到來的HTML5,本文總結了22個HTML5的初級技巧,希望能對你進一步學習好HTML5會有所幫助。 1. 新的Doctype聲明 XHTML的聲明太長了,我相信很少會有前端開發人員能手寫出這個Doctype聲明。 1 <!
  • 1.不論滑鼠指針離開被選元素還是任何子元素,都會觸發 mouseout 事件。 2.只有在滑鼠指針離開被選元素時,才會觸發 mouseleave 事件。 <div class="sel_box"> <input type="button" value="請選擇所屬部門" id="sel_dept"
  • 一、首先需要明白的幾個概念 1、屏幕尺寸:也就是我們平常所說的某某手機幾寸屏。比如蘋果的4.7寸, 榮耀6的5.5寸。這裡說的寸是英寸(1 英寸 = 2.54 釐米)。 計算方法:屏幕尺寸=對角先尺寸(cm) / 2.54(cm) 一般用英寸表示。1英寸=2.54cm 2、解析度:屏幕上顯示的像素個
  • # built application files *.apk *.ap_ # files for the dex VM *.dex # Intellij project files .idea/ .gradle/ *.iml # Java class files *.class # Local c
  • Android的存儲系統(三) 回顧:前帖分析了Vold的main()函數和NetlinkManager的函數調用流程,截止到NetlinkHandler的創建和start()調用,本帖繼續分析源碼 1、處理block類型的uevent main()函數創建了CommandListener對象,Ne
  • 本文內容大綱: 1、回顧NSURLSessionTask 2、NSURLSessionDownloadTask大文件之block下載 3、NSURLSessionDownloadTask大文件之代理方法下載 4、NSURLSessionDownloadTask大文件之代理方法實現斷點續傳下載 前言:
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...