Android Java实现SMS与通话记录备份至Google Drive指导求助
针对Android Java应用Google Drive云备份的实现指导
一、明确适配Android的API选型
直接使用Google Drive for Android API (GDAA),这是Google官方为Android本地应用打造的专属Drive集成方案,比通用REST API更适配Android系统权限与应用生命周期,文档也更贴合移动端场景。
二、核心实现步骤
1. 配置项目依赖与基础权限
- 在app模块的
build.gradle中添加官方依赖:
dependencies { implementation 'com.google.android.gms:play-services-drive:20.1.0' }
- 在
AndroidManifest.xml中声明必要配置:
<uses-permission android:name="android.permission.INTERNET" /> <application ...> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application>
2. 完成OAuth2授权流程
- 初始化Drive客户端,处理未登录场景:
private static final int REQUEST_CODE_SIGN_IN = 1001; // 检查是否已登录 GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); if (account == null) { // 启动Google账号登录流程 GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(Drive.SCOPE_FILE) .build(); Intent signInIntent = GoogleSignIn.getClient(this, signInOptions).getSignInIntent(); startActivityForResult(signInIntent, REQUEST_CODE_SIGN_IN); } else { // 已登录,初始化Drive客户端 Drive driveClient = Drive.getDriveClient(this, account); // 进入文件上传环节 }
- 在
onActivityResult中处理登录回调:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SIGN_IN && resultCode == RESULT_OK) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); Drive driveClient = Drive.getDriveClient(this, account); // 授权成功,执行文件上传 } catch (ApiException e) { // 处理授权失败逻辑(如用户取消登录) } } }
3. 上传本地备份文件到Drive
- 写入备份文件内容并创建Drive文件:
DriveContentsClient contentsClient = driveClient.getDriveContentsClient(); Task<DriveContents> createContentsTask = contentsClient.createContents(); createContentsTask.addOnSuccessListener(driveContents -> { // 将本地备份文件写入DriveContents try (OutputStream outputStream = driveContents.getOutputStream()) { File localBackup = new File(getFilesDir(), "sms_call_backup.db"); Files.copy(localBackup.toPath(), outputStream); } catch (IOException e) { e.printStackTrace(); contentsClient.discard(driveContents); return; } // 设置Drive文件元数据 MetadataChangeSet metaSet = new MetadataChangeSet.Builder() .setTitle("SMS_Call_Backup_" + System.currentTimeMillis() + ".db") .setMimeType("application/vnd.sqlite3") .setStarred(true) .build(); // 上传到Drive根目录 DriveResourceClient resourceClient = driveClient.getDriveResourceClient(); Task<DriveFile> uploadTask = resourceClient.createFile(driveContents, metaSet); uploadTask.addOnSuccessListener(driveFile -> { // 上传成功,可记录文件ID用于后续恢复 }).addOnFailureListener(e -> { // 上传失败处理 contentsClient.discard(driveContents); }); });
三、旧方案失效的常见原因与排查
- 依赖版本过时:旧方案多基于废弃的Drive API版本,需切换到最新的
play-services-drive依赖 - Scope权限变更:必须申请
Drive.SCOPE_FILE或Drive.SCOPE_APPFOLDER(应用私有目录),旧的全量Drive scope已不再支持 - 签名验证问题:测试时必须使用关联Google Cloud项目的签名密钥打包,debug临时签名会导致API调用失败
内容的提问来源于stack exchange,提问作者Shehan Sachintha
相关产品推荐
相关产品推荐

