如何在Android Studio中使用YouTube API列出视频及频道视频?
嘿,我来帮你搞定这个需求!你已经有了API密钥和YouTubePlayerApi的基础,接下来咱们分两步走:先说说怎么通用地列出视频,再聚焦指定频道的视频获取——其实核心要用到YouTube Data API(因为YouTubePlayerApi主要负责播放,视频列表得靠Data API来拉取)。
一、通过YouTube Data API列出视频(通用搜索场景)
第一步:添加必要依赖
在你的app模块的build.gradle(Module级别)里添加Data API的依赖:
dependencies { // YouTube Data API v3 implementation 'com.google.apis:google-api-services-youtube:v3-rev20240505-2.0.0' // Google HTTP客户端适配Android implementation 'com.google.http-client:google-http-client-android:1.43.3' // Gson解析器 implementation 'com.google.code.gson:gson:2.10.1' }
别忘了在AndroidManifest.xml里加网络权限:
<uses-permission android:name="android.permission.INTERNET"/>
第二步:初始化YouTube服务实例
在代码里创建Data API的服务对象,用你的API密钥授权:
import com.google.api.services.youtube.YouTube; import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.json.gson.GsonFactory; // 初始化YouTube服务 YouTube youtubeService = new YouTube.Builder( new NetHttpTransport(), GsonFactory.getDefaultInstance(), null ) .setApplicationName("你的应用名称") // 随便填个你的App名字就行 .build();
第三步:发起搜索请求获取视频列表
比如你想搜索关键词“Android开发教程”的视频,就可以这么写(注意要在子线程执行,别卡主线程!):
new Thread(() -> { try { // 构建搜索请求,指定返回字段、视频类型、API密钥 YouTube.Search.List searchRequest = youtubeService.search().list("id,snippet"); searchRequest.setKey("你的API密钥"); // 替换成你自己的API密钥 searchRequest.setQ("Android开发教程"); // 替换成你要搜索的关键词 searchRequest.setType("video"); // 只返回视频结果,排除频道、播放列表 searchRequest.setMaxResults(20); // 最多返回20条,上限是50 // 执行请求拿到响应 SearchListResponse response = searchRequest.execute(); List<SearchResult> videoResults = response.getItems(); // 遍历结果提取视频信息 for (SearchResult result : videoResults) { String videoId = result.getId().getVideoId(); // 视频ID,用来播放 String title = result.getSnippet().getTitle(); // 视频标题 String thumbnailUrl = result.getSnippet().getThumbnails().getDefault().getUrl(); // 缩略图 // 这里可以把数据存到列表,然后回到主线程更新UI Log.d("YouTubeVideo", "ID: " + videoId + " | 标题: " + title); } } catch (IOException e) { e.printStackTrace(); // 处理异常:比如网络错误、API密钥无效、配额用完了 } }).start();
二、列出指定YouTube频道的视频
要拉取指定频道的所有上传视频,步骤会多一步:先拿到频道的“上传播放列表ID”,再通过这个播放列表ID获取视频。
第一步:获取目标频道的上传播放列表ID
有两种方式拿到这个ID:
- 如果你知道频道的ID(比如UC开头的字符串):
new Thread(() -> { try { YouTube.Channels.List channelRequest = youtubeService.channels().list("contentDetails"); channelRequest.setKey("你的API密钥"); channelRequest.setId("UC_x5XG1OV2P6uZZ5FSM9Ttw"); // 替换成目标频道ID ChannelsListResponse channelResponse = channelRequest.execute(); // 提取上传播放列表ID String uploadsPlaylistId = channelResponse.getItems().get(0) .getContentDetails() .getRelatedPlaylists() .getUploads(); // 拿到这个ID后,就可以去拉视频了,看下一步 } catch (IOException e) { e.printStackTrace(); } }).start();
- 如果你只知道频道的用户名(比如GoogleDevelopers):
new Thread(() -> { try { YouTube.Channels.List channelRequest = youtubeService.channels().list("contentDetails"); channelRequest.setKey("你的API密钥"); channelRequest.setForUsername("GoogleDevelopers"); // 替换成频道用户名 ChannelsListResponse channelResponse = channelRequest.execute(); String uploadsPlaylistId = channelResponse.getItems().get(0) .getContentDetails() .getRelatedPlaylists() .getUploads(); // 继续下一步拉视频 } catch (IOException e) { e.printStackTrace(); } }).start();
第二步:通过上传播放列表ID获取频道视频
拿到uploadsPlaylistId后,用PlaylistItems.list接口拉取视频:
new Thread(() -> { try { YouTube.PlaylistItems.List playlistRequest = youtubeService.playlistItems().list("snippet"); playlistRequest.setKey("你的API密钥"); playlistRequest.setPlaylistId(uploadsPlaylistId); // 刚才拿到的上传列表ID playlistRequest.setMaxResults(20); PlaylistItemsListResponse playlistResponse = playlistRequest.execute(); List<PlaylistItem> videoItems = playlistResponse.getItems(); // 遍历提取视频信息 for (PlaylistItem item : videoItems) { String videoId = item.getSnippet().getResourceId().getVideoId(); String title = item.getSnippet().getTitle(); String thumbnailUrl = item.getSnippet().getThumbnails().getHigh().getUrl(); // 处理数据,更新UI Log.d("ChannelVideo", "ID: " + videoId + " | 标题: " + title); } } catch (IOException e) { e.printStackTrace(); } }).start();
几个关键注意事项
- API配额限制:YouTube Data API有每日配额(默认10000单位),不同请求消耗不同配额(比如搜索请求是100单位/次,频道信息请求是1单位/次),别频繁调用,不然会被限制。
- 线程处理:所有API请求必须在子线程执行,Android 11+不允许主线程发网络请求,你也可以用Coroutine(Kotlin)或者AsyncTask(不推荐,已过时)来处理异步。
- API密钥安全:一定要在Google Cloud控制台限制你的API密钥的使用范围(比如绑定你的App包名和SHA-1指纹),防止密钥被盗用。
- 播放视频:拿到
videoId后,就可以用你已经集成的YouTubePlayerApi来播放了,比如用YouTubePlayerView.loadVideo(videoId)。
内容的提问来源于stack exchange,提问作者B.Tibell




