You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy开发安卓APK访问Google Drive崩溃问题咨询

Kivy安卓APK访问Google Drive的问题分析与解决方案

你的代码无法直接在安卓端正常运行,核心问题集中在认证逻辑和文件路径处理上,具体原因和修正方案如下:

核心问题点

  1. 认证方式不兼容移动端
    LocalWebserverAuth()是PC端专属的认证逻辑,它依赖本地启动Web服务器接收Google的授权回调,但安卓系统没有这个运行环境,直接调用会导致应用崩溃。安卓端需要使用适配移动端的设备授权流(Device Authorization Flow)。

  2. 文件路径不符合安卓沙箱机制
    代码中直接使用"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:55:21