如何在Android中将EditText内容上传至Google Drive并保存为Google Doc?
Android实现EditText内容上传为Google Drive中的Google Doc格式
当然可行,核心是借助Google Drive API和Google Docs API完成文件创建与内容写入,以下是具体实现步骤:
一、前期配置
- 启用API
登录Google Cloud Console,为你的项目启用Google Drive API和Google Docs API。 - 配置OAuth客户端
创建Android类型的OAuth客户端ID,填写你的应用包名和SHA-1指纹,下载google-services.json文件并放入项目的app/目录下。 - 添加依赖
在app/build.gradle的dependencies块中添加以下依赖(版本号可根据最新稳定版调整):implementation 'com.google.android.gms:play-services-auth:20.7.0' implementation 'com.google.apis:google-api-services-drive:v3-rev20240422-2.0.0' implementation 'com.google.apis:google-api-services-docs:v1-rev20240412-2.0.0' implementation 'com.google.oauth-client:google-oauth-client-android:1.34.1'
二、实现账号认证
要操作Google Drive,首先需要获取用户的授权,这里用Google Sign-In完成:
private val REQUEST_CODE_SIGN_IN = 1001 private lateinit var googleSignInClient: GoogleSignInClient private var driveService: Drive? = null private var docsService: Docs? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 初始化登录配置,请求Drive和Docs的权限 val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(Scope(DriveScopes.DRIVE_FILE)) .requestScopes(Scope(DocsScopes.DOCUMENTS)) .requestEmail() .build() googleSignInClient = GoogleSignIn.getClient(this, signInOptions) // 点击上传按钮触发登录 uploadBtn.setOnClickListener { startActivityForResult(googleSignInClient.signInIntent, REQUEST_CODE_SIGN_IN) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_SIGN_IN) { val task = GoogleSignIn.getSignedInAccountFromIntent(data) try { val account = task.getResult(ApiException::class.java) // 获取认证凭证 val credential = GoogleAccountCredential.usingOAuth2( this, listOf(DriveScopes.DRIVE_FILE, DocsScopes.DOCUMENTS) ).setSelectedAccount(account.account) // 初始化Drive和Docs服务实例 driveService = Drive.Builder( AndroidHttp.newCompatibleTransport(), GsonFactory.getDefaultInstance(), credential ).setApplicationName("你的应用名称").build() docsService = Docs.Builder( AndroidHttp.newCompatibleTransport(), GsonFactory.getDefaultInstance(), credential ).setApplicationName("你的应用名称").build() // 执行上传操作 val editTextContent = contentEt.text.toString() uploadToGoogleDoc(editTextContent) } catch (e: ApiException) { Toast.makeText(this, "认证失败:${e.statusCode}", Toast.LENGTH_SHORT).show() } } }
三、创建Google Doc并写入内容
通过Drive API创建空白的Google Doc,再用Docs API将EditText的内容写入文档:
private fun uploadToGoogleDoc(content: String) = CoroutineScope(Dispatchers.IO).launch { try { // 1. 创建空白Google Doc文件 val fileMetadata = File() .setName("自定义文档名称") // 可替换为用户输入或时间戳生成的文件名 .setMimeType("application/vnd.google-apps.document") val createdFile = driveService?.files()?.create(fileMetadata) ?.setFields("id") ?.execute() ?: throw IOException("创建文档失败") // 2. 向文档插入EditText内容 val insertRequest = InsertTextRequest() .setLocation(Location().setIndex(1)) // 从文档起始位置插入 .setText(content) val batchRequest = BatchUpdateDocumentRequest() .setRequests(listOf(Request().setInsertText(insertRequest))) docsService?.documents()?.batchUpdate(createdFile.id, batchRequest)?.execute() // 回到主线程提示用户 withContext(Dispatchers.Main) { Toast.makeText(this@MainActivity, "文档已成功上传到Google Drive", Toast.LENGTH_SHORT).show() } } catch (e: IOException) { withContext(Dispatchers.Main) { Toast.makeText(this@MainActivity, "上传失败:${e.message}", Toast.LENGTH_SHORT).show() } } }
四、注意事项
- 所有网络请求必须在后台线程执行,示例中用Kotlin协程处理,也可使用AsyncTask或Executor
- 建议使用
DRIVE_FILE范围权限(仅允许访问应用创建的文件),比全范围DRIVE更容易通过Google审核 - 需处理Google Play服务未安装、网络异常、认证过期等异常情况
- 文件名可根据需求自定义,比如结合当前时间戳避免重复
内容的提问来源于stack exchange,提问作者George Wann
相关产品推荐
相关产品推荐

