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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:17:16