如何使用Token上传视频至YouTube?求Android端实现示例代码
使用Token上传视频到YouTube(Android端实现)
嗨,很高兴你已经搞定iOS端的实现了!针对Android端用Token上传视频到YouTube,我会给你一个完整的示例,主要基于YouTube Data API v3来实现,下面是具体步骤和代码:
前置准备
- 确保你已经在Google Cloud Console启用了YouTube Data API v3,并且拥有有效的OAuth 2.0 Token(必须包含
https://www.googleapis.com/auth/youtube.upload权限) - 在你的Android项目的Module级别build.gradle中添加必要依赖:
dependencies { // YouTube Data API客户端库 implementation 'com.google.apis:google-api-services-youtube:v3-rev222-1.25.0' // Google HTTP客户端适配Android implementation 'com.google.http-client:google-http-client-android:1.40.1' // JSON解析依赖 implementation 'com.google.code.gson:gson:2.8.9' }
核心上传代码示例
下面是封装好的上传工具类,直接传入你的Token就能初始化服务,然后调用上传方法即可:
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential; import com.google.api.client.googleapis.json.GoogleJsonResponseException; import com.google.api.client.http.FileContent; import com.google.api.client.http.HttpTransport; import com.google.api.client.http.android.AndroidHttp; import com.google.api.client.json.JsonFactory; import com.google.api.client.json.gson.GsonFactory; import com.google.api.services.youtube.YouTube; import com.google.api.services.youtube.model.Video; import com.google.api.services.youtube.model.VideoSnippet; import com.google.api.services.youtube.model.VideoStatus; import com.google.api.client.googleapis.media.MediaHttpUploader; import com.google.api.client.googleapis.media.MediaHttpUploaderProgressListener; import java.io.File; import java.io.IOException; public class YouTubeVideoUploader { private final YouTube youtubeService; // 根据你的视频类型修改MIME类型,比如MP4用"video/mp4" private static final String VIDEO_MIME_TYPE = "video/mp4"; public YouTubeVideoUploader(String accessToken) { // 初始化HTTP传输和JSON工厂 HttpTransport httpTransport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = GsonFactory.getDefaultInstance(); // 用已有Token创建凭证 GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(null, "https://www.googleapis.com/auth/youtube.upload"); credential.setAccessToken(accessToken); // 构建YouTube服务实例 youtubeService = new YouTube.Builder(httpTransport, jsonFactory, credential) .setApplicationName("你的应用名称") // 替换成你的应用名称 .build(); } /** * 上传视频到YouTube * @param videoFile 本地视频文件 * @param title 视频标题 * @param description 视频描述 * @param tags 视频标签数组 * @return 上传后的视频ID * @throws IOException 上传过程中的IO或API异常 */ public String uploadVideo(File videoFile, String title, String description, String[] tags) throws IOException { try { // 1. 创建视频元数据Snippet VideoSnippet snippet = new VideoSnippet(); snippet.setTitle(title); snippet.setDescription(description); snippet.setTags(java.util.Arrays.asList(tags)); // 2. 设置视频状态(隐私选项:public/private/unlisted) VideoStatus status = new VideoStatus(); status.setPrivacyStatus("private"); // 可以根据需求修改 // 3. 组装完整的Video对象 Video video = new Video(); video.setSnippet(snippet); video.setStatus(status); // 4. 准备待上传的文件内容 FileContent mediaContent = new FileContent(VIDEO_MIME_TYPE, videoFile); // 5. 创建上传请求并设置进度监听 YouTube.Videos.Insert insertRequest = youtubeService.videos().insert("snippet,status", video, mediaContent); insertRequest.setProgressListener(new MediaHttpUploaderProgressListener() { @Override public void progressChanged(MediaHttpUploader uploader) throws IOException { switch (uploader.getUploadState()) { case INITIATION_STARTED: System.out.println("上传初始化开始"); break; case INITIATION_COMPLETE: System.out.println("上传初始化完成"); break; case MEDIA_IN_PROGRESS: // 这里可以获取上传进度,用于更新UI double progressPercent = uploader.getProgress() * 100; System.out.println("上传进度: " + String.format("%.2f", progressPercent) + "%"); break; case MEDIA_COMPLETE: System.out.println("视频文件上传完成"); break; case NOT_STARTED: System.out.println("上传未启动"); break; } } }); // 执行上传并返回视频ID Video uploadedVideo = insertRequest.execute(); return uploadedVideo.getId(); } catch (GoogleJsonResponseException e) { System.err.println("YouTube API错误详情: " + e.getDetails().getMessage()); throw e; } catch (IOException e) { System.err.println("上传IO错误: " + e.getMessage()); throw e; } } }
调用示例(在Activity中使用)
注意上传是耗时操作,必须在后台线程执行,不能阻塞主线程:
import android.os.Environment; import android.os.Bundle; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import java.io.File; import java.io.IOException; public class UploadActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_upload); // 替换成你的本地视频路径和有效Token File videoFile = new File(Environment.getExternalStorageDirectory() + "/demo_video.mp4"); String validAccessToken = "你的OAuth2 AccessToken"; // 初始化上传器 YouTubeVideoUploader uploader = new YouTubeVideoUploader(validAccessToken); // 在后台线程执行上传 new Thread(() -> { try { String videoId = uploader.uploadVideo( videoFile, "我的测试视频", "这是通过Android Token上传的YouTube视频", new String[]{"Android", "YouTube上传", "测试"} ); // 上传成功后回到主线程更新UI runOnUiThread(() -> { Toast.makeText(UploadActivity.this, "上传成功!视频ID: " + videoId, Toast.LENGTH_LONG).show(); }); } catch (IOException e) { e.printStackTrace(); runOnUiThread(() -> { Toast.makeText(UploadActivity.this, "上传失败: " + e.getMessage(), Toast.LENGTH_LONG).show(); }); } }).start(); } }
关键注意事项
- 权限校验:你的AccessToken必须包含
https://www.googleapis.com/auth/youtube.upload授权范围,否则会返回403权限不足错误 - Token有效期:OAuth2 AccessToken有过期时间,若过期需要用Refresh Token重新获取新的AccessToken
- 文件访问权限:Android 10及以上版本,需要申请
MANAGE_EXTERNAL_STORAGE权限或者通过MediaStore访问视频文件,避免文件读取失败 - 后台执行:上传操作属于耗时IO任务,必须放在后台线程(比如Thread、Coroutine、AsyncTask)中执行,否则会触发ANR
- 依赖版本:示例中的依赖版本可以根据Google官方文档更新到最新稳定版
内容的提问来源于stack exchange,提问作者podgradle
相关产品推荐
相关产品推荐

