求适用于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
相关产品推荐
相关产品推荐

