如何通过 Android 中的 Data API v3.0 使用 videoID 从 youtube 检索单个视频的详细信息?

How to retrieve details of single video from youtube using videoID through Data API v3.0 in Android?

我的服务器将视频 ID 列表发送到 Android。现在,我想在列表视图中显示这些视频的标题、缩略图和评论数。我已经在 Web 中使用 https://www.googleapis.com/youtube/v3/videos?part=snippet&id={VIDEO_ID}&key={YOUR_API_KEY} 的 GET 请求完成了此操作,但如何在 Android 中执行此操作?是否有任何 YouTube SDK 来初始化 YouTube object?如何使用 VideoID 从 YouTube 检索此信息?

编辑:我找到了一种使用 YouTube Data API Client Library for Java 的方法,但它在没有任何解释的情况下给出了运行时错误。

这是我使用的代码

/**
 * Define a global instance of a Youtube object, which will be used
 * to make YouTube Data API requests.
 */
private static YouTube youtube;

youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer(){
        public void initialize(com.google.api.client.http.HttpRequest request) throws IOException {
        }
    }).setApplicationName("youtube-cmdline-search-sample").build();

// Call the YouTube Data API's videos.list method to retrieve videos.
    VideoListResponse videoListResponse = youtube.videos().
        list("snippet").setId(videoId).execute();

    // Since the API request specified a unique video ID, the API
    // response should return exactly one video. If the response does
    // not contain a video, then the specified video ID was not found.
    List<Video> videoList = videoListResponse.getItems();
    if (videoList.isEmpty()) {
        System.out.println("Can't find a video with ID: " + videoId);
        return;
    }
    Video video = videoList.get(0)
    // Print information from the API response.
}

YouTube 提供(至少)两个与您的问题相关的官方库:

顾名思义,第一个库是专门为 Android 平台开发的。它的重点是通过提供播放器框架使您能够将视频播放功能整合到应用程序中。如果您的目标是让用户能够简单地播放 YouTube 视频,那么可能是最容易实现的。请注意,此库需要在设备上安装官方 YouTube 应用程序。

第二个库更通用(尽管有 separate instructions for using it on Android)并提供了 YouTube 数据的包装器 API 以使其更容易连接。因此,它基本上可以让你做所有你也可以用网络做的事情API。因此,它解决了与 Android 播放器 API 不同的问题,如果您想完全控制如何在自己的播放器 UI 中显示视频数据,则更有可能采用这种方式。

您的第三个选择是完全按照您为基于 Web 的解决方案所做的操作:让 API 调用您自己,解析响应并将相关数据绑定到您的 UI 组件.各种网络库(即 Retrofit)可以大大简化这个过程。

参考我的posthere。我刚刚为我的项目尝试了这种方法,效果非常好。 您不需要上述代码或任何 google api jar 导入。只需将 HTTP 请求替换为您的 HTTP 请求即可。

输出在 JSON 中返回,您可以使用 JSON 解析器 jar 检索标题、缩略图和您可能需要的其他详细信息,正如我在此处的回答中所述。

试试这个:

protected void requestYoutubeVideos(String text) {
      try {
          youtube = new YouTube.Builder(new NetHttpTransport(), new JacksonFactory(), new HttpRequestInitializer() {
              public void initialize(HttpRequest request) throws IOException {
              }
          }).setApplicationName("My app name").build();

          // Define the API request for retrieving search results.
          YouTube.Search.List query = youtube.search().list("id");

          // Set your developer key from the Google Cloud Console for
          // non-authenticated requests. See:
          // https://cloud.google.com/console
          query.setKey(YOUTUBE_API_KEY);
          query.setQ(text);
          query.setMaxResults(NUMBER_OF_VIDEOS_RETURNED);

          // To increase efficiency, only retrieve the fields that the
          // application uses.
          query.setFields("items(id)");
          query.setOrder("viewCount");

          // Restrict the search results to only include videos. See:
          // https://developers.google.com/youtube/v3/docs/search/list#type
          query.setType("video");

          SearchListResponse searchResponse = query.execute();
          List<SearchResult> list = searchResponse.getItems();
          Log.e("Youtube search", "list ===> " + list);

          //Get Info for each video id
          for (SearchResult video: list) {
              youtubeList.add(video);

              YouTube.Videos.List query2 = youtube.videos().list("id,contentDetails,snippet,statistics").setId(video.getId().getVideoId());
              query2.setKey(YOUTUBE_API_KEY);
              query2.setMaxResults((long) 1);
              query2.setFields("items(id,contentDetails,snippet,statistics)");

              VideoListResponse searchResponse2 = query2.execute();
              List<Video> listEachVideo = searchResponse2.getItems();
              Video eachVideo = listEachVideo.get(0);

          }

      } catch (GoogleJsonResponseException e) {
          Log.e("Youtube search", "There was a service error: " + e.getDetails().getCode() + " : "
                  + e.getDetails().getMessage());
      } catch (IOException e) {
          Log.e("Youtube search", "There was an IO error: " + e.getCause() + " : " + e.getMessage());
      } catch (Throwable t) {
          t.printStackTrace();
      }
  }

and do not forget to call it from another thread:

 new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            requestYoutubeVideos("Harry el Sucio Potter");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}).start();