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

升级play-services至11.8.0后,DriveApi下载Google Drive文件的替代方案咨询

嘿,这个问题我前段时间刚踩过坑!升级到play-services 11.8.0之后,旧的Drive.DriveApi.getFile()确实被官方弃用了,现在推荐用更现代化的DriveFiles相关API来实现文件下载。下面是我亲测有效的替代方案:

替代方案:使用DriveFiles API实现文件下载

1. 调整依赖配置

首先建议不要引入整个play-services包(太臃肿),只引入Drive模块即可,确保build.gradle里的依赖是:

dependencies {
    implementation 'com.google.android.gms:play-services-drive:11.8.0'
}

2. 初始化Drive客户端

旧的GoogleApiClient现在逐步被DriveClient和DriveResourceClient替代,先在你的Activity/Fragment里初始化这两个客户端:

private DriveClient mDriveClient;
private DriveResourceClient mDriveResourceClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 假设已经完成GoogleSignIn授权,获取当前登录账户
    GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
    if (account != null) {
        mDriveClient = Drive.getDriveClient(getApplicationContext(), account);
        mDriveResourceClient = Drive.getDriveResourceClient(getApplicationContext(), account);
    }
}

3. 下载指定Drive文件

假设你已经拿到了目标文件的DriveId,可以通过以下步骤完成下载:

// 替换成你要下载的文件的DriveId
DriveId targetDriveId = ...;
DriveFile driveFile = targetDriveId.asDriveFile();

// 打开文件并获取输入流
mDriveResourceClient.openFile(driveFile, DriveFile.MODE_READ_ONLY)
        .addOnSuccessListener(driveContents -> {
            // 获取文件输入流,接下来可以写入本地文件
            try (InputStream inputStream = driveContents.getInputStream()) {
                File localFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "my_downloaded_file");
                saveStreamToFile(inputStream, localFile);
                Toast.makeText(this, "文件下载完成", Toast.LENGTH_SHORT).show();
            } catch (IOException e) {
                Log.e("DriveDownload", "写入文件失败", e);
            }
            // 用完后记得关闭DriveContents
            driveContents.discard(mDriveResourceClient);
        })
        .addOnFailureListener(e -> {
            Log.e("DriveDownload", "文件下载失败", e);
            Toast.makeText(this, "下载失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        });

4. 补充:流写入本地文件的工具方法

上面用到的saveStreamToFile实现示例:

private void saveStreamToFile(InputStream inputStream, File outputFile) throws IOException {
    try (OutputStream outputStream = new FileOutputStream(outputFile)) {
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            outputStream.write(buffer, 0, bytesRead);
        }
        outputStream.flush();
    }
}

注意事项

  • 确保用户已经完成GoogleSignIn授权,并且授权时包含了Scopes.DRIVE_FILE或者Scopes.DRIVE权限
  • 如果是通过文件选择器获取文件,新版的文件选择器返回的就是DriveFile对象,可以直接传入上面的方法处理
  • 处理文件流时记得用try-with-resources语法,避免资源泄漏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:42:36