You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过REST API下载谷歌云端硬盘公开共享文件及Android端ACCESS_TOKEN获取

解答:Google Drive公开文件的REST API下载及Android实现

Hey there! Let's tackle your questions one by one, since you're looking to download publicly shared Google Drive files via REST API, specifically in Android:

1. 如何通过REST API下载Google Drive公开共享文件?

首先明确:公开共享且允许下载的文件,完全不需要用户授权(也就是不需要Authorization: Bearer <ACCESS_TOKEN>头),有两种简单的实现方式:

方式一:直接使用公开下载链接

这是最简便的方法,不需要依赖Drive API,只要知道文件ID就能构造链接:

https://drive.google.com/uc?export=download&id=你的文件ID

直接对这个URL发起GET请求,就能获取文件的字节流,保存到本地即可。注意要确保文件的共享权限是「任何人都能查看/下载」(如果仅设置为「查看」,可能无法直接下载)。

方式二:使用Drive API v3(带API_KEY)

如果你想通过官方API接口下载,也不需要用户的AccessToken,而是用Google Cloud Console中生成的API_KEY作为URL参数:

GET https://www.googleapis.com/drive/v3/files/你的文件ID?alt=media&key=你的API_KEY

API_KEY用于访问公开的Google服务数据,不需要用户授权,适合这类公开文件场景。

2. Android中能否通过REST API下载?以及AccessToken的疑问

当然可以在Android中实现,下面针对两种方式给你代码示例(以OkHttp为例,你也可以用Retrofit等其他网络库):

示例1:用公开下载链接下载

// 初始化OkHttp客户端
OkHttpClient client = new OkHttpClient();
String fileId = "0B9jNhSvVjoIVM3dKcGRKRmVIOVU";
String downloadUrl = "https://drive.google.com/uc?export=download&id=" + fileId;

Request request = new Request.Builder()
        .url(downloadUrl)
        .build();

// 异步发起请求
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 处理下载失败的情况,比如提示用户
        e.printStackTrace();
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            // 获取文件输入流
            InputStream inputStream = response.body().byteStream();
            // 将流写入本地文件(示例:保存到内部存储)
            FileOutputStream outputStream = getApplicationContext().openFileOutput("downloaded_file.ext", Context.MODE_PRIVATE);
            
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, length);
            }
            
            // 关闭流
            outputStream.flush();
            outputStream.close();
            inputStream.close();
        } else {
            // 处理响应失败的情况
        }
    }
});

示例2:用Drive API v3(带API_KEY)下载

OkHttpClient client = new OkHttpClient();
String apiKey = "你的API_KEY"; // 从Google Cloud Console获取
String fileId = "0B9jNhSvVjoIVM3dKcGRKRmVIOVU";
String apiUrl = String.format("https://www.googleapis.com/drive/v3/files/%s?alt=media&key=%s", fileId, apiKey);

Request request = new Request.Builder()
        .url(apiUrl)
        .build();

// 后续的回调处理和示例1完全一致,获取输入流并保存即可
client.newCall(request).enqueue(new Callback() {
    // ... 同上的失败/成功处理逻辑
});

关于AccessToken的说明

你提到的Authorization: Bearer <ACCESS_TOKEN>是用于访问用户私有Drive数据的场景(比如读取用户自己的文件),需要用户授权后获取短期令牌。但对于公开共享的文件,完全不需要这个流程——你不用去获取AccessToken,直接用上面的两种方式就能下载,更简单高效。

另外,你之前生成的credentials.xml是快速入门中用于用户授权流程的配置,针对公开文件场景用不上,可以不用管它。

内容的提问来源于stack exchange,提问作者imin

火山引擎 最新活动