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

时间:2015-11-28 08:59:18

标签: android youtube youtube-api youtube-data-api android-youtube-api

我的服务器将videoID列表发送给Android。现在,我想在列表视图中显示这些视频的标题,缩略图和评论数量。我在网上使用GET请求https://www.googleapis.com/youtube/v3/videos?part=snippet&id={VIDEO_ID}&key={YOUR_API_KEY}完成了此操作但是如何在Android中执行此操作?是否有任何YouTube SDK来初始化YouTube对象?如何使用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.
}

3 个答案:

答案 0 :(得分:1)

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

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

第二个库更通用(虽然有separate instructions for using it on Android)并提供了围绕YouTube的Data API的包装,以便更轻松地与它进行交互。因此,它允许您基本上完成您也可以使用Web API执行的所有操作。因此,它解决了与Android Player API不同的问题,如果您想要完全控制在自己的UI中显示视频数据的方式,则更有可能实现这一目标。

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

答案 1 :(得分:1)

参考我的帖子here。我只是为我的项目尝试了这个方法,它的工作非常好。 您不需要上述代码或任何google api jar导入。只需用您的HTTP请求替换HTTP请求。

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

答案 2 :(得分:0)

试试这个:

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();
      }
  }
  

并且不要忘记从另一个线程中调用它:

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