使用YoutubeAndroidPlayerAPI中的YoutubePlayerView播放私人YouTube视频



我一个月前就开始使用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();
    }
}

相关内容

  • 没有找到相关文章

最新更新