如何在Android Kotlin应用中将应用专属数据存储到用户Google Drive?
使用Google Drive API存储应用专属数据完整指南
一、前期项目配置
- 登录Google Cloud控制台,创建新项目(或使用现有项目)
- 在「API和服务」>「启用API和服务」中搜索并启用Google Drive API
- 进入「API和服务」>「凭据」,创建OAuth 2.0客户端ID:
- 根据你的应用类型选择(比如「桌面应用」「Android应用」「Web应用」)
- 记录生成的客户端ID和客户端密钥
- 配置「OAuth同意屏幕」:
- 选择用户类型(内部/外部),填写必要的应用信息
- 在「范围」中添加
https://www.googleapis.com/auth/drive.appdata(这是访问应用专属数据的核心权限,不要添加普通的drive或drive.file范围)
二、用户授权流程
应用专属数据要求必须通过OAuth 2.0获取用户授权,核心要点:
- 发起授权请求时,必须包含
drive.appdata范围 - 授权成功后,保存返回的
access_token(短期有效)和refresh_token(长期有效),用于后续API调用 - 应用专属数据存储在用户Drive的
appDataFolder中,这个文件夹对用户不可见,仅授权的应用能访问
三、核心API操作示例(以Python为例)
1. 初始化Drive服务
from google.oauth2.credentials import Credentials from googleapiclient.discovery import build from googleapiclient.errors import HttpError from googleapiclient.http import MediaFileUpload, MediaIoBaseDownload # 加载保存的凭据(包含refresh_token) creds = Credentials.from_authorized_user_file('token.json', ['https://www.googleapis.com/auth/drive.appdata']) # 构建Drive服务 service = build('drive', 'v3', credentials=creds)
2. 上传应用专属数据
def upload_app_data(file_path, file_name): try: file_metadata = { 'name': file_name, 'parents': ['appDataFolder'] # 指定存储到应用专属文件夹 } media = MediaFileUpload(file_path, resumable=True) file = service.files().create(body=file_metadata, media_body=media, fields='id').execute() print(f"上传成功,文件ID: {file.get('id')}") return file.get('id') except HttpError as error: print(f"上传出错: {error}") return None
3. 下载应用专属数据
def download_app_data(file_id, save_path): try: request = service.files().get_media(fileId=file_id) with open(save_path, 'wb') as f: downloader = MediaIoBaseDownload(f, request) done = False while done is False: status, done = downloader.next_chunk() print(f"下载进度: {int(status.progress() * 100)}%") except HttpError as error: print(f"下载出错: {error}")
4. 列出应用专属文件夹内的文件
def list_app_data_files(): try: results = service.files().list(spaces='appDataFolder', fields='files(id, name)').execute() items = results.get('files', []) if not items: print("没有找到应用专属数据文件") return print("应用专属数据文件:") for item in items: print(f"{item['name']} ({item['id']})") return items except HttpError as error: print(f"列错出错: {error}") return None
5. 删除应用专属数据
def delete_app_data(file_id): try: service.files().delete(fileId=file_id).execute() print("文件删除成功") except HttpError as error: print(f"删除出错: {error}")
四、关键注意事项
- 配额限制:Google Drive API有每日请求配额,避免高频调用,可通过指数退避处理请求失败
- 凭据持久化:
refresh_token需要安全存储(比如移动端的Keychain,Web端的HttpOnly Cookie),避免泄露 - 数据安全:敏感数据建议在本地加密后再上传,增强安全性
- 平台适配:Android/iOS平台可使用Google官方提供的SDK,授权流程更贴合平台特性,核心API调用逻辑一致
内容的提问来源于stack exchange,提问作者Tehleel Mir
相关产品推荐
相关产品推荐

