Kivy开发安卓APK访问Google Drive崩溃问题咨询
Kivy安卓APK访问Google Drive的问题分析与解决方案
你的代码无法直接在安卓端正常运行,核心问题集中在认证逻辑和文件路径处理上,具体原因和修正方案如下:
核心问题点
认证方式不兼容移动端
LocalWebserverAuth()是PC端专属的认证逻辑,它依赖本地启动Web服务器接收Google的授权回调,但安卓系统没有这个运行环境,直接调用会导致应用崩溃。安卓端需要使用适配移动端的设备授权流(Device Authorization Flow)。文件路径不符合安卓沙箱机制
代码中直接使用"mycreds.txt"和"compra.xlsx"这类相对路径,安卓系统的应用沙箱机制限制了应用只能访问自身私有目录,直接写相对路径会出现文件找不到或权限不足的问题,进而引发崩溃。
修正后的代码示例
from pydrive2.auth import GoogleAuth from pydrive2.drive import GoogleDrive from kivy.utils import platform import os def init_google_drive(): gauth = GoogleAuth() # 获取安卓应用私有目录路径,PC端 fallback 到当前目录 app_data_dir = os.environ.get('USER_DATA_DIR', '.') creds_path = os.path.join(app_data_dir, 'mycreds.txt') gauth.LoadCredentialsFile(creds_path) if gauth.credentials is None: # 根据平台选择对应认证方式 if platform == 'android': gauth.GetFlow() gauth.flow.params.update({'access_type': 'offline'}) # 启用设备授权流,获取授权链接和用户码 auth_url, user_code = gauth.GetAuthUrl(device_flow=True) # 此处需替换为Kivy UI组件:显示auth_url让用户在其他设备打开,用TextInput接收用户输入的授权码 # 示例中用模拟输入替代,实际开发需做UI交互 auth_code = input(f"请在浏览器打开 {auth_url},输入用户码 {user_code} 后,输入授权码:") gauth.Auth(auth_code) else: gauth.GetFlow() gauth.flow.params.update({'access_type': 'offline'}) gauth.flow.params.update({'approval_prompt': 'force'}) gauth.LocalWebserverAuth() elif gauth.access_token_expired: try: gauth.Refresh() except: # 刷新失败时重新触发认证 if platform == 'android': auth_url, user_code = gauth.GetAuthUrl(device_flow=True) auth_code = input(f"请在浏览器打开 {auth_url},输入用户码 {user_code} 后,输入授权码:") gauth.Auth(auth_code) else: gauth.LocalWebserverAuth() else: gauth.Authorize() # 将凭证保存到应用私有目录 gauth.SaveCredentialsFile(creds_path) drive = GoogleDrive(gauth) # 下载文件到应用私有目录 file_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' file_name = "compra.xlsx" save_path = os.path.join(app_data_dir, file_name) downloaded = drive.CreateFile({'id': file_id}) downloaded.GetContentFile(save_path) return drive, save_path
额外注意事项
- 安卓权限配置:在
buildozer.spec中添加网络权限:android.permissions = INTERNET,确保应用能访问网络完成授权和文件下载。 - UI交互优化:代码中的
input()仅为示例,实际开发需用Kivy的Popup+TextInput组件实现授权码输入界面,提升用户体验。 - 打包依赖处理:用Buildozer打包时,需在
requirements中添加pydrive2,同时确保其依赖的oauth2client等库能被正确打包。
内容的提问来源于stack exchange,提问作者txema
相关产品推荐
相关产品推荐

