在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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...