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

求适用于Android的Google Drive REST API v3最新完整入门指南

我太懂你这种被官方文档坑到怀疑人生的感觉了——Google Drive REST API v3的Android相关内容真的太零散,要么是过时的旧教程,要么是语焉不详的官方片段,新手根本没法快速上手。下面是我整理的2024年最新完整新手指南,从凭证配置到核心功能实现一步到位,帮你轻松搞定Drive文件的打开与编辑:


一、前置准备:创建Google Cloud项目与凭证

这一步是基础,错了后面全白搭:

  • 打开Google Cloud Console,创建新项目(已有项目直接用就行)
  • 在搜索栏输入「Google Drive API」,找到后点击启用
  • 配置OAuth同意屏幕:选择「外部」(个人测试/小范围使用),填写应用名称、联系方式,然后添加测试用户(必须是你自己的Google账号,否则会触发应用未验证的错误)
  • 创建OAuth客户端ID:选择「Android」,填写你的应用包名(比如com.your.app.name)和SHA-1指纹(获取方法:Android Studio右上角Gradle面板 → 你的项目 → Tasks → android → signingReport,找到SHA-1那一栏)
  • 下载生成的google-services.json文件,放到项目的app/根目录下

二、依赖项配置(build.gradle)

分两个文件配置,别漏了:

项目根目录的build.gradle

确保Google服务插件已添加:

buildscript {
    dependencies {
        classpath 'com.google.gms:google-services:4.4.1' // 版本可按需更新到最新
    }
}

app模块的build.gradle

添加Drive API和OAuth认证的核心依赖:

plugins {
    id 'com.android.application'
    id 'com.google.gms.google-services' // 必须添加这个插件
}

android {
    defaultConfig {
        minSdkVersion 21 // 最低支持Android 5.0,过低版本会有兼容性问题
    }
}

dependencies {
    // Google Drive REST API核心库
    implementation 'com.google.apis:google-api-services-drive:v3-rev20240529-2.0.0'
    // Google OAuth认证库(处理登录流程)
    implementation 'com.google.android.gms:play-services-auth:20.7.0'
    // 可选:简化网络请求的OkHttp(如果需要自定义网络配置)
    implementation 'com.squareup.okhttp3:okhttp:4.12.0'
}

三、AndroidManifest.xml配置

只需要添加必要的网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<!-- 可选:如果需要检测网络状态,添加下面这条 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

四、核心代码实现(登录+文件操作)

第一步:封装OAuth登录逻辑

创建一个工具类处理登录和Drive服务实例的获取:

import android.content.Context
import android.content.Intent
import com.google.android.gms.auth.api.signin.GoogleSignIn
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
import com.google.android.gms.auth.api.signin.GoogleSignInClient
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
import com.google.android.gms.common.api.ApiException
import com.google.android.gms.common.api.Scope
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential
import com.google.api.client.http.javanet.NetHttpTransport
import com.google.api.client.json.gson.GsonFactory
import com.google.api.services.drive.Drive
import com.google.api.services.drive.DriveScopes
import android.util.Log

class DriveAuthManager(private val context: Context) {
    // 权限范围:DRIVE_FILE是最小权限(仅访问应用创建的文件),如需全Drive访问用DRIVE
    private val driveScopes = listOf(DriveScopes.DRIVE_FILE, DriveScopes.DRIVE_READONLY)
    private val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestScopes(Scope(DriveScopes.DRIVE_FILE))
        .requestEmail()
        .build()
    private val googleSignInClient: GoogleSignInClient = GoogleSignIn.getClient(context, gso)

    // 获取登录Intent,用于启动登录页面
    fun getSignInIntent(): Intent = googleSignInClient.signInIntent

    // 处理登录返回结果
    fun handleSignInResult(data: Intent?): GoogleSignInAccount? {
        val task = GoogleSignIn.getSignedInAccountFromIntent(data)
        return try {
            task.getResult(ApiException::class.java)
        } catch (e: ApiException) {
            Log.e("DriveAuth", "登录失败,错误码:${e.statusCode}")
            null
        }
    }

    // 获取Drive服务实例,用于后续文件操作
    fun getDriveService(account: GoogleSignInAccount): Drive {
        val credential = GoogleAccountCredential.usingOAuth2(
            context, driveScopes
        ).setSelectedAccount(account.account)
        return Drive.Builder(
            NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            credential
        ).setApplicationName("你的应用名称")
            .build()
    }
}

第二步:在Activity中实现登录与文件操作

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.google.api.services.drive.Drive
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.IOException

class MainActivity : AppCompatActivity() {
    private val REQUEST_CODE_SIGN_IN = 1001
    private lateinit var driveAuthManager: DriveAuthManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        driveAuthManager = DriveAuthManager(this)

        // 绑定登录按钮点击事件
        findViewById<Button>(R.id.btn_sign_in).setOnClickListener {
            startActivityForResult(driveAuthManager.getSignInIntent(), REQUEST_CODE_SIGN_IN)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == REQUEST_CODE_SIGN_IN && resultCode == RESULT_OK) {
            val account = driveAuthManager.handleSignInResult(data)
            account?.let {
                // 登录成功,获取Drive服务并操作文件
                val driveService = driveAuthManager.getDriveService(it)
                // 替换为你要操作的Drive文件ID
                operateDriveFile(driveService, "your-file-id-here")
            }
        }
    }

    // 打开并编辑Drive文件的示例方法
    private fun operateDriveFile(driveService: Drive, fileId: String) {
        // 网络请求必须在后台线程执行,这里用Coroutine简化
        lifecycleScope.launch(Dispatchers.IO) {
            try {
                // 1. 获取文件元数据
                val file = driveService.files().get(fileId).execute()
                Log.d("DriveDemo", "文件名:${file.name},MIME类型:${file.mimeType}")

                // 2. 下载文件内容(示例:文本文件)
                val inputStream = driveService.files().get(fileId).executeMediaAsInputStream()
                val content = inputStream.bufferedReader().use { it.readText() }
                Log.d("DriveDemo", "原文件内容:$content")

                // 3. 编辑并更新文件内容
                val newContent = "更新后的内容:${System.currentTimeMillis()}\n$content"
                val mediaContent = com.google.api.client.http.ByteArrayContent.fromString(file.mimeType, newContent)
                val updatedFile = driveService.files().update(fileId, file, mediaContent).execute()
                Log.d("DriveDemo", "文件更新成功,新文件ID:${updatedFile.id}")

                // 回到主线程提示用户
                withContext(Dispatchers.Main) {
                    Toast.makeText(this@MainActivity, "文件操作完成", Toast.LENGTH_SHORT).show()
                }
            } catch (e: IOException) {
                Log.e("DriveError", "文件操作失败:${e.message}")
                withContext(Dispatchers.Main) {
                    Toast.makeText(this@MainActivity, "操作失败,请检查网络", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

五、踩坑提醒

  • OAuth测试用户:一定要添加自己的账号到测试用户列表,否则会弹出「应用未验证」的警告,无法正常登录
  • SHA-1指纹:确保Google Cloud中配置的SHA-1和你当前调试/打包用的签名文件指纹一致,否则会出现登录失败的情况
  • 权限范围:优先用DRIVE_FILE最小权限,避免后续应用审核时遇到麻烦;如果确实需要全Drive访问,再用DRIVE权限
  • 网络线程:所有Drive API的调用必须在后台线程执行,不能在主线程,否则会触发ANR

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:17:50