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

Posted

技术标签:

【中文标题】使用 YoutubeAndroidPlayerAPI 中的 YoutubePlayerView 播放私人 YouTube 视频?【英文标题】:Play private YouTube video using YoutubePlayerView from YoutubeAndroidPlayerAPI? 【发布时间】:2015-12-26 11:19:43 【问题描述】:

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

        
    );

【问题讨论】:

【参考方案1】:

Android Player API 无法做到这一点。在设备上播放私人视频的唯一方法是在您的应用中实现 WebView,让用户登录其 YouTube 帐户,然后在仅在特定浏览器会话中播放私人视频。 YouTube 建议将视频标记为不公开而不是私有,以便在移动设备上播放。

this Google Groups post 中有关使用嵌入式播放器播放私人视频的更多信息。

只有在以下情况下才能在嵌入式播放器中播放私人视频 您的浏览器中有一个 YouTube 登录 cookie,对应于 有权观看该视频的帐户。否则会 失败。使用 Data API 进行身份验证与是否 您可以在嵌入式播放器中播放视频。

...

没有编程方式来创建登录 cookie。用户 实际上必须使用相同的浏览器实例登录 YouTube.com 那是使用嵌入,不能编写脚本。

【讨论】:

非常感谢,您拯救了我的一天。无论如何,为什么 Google 不为我们提供一种使用 PlayerAPI 进行身份验证的方法?在 Android 应用程序中使用 WebView 只是为了播放 youtube 视频很奇怪 :( @user1992438 我不知道他们为什么不提供这个“基本”功能。我会直接联系 YouTube 并表达您的担忧。如果其他开发人员想要相同的功能,他们可能会实现它。 感谢日航。我希望有一天能看到这个有用的功能。【参考方案2】:

只要您的应用使用 oath 并且经过验证,您就可以构建和播放私有播放列表,就好像您是该帐户的用户一样 [for that account]。使用 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);

同样,一旦通过身份验证,播放器 api 中就可以使用 youtube 的主要功能。好的。诀窍似乎是将 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();
    

【讨论】:

以上是关于使用 YoutubeAndroidPlayerAPI 中的 YoutubePlayerView 播放私人 YouTube 视频?的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)