You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:22:20