升级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
相关产品推荐
相关产品推荐

