求在Codename One中调用Google Drive API v3实现读写的可行方案
在Codename One中实现Google Drive读写的可行方案
1. 适配Google Identity Services (GIS) 授权流程
Codename One支持调用系统浏览器或内置BrowserComponent,可以通过以下步骤完成GIS授权:
- 构造GIS授权URL,指定Drive所需权限(比如
https://www.googleapis.com/auth/drive.file用于基础文件读写),包含你的客户端ID、自定义重定向URI(如cn1redirect://oauth2callback,方便授权后回调) - 用
BrowserComponent打开授权URL,监听页面跳转事件,当用户授权完成后,从回调URL中提取授权码 - 通过Codename One的
ConnectionRequest向Google令牌端点发送请求,用授权码换取访问令牌和刷新令牌 - 保存刷新令牌,后续可通过它获取新的访问令牌,避免重复引导用户授权
示例代码片段:
// 构建授权URL String authUrl = "https://accounts.google.com/o/oauth2/v2/auth?" + "client_id=你的客户端ID&" + "redirect_uri=cn1redirect://oauth2callback&" + "response_type=code&" + "scope=https://www.googleapis.com/auth/drive.file&" + "access_type=offline&" + "prompt=consent"; // 初始化浏览器组件并监听回调 BrowserComponent bc = new BrowserComponent(); bc.addWebEventListener(BrowserComponent.onNavigationCallback, ev -> { String url = ev.getUrl(); if (url.startsWith("cn1redirect://oauth2callback")) { // 从URL中提取授权码 String code = url.split("code=")[1].split("&")[0]; // 调用换取令牌的方法 exchangeCodeForToken(code); return false; // 阻止页面跳转 } return true; }); Form authForm = new Form("Google Drive 授权"); authForm.add(bc); authForm.show();
2. 尝试更新版Codename One Google扩展
检查Codename One扩展市场,部分第三方Google Connect扩展已适配GIS,这类扩展会封装完整的授权流程,你只需配置客户端ID和权限,就能快速获取访问令牌,之后直接调用Drive API即可。
3. 直接调用Google Drive REST API
拿到有效访问令牌后,用Codename One的ConnectionRequest调用Drive REST API:
- 上传文件:构造
multipart/form-data格式的请求,包含文件元数据和内容,设置Authorization: Bearer {访问令牌}请求头 - 下载文件:向文件的下载URL发送GET请求,同样携带授权头
- 列出文件:调用
GET https://www.googleapis.com/drive/v3/files接口,按需添加查询参数筛选结果
示例上传文件代码片段:
ConnectionRequest uploadRequest = new ConnectionRequest() { @Override protected void buildRequestBody(OutputStream os) throws IOException { // 按照Google Drive API要求构造multipart请求内容 // 包含文件元数据JSON和文件二进制内容 } @Override protected void readResponse(InputStream input) throws IOException { // 解析响应,获取上传后的文件ID等信息 } }; uploadRequest.setUrl("https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart"); uploadRequest.setHttpMethod("POST"); uploadRequest.addRequestHeader("Authorization", "Bearer " + 你的访问令牌); NetworkManager.getInstance().addToQueueAndWait(uploadRequest);
4. 关键注意事项
- 在Google Cloud控制台正确配置OAuth 2.0客户端ID,添加对应的重定向URI(比如自定义协议
cn1redirect://oauth2callback) - 权限范围尽量最小化,优先使用
drive.file而非全量drive权限,降低用户授权门槛 - 用Codename One的
Storage类加密存储刷新令牌,避免令牌泄露 - 处理令牌过期场景:当API调用返回401错误时,自动用刷新令牌获取新的访问令牌
内容的提问来源于stack exchange,提问作者Daniel Tsai
相关产品推荐
相关产品推荐

