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的角度来看,选择的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.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文件。

如果您尝试教程和你的经历和你有任何问题,我当然很希望听到的。更多资源请访问  源码搜藏网

在Android应用程序使用YouTube API来嵌入视频的更多相关文章

  1. 【阿里聚安全·安全周刊】500万台Android设备受感染|YouTube封杀枪支组装视频

    本周的七个关键词:  500万Android 设备受感染丨 黑客将矛头指向无线传输协议 丨  YouTube封杀枪支视频 丨 AMD将发布补丁 丨 Gooligan Android 僵尸网络 丨  N ...

  2. [转]Android应用程序框架思路整理

    一.一般Android应用程序架构(Book,购彩,Market). 普通的应用程序由于只需要用到Android的联网与显示的功能,所以应用程序大体上是呈现为UI(Activities)与网络(Net ...

  3. android的程序运行数据存放在哪里?

    Android应用开发中,给我们提供了5种数据的存储方式1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 ...

  4. fir.im Weekly - iOS/Android 应用程序架构解析

    假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 本期 fir.im Weekly 收集了关于  iOS/Android 开发资源,也加入了一些关于 Web 前端方面的分 ...

  5. Android开发之 Android应用程序详细解析

    我们继续的沿用上一篇所建立的应用. Android应用程序可以分为:应用程序源代码(.java),应用程序描述文件(.xml),各种资源. 可以这么理解: 安卓应用程序,通过java代码来实现其业务逻 ...

  6. Android开发之 Android应用程序目录结构解析

    建立的HelloWorld的应用项目,其代码是由ADT插件自动生成的,形成Android项目特有的结构框架. 接下来让我带领大家解析一个Android程序的各个组成部分,这次我们拿一个Hello,Wo ...

  7. 使用jQuery Mobile和Phone Gap开发Android应用程序

    经过了一段时间的学习,初步了解了该如何使用jQuery Mobile和 Phone Gap来开发一个Android应用程序,也想把这些东西介绍给大家. 1. 软件准备 要进行android app的开 ...

  8. Android应用程序版本号管理(官方文档中文版)

    在应用程序的 升级/维护 策略中, 版本是一个关键的组成部分. 用户需要了解在他们的设备上所安装的应用程序的版本的特定信息, 以及已安装程序的升级版本可用的情况. 其他应用程序 - 作为同一个套件中发 ...

  9. 4、什么构成了我们Android应用程序?(七大件)

    一.应用程序四大组件 [Activity] Activity是Android应用程序的一个界面,可以通过这个界面查看联系人,打电话戒玩游戏. b. 一个应用程序通常包含多个Activity. c. A ...

随机推荐

  1. C#中的异常处理

    C#中的异常处理 while (ex != null) { WriteExceptionLog(ex, fileName); ex = ex.InnerException; } /// <sum ...

  2. ERP 能够做什么

    1. ERP 能解决既有物料短缺又有库存积压的库存管理难题 企业在管理库存问题上,经常处于两难之中. 要多存物料,肯定会积压资金:少存物料,又怕物料短缺,影响生产. 这样,物料的短缺和库存积压总是同时 ...

  3. @Component("userService").@Resource(name="userDao")

    @Component("userService") public class UserService { private UserDAO userDao; public void ...

  4. CSS+DIV之强化background属性

    1.背景颜色属性(background-color),设定背景颜色=html中bgcolor属性.我来写一个红色背景的body,(也可以定义某个特定区域) 示例写法:body {} 2.背景图片属性( ...

  5. Git branch (分支学习)

    以前总结的一些git操作,分享在这里. Git 保存的不是文件差异或者变化量,而只是一系列文件快照.   - 列出当前所有分支 git branch <--merge> | <--n ...

  6. Eclipse 卸载插件

    直奔主题,不罗嗦! 1.help 2.about eclipse 3. 点击Installation Details 4.选中你安装的插件点击Uninstall... 5.从新启动,OK.

  7. 【原】Spark中Stage的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Job如何划分为Stage http://www.cnblogs.com/yourarebest/p/5342424.html 1 ...

  8. LCD platform_device(s5pv210)

    devs.c:   static struct resource s3cfb_resource[] = { [0] = { .start= S5P_PA_LCD, .end= S5P_PA_LCD + ...

  9. linux获取目录下文件

    查看当前目录下的文件: find . -type f 查看当前目录下的文件夹: find . -type d 如果文件file1不为空: if [ -s file1 ];then      echo  ...

  10. Codeforces Round #343 (Div. 2) D - Babaei and Birthday Cake 线段树+DP

    题意:做蛋糕,给出N个半径,和高的圆柱,要求后面的体积比前面大的可以堆在前一个的上面,求最大的体积和. 思路:首先离散化蛋糕体积,以蛋糕数量建树建树,每个节点维护最大值,也就是假如节点i放在最上层情况 ...