YouTube API在Android上的使用

本文章的需求是在Android上实现一个YouTube播放器,利用YouTube API 获取视频列表及视频信息。
方案一:使用Android Player API,此方案可实现YouTube视频本地播放,但需要安装YouTube Android App,不需要GMS服务。
方案二:使用GMS服务登陆及获取视频列表及视频信息,参考API,不需要安装YouTube Android App,Webview播放。
方案三:使用OAuth 2.0 认证登陆,参考API,不需要安装YouTube Android App,不需要GMS服务,Webview播放。

方案一

下载 YouTube Android API Demo,更改DeveloperKey即可。如果没有安装YouTube,此时运行Demo时会提示用户安装。注意:YouTube app运行需要GMS服务,
但此方案只需要有YouTube的壳即可,不需要GMS服务。
方案一
其中Developer Key,参考官方API文档,在这里创建API Key

方案二

可以参考这个博客做修改
其中Developer Key,在这里创建为OAuth 2.0 client ID,类型为Android
注意:AndroidManifest.xml 中要填写这里注册的包名;
打包时,Generate Signed APK->Key store path(填写这里使用的签名文件)
方案二

方案三

考虑到既不想装YouTube App,又不想用GMS服务,可以考虑纯网页OAuth认证方式,只需要第一次登陆Google账户
其中Developer Key,在这里创建为OAuth 2.0 client ID,类型为网页应用
根据参考API获取token,之后每次请求在URL后面加入access_token=获取到的token。
在Webview中播放时,如果要对播放进行控制,可使用IFrame API,使用webview 调用js代码进行控制,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
<head>
<!-- page title -->
<title>YouTube Player</title>
<!-- This code loads the iFrame Player API code asynchronously.-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<script src = "https://www.youtube.com/iframe_api"></script>
<!-- This is the source of the Javscript for the demo -->
<script language="JavaScript" type="text/javascript" src="file:///android_asset/demo.js"></script>
<link rel="stylesheet" type="text/css" href="file:///android_asset/theme.css">
</head>
<body onload="playVideo();">
<!-- The iframe video player will replace this <div> tag. -->
<div id="player" class="full-size"></div>
<!-- just for test -->
<!--<br/>
<button onClick="loadNewVideo('hDoAxehFvn8')">Load</button>
<button onClick="cueNewVideo('hDoAxehFvn8')">Cue</button>
<button onClick="playPauseVideo()">Play/Pause</button>
<button onClick="stopVideo()">Stop</button>-->
<!-- rang from 1 to 100 -->
<!-- <button onClick="volumeUp()">Volume up</button>
<button onClick="volumeDown()">Volume down</button>
<button onClick="fastForward()">Forward</button>
<button onClick="fastRewind()">Rewind</button>
<button onClick="mute()">Mute</button>
<button onClick="unmute()">Unmute</button> -->
</body>
</html>

js的代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
var player;
var isPlaying;
// Callback for when the YouTube iFrame player is ready
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
// Set Player height and width
height: '100%',
width: '100%',
// Set the id of the video to be played
//videoId: 'M7lc1UVf-VE',
// Setup event handelers
events: {
'onReady': onPlayerReady,
'onError': onError,
'onApiChange': onApiChange,
}
});
};
// Event Handlers
function onError(error){
// Update errors on page
console.log("Error!");
};
function onApiChange(event){
// Update currently availbe APIs
console.log("API Change!");
};
function onPlayerReady(){
// Update page after player is ready
playVideo();
isPlaying = true;
}
// Functions to invoke user requested action through the iFrame API
function loadNewVideo(vid){
console.log('loadNewVideo:',vid);
player.loadVideoById(vid);
};
function cueNewVideo(vid){
player.cueVideoById(vid);
};
function playPauseVideo(){
console.log('isplaying:',isPlaying);
if (isPlaying) {
pauseVideo();
}else{
playVideo();
}
isPlaying = !isPlaying;
};
function playVideo(){
player.playVideo();
};
function pauseVideo(){
player.pauseVideo();
};
function stopVideo(){
player.stopVideo();
};
function fastForward(){
if ((player.getCurrentTime() + 5) < player.getDuration()) {
seekTo(player.getCurrentTime() + 5);
}else{
seekTo(player.getDuration());
}
//console.log('currentTime:', player.getCurrentTime(), 'duration:', player.getDuration());
};
function fastRewind(){
if ((player.getCurrentTime() - 5) > 0) {
seekTo(player.getCurrentTime() - 5);
}else{
seekTo(0);
}
};
function seekTo(seek){
player.seekTo(seek);
};
function volumeDown(){
if ((player.getVolume() - 10) < 1) {
setVolume(1);
}else{
setVolume(player.getVolume() - 10);
}
};
function volumeUp(){
if ((player.getVolume() + 10) > 100) {
setVolume(100);
}else{
setVolume(player.getVolume() + 10);
}
};
function setVolume(volume){
player.setVolume(volume);
};
function mute(){
player.mute();
};
function unmute(){
player.unMute();
};
/*function setQuality(){
player.setPlaybackQuality(document.getElementById("qualityOption").value);
};
function setRate(){
player.setPlaybackRate(document.getElementById("rateOption").value);
};*/

方案三