Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java获取YouTube播放列表的所有视频_Java_Android_Youtube Api_Playlist_Youtube Data Api - Fatal编程技术网

用Java获取YouTube播放列表的所有视频

用Java获取YouTube播放列表的所有视频,java,android,youtube-api,playlist,youtube-data-api,Java,Android,Youtube Api,Playlist,Youtube Data Api,Context我正在使用Android Studio(Java)。我想获得给定播放列表的所有视频(或50个,我将在之后获得所有其他视频) 问题我看到人们使用类似url的 https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=PLiEwZfNgb4fVrRzTonlVEMj6DB2Nmzg2M&key=AIzaSyC2_YRcTE9916fsmA0_KRnef43GbLzz

Context我正在使用Android Studio(Java)。我想获得给定播放列表的所有视频(或50个,我将在之后获得所有其他视频)

问题我看到人们使用类似url的
https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=PLiEwZfNgb4fVrRzTonlVEMj6DB2Nmzg2M&key=AIzaSyC2_YRcTE9916fsmA0_KRnef43GbLzz8m0
但我不知道如何在Java中实现这一点。我跟着一些芭蕾舞,我得到了一种完全不同的信息获取方式,比如:

YouTube.Search.List query;
query = youtube.search().list("id,snippet");
      query.setKey(MY_API_KEY);
      query.setMaxResults((long)20);
      query.setType("video");
      query.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url)");
我真的不明白,除了搜索,我怎么能得到别的东西。 大多数文档仅用英文

编辑 好的,所以我继续尝试,我想我得到了一个近似的解决方案,但我得到了一个错误

private YouTube youtube;
private YouTube.PlaylistItems.List playlistItemRequest;
private String PLAYLIST_ID = "PLiEwZfNgb4fVrRzTonlVEMj6DB2Nmzg2M";
public static final String KEY = "AIzaSyC2_YRcTE9916fsmA0_KRnef43GbLzz8m0";

// Constructor
public YoutubeConnector(Context context)
{
    youtube = new YouTube.Builder(new NetHttpTransport(),
            new JacksonFactory(), new HttpRequestInitializer()
    {
        @Override
        public void initialize(HttpRequest hr) throws IOException {}
    }).setApplicationName(context.getString(R.string.app_name)).build();
}

public List<VideoItem> result()
{
    List<PlaylistItem> playlistItemList = new ArrayList<PlaylistItem>();
    try
    {
    /* HERE MUST BE MY PROBLEM ! */
        playlistItemRequest = youtube.playlistItems().list("snippet");
        playlistItemRequest.setPlaylistId(PLAYLIST_ID);
        playlistItemRequest.setFields("items(id/videoId,snippet/title,snippet/description,snippet/thumbnails/default/url),nextPageToken,pageInfo");
        playlistItemRequest.setKey(KEY);
        String nextToken = "";
        do {
            playlistItemRequest.setPageToken(nextToken);
            PlaylistItemListResponse playlistItemResult = playlistItemRequest.execute();

            playlistItemList.addAll(playlistItemResult.getItems());

            nextToken = playlistItemResult.getNextPageToken();
        } while (nextToken != null);
    }catch(IOException e)
    {
        Log.d("YC", "Could not initialize: "+e);
    }
//[...]
}

id/videoId
不存在。 有一个
id
和一个
snippet/resourceId/videoId

所以我猜你的设置域是不对的。

我知道这是一个老问题,但重要的是确定我们使用哪些资源来了解如何获得正确的信息。YouTube API v3中有许多资源,但我们通常使用
搜索
视频
播放列表
播放项目

根据文档,以下JSON结构显示了
playlitems
资源的格式:

{
  "kind": "youtube#playlistItem",
  "etag": etag,
  "id": string,
  "snippet": {
    "publishedAt": datetime,
    "channelId": string,
    "title": string,
    "description": string,
    "thumbnails": {
      (key): {
        "url": string,
        "width": unsigned integer,
        "height": unsigned integer
      }
    },
    "channelTitle": string,
    "playlistId": string,
    "position": unsigned integer,
    "resourceId": {
      "kind": string,
      "videoId": string,
    }
  },
  "contentDetails": {
    "videoId": string,
    "startAt": string,
    "endAt": string,
    "note": string,
    "videoPublishedAt": datetime
  },
  "status": {
    "privacyStatus": string
  }
}
从这个结构中,我们可以假设有三种方法来获取
videoId
。但首先,了解如何定义资源的部分和字段很重要

要定义零件,我们使用以下代码:

YouTube.PlaylistItems.List list = youtube.playlistItems().list("snippet");
list.setFields("items(id/videoId,snippet/title,snippet/description," +
    "snippet/thumbnails/default/url)");
在前一行中,
“snippet”
标识了一个包含多个字段(或子属性)的属性,包括
标题
说明
位置
资源ID
,因此当我们设置
“snippet”
时,API的响应将包含所有这些子属性

现在,如果定义字段,我们还可以限制前面的属性。例如,在此代码中:

YouTube.PlaylistItems.List list = youtube.playlistItems().list("snippet");
list.setFields("items(id/videoId,snippet/title,snippet/description," +
    "snippet/thumbnails/default/url)");
如果调用
list.execute()
,它将显示一个错误,因为我们没有在零件属性中定义
id
。另外,根据JSON结构,
id
是一个字符串,不包含
videoId
作为子属性。啊!!,但是我们可以从
resourceId
中提取
videoId
-答案是肯定/否定-为什么会这样?来吧,Teo,JSON结构清楚地显示了这一点-是的,我可以看到,但文件上说:

如果
snippet.resourceId.kind
属性的值为
youtube#video
,则此属性将存在,并且其值将包含youtube用于唯一标识播放列表中视频的ID

这意味着有时可能不可用-那么,我们如何获得
视频ID
-我们可以将
id
contentDetails
添加到零件资源中。如果我们添加
id
,则定义如下字段:

YouTube.PlaylistItems.List list = youtube.playlistItems().list("id,snippet");
list.setFields("items(id,snippet/title,snippet/description," +
    "snippet/thumbnails/default/url)");
YouTube.PlaylistItems.List list = youtube.playlistItems()
    .list("snippet,contentDetails");
list.setFields("items(contentDetails/videoId,snippet/title,snippet/description," +
    "snippet/thumbnails/default/url)");
如果添加
contentDetails
,则定义如下字段:

YouTube.PlaylistItems.List list = youtube.playlistItems().list("id,snippet");
list.setFields("items(id,snippet/title,snippet/description," +
    "snippet/thumbnails/default/url)");
YouTube.PlaylistItems.List list = youtube.playlistItems()
    .list("snippet,contentDetails");
list.setFields("items(contentDetails/videoId,snippet/title,snippet/description," +
    "snippet/thumbnails/default/url)");

我希望这对你们有所帮助。

我不知道为什么网站和代码中的层次结构不同,但我是item/ContentDetails/VideoId。你的评论对我帮助很大,谢谢。我为你的问题添加了答案~希望你觉得有用