我一个月前就开始使用Android版的YouTube API了。我正在尝试制作一个Android应用程序,可以播放一些视频,其中包括我上传的视频。有了公共视频,它就起作用了。但在私人视频中,YoutubePlayerView显示:"请登录"。
我不知道如何登录和播放这些视频,因为YoutubeAndroidPlayerAPI似乎不支持身份验证。
这就是我正在做的"JurB9k3_Ws4"是我的私人视频ID。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.playerview_demo);
YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
youTubeView.initialize(DeveloperKey.DEVELOPER_KEY, new YouTubePlayer.OnInitializedListener() {
@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer,
boolean b) {
youTubePlayer.cueVideo("JurB9k3_Ws4");
}
@Override
public void onInitializationFailure(YouTubePlayer.Provider provider,
YouTubeInitializationResult youTubeInitializationResult) {
}
});
}
这在Android Player API中是不可能的。在设备上播放私人视频的唯一方法是在应用程序中实现WebView,让用户登录到他们的YouTube帐户,然后在中仅在特定浏览器会话中播放私人视频。YouTube建议将视频标记为"未登录"而非"私人",以便在移动设备上播放。
关于使用嵌入式播放器播放私人视频的更多信息,请参阅此谷歌群组帖子。
只有在以下情况下,才能在嵌入式播放器中播放私人视频您的浏览器中有一个YouTube登录cookie,对应于被允许观看该视频的帐户。否则,它将失败使用数据API进行身份验证与是否您可以在嵌入式播放器中播放视频。
没有程序化的方法来创建登录cookie。用户实际上必须使用相同的浏览器实例登录YouTube.com这是在使用嵌入,而且无法编写脚本。
只要你的应用程序使用誓言并经过验证,你就可以构建和播放私人播放列表,就好像你是[该帐户]的用户一样。使用youtube v3 api和.player api。如果由于任何原因没有正确验证,您可能会遇到这样的情况:api允许您作为帐户的用户创建一个私人播放列表,但播放器api中的列表是空的。
此外,你还可以播放私人视频:
@SuppressLint("StaticFieldLeak")
private void loadUploadedVideos() {
if (mChosenAccountName == null) {
return;
}
Log.d(TAG, "loadUploads");
showProgressDialog();
new AsyncTask<Void, Void, List<VideoData>>() {
@Override
protected List<VideoData> doInBackground(Void... voids) {
try {
YouTube youtube = new YouTube.Builder(transport, jsonFactory,
credential).setApplicationName(Constants.APP_NAME)
.build();
/*
* Now that the user is authenticated, the app makes a
* channels list request to get the authenticated user's
* channel. Returned with that data is the playlist id for
* the uploaded videos.
* https://developers.google.com/youtube
* /v3/docs/channels/list
*/
ChannelListResponse clr = youtube.channels()
.list("contentDetails").setMine(true).execute();
// Get the user's uploads playlist's id from channel list
// response
String uploadsPlaylistId = clr.getItems().get(0)
.getContentDetails().getRelatedPlaylists()
.getUploads();
List<VideoData> videos = new ArrayList<VideoData>();
// Get videos from user's upload playlist with a playlist
// items list request
PlaylistItemListResponse pilr = youtube.playlistItems()
.list("id,contentDetails")
.setPlaylistId(uploadsPlaylistId)
.setMaxResults(50L).execute();
List<String> videoIds = new ArrayList<String>();
// Iterate over playlist item list response to get uploaded
// videos' ids.
for (PlaylistItem item : pilr.getItems()) {
videoIds.add(item.getContentDetails().getVideoId());
}
// Get details of uploaded videos with a videos list
// request.
VideoListResponse vlr = youtube.videos()
.list("id,snippet,status")
.setId(TextUtils.join(",", videoIds)).execute();
// Add only the public videos to the local videos list.
for (Video video : vlr.getItems()) {
//if ("public".equals(video.getStatus().getPrivacyStatus())) {
VideoData videoData = new VideoData();
videoData.setVideo(video);
videos.add(videoData);
//}
}
// Sort videos by title
Collections.sort(videos, new Comparator<VideoData>() {
@Override
public int compare(VideoData videoData,
VideoData videoData2) {
return videoData.getTitle().compareTo(
videoData2.getTitle());
}
});
return videos;
} catch (final GooglePlayServicesAvailabilityIOException availabilityException) {
showGooglePlayServicesAvailabilityErrorDialog(availabilityException
.getConnectionStatusCode());
} catch (UserRecoverableAuthIOException userRecoverableException) {
startActivityForResult(
userRecoverableException.getIntent(),
REQUEST_AUTHORIZATION);
} catch (IOException e) {
Utils.logAndShow(MainActivity.this, Constants.APP_NAME, e);
}
catch (Exception e) {
Log.e(TAG, e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(List<VideoData> videos) {
if (videos == null) {
hideProgressDialog();
return;
}
if (mMyUploadsFragment != null)
mMyUploadsFragment.setUploads(videos);
hideProgressDialog();
}
}.execute((Void) null);
}
同样,一旦经过验证,youtube的主要功能就可以在播放器api中使用。美好的诀窍似乎是让Youtube用户在手机上登录到Youtube应用程序,并在自己的应用程序中使用相同的信用。
无论如何,该应用程序经过验证可以在android上播放的任何播放列表都可以这样播放:
public void onPlaylistSelected(PlaylistData playlist) {
try {
mPlaylistData = playlist;
//Intent intent = YouTubeIntents.createPlayPlaylistIntent(this, playlist.getId());
Intent intent = YouTubeIntents.createOpenPlaylistIntent(this, playlist.getId());
startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.w(TAG,e.getMessage());
Toast.makeText(this, R.string.warn_install_yt,Toast.LENGTH_LONG).show();
}
}