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

使用Buildozer编译含geopy的Kivy安卓应用获取经纬度时崩溃求助

问题排查与修复方案
  • 补全安卓权限并动态申请
    你当前仅配置了INTERNET权限,获取设备位置需要额外添加位置类权限,修改buildozer.spec权限配置:
    android.permissions = INTERNET, ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION
    
    安卓6.0及以上系统需要动态申请敏感权限才能生效,在main.py启动逻辑中添加权限申请代码:
    from android.permissions import request_permissions, Permission
    request_permissions([Permission.INTERNET, Permission.ACCESS_FINE_LOCATION, Permission.ACCESS_COARSE_LOCATION])
    
    若导入android模块报错,在buildozer.spec的requirements中添加android依赖即可。
  • 异步执行geopy请求逻辑
    安卓系统禁止在主线程执行网络操作,直接在Kivy UI回调中调用geopy的查询接口会触发应用崩溃,需要将geopy的定位逻辑放到子线程或者异步协程中执行。
  • 修正geopy参数配置并添加异常捕获
    1. user_agent字段不要填写API密钥,Nominatim和MapQuest都要求user_agent填写应用唯一标识或个人邮箱,MapQuest的密钥需要单独传入api_key参数,正确配置示例:
    # Nominatim配置
    from geopy.geocoders import Nominatim
    geolocator = Nominatim(user_agent="你的应用名称/个人邮箱")
    
    # MapQuest配置
    from geopy.geocoders import MapQuest
    geolocator = MapQuest(api_key="你的MapQuest API密钥", user_agent="你的应用名称/个人邮箱")
    
    1. 所有geopy调用逻辑必须添加异常捕获,避免服务端返回错误或者网络异常直接导致应用崩溃:
    try:
        location = geolocator.geocode("需要查询的地址")
        if location:
            print(location.latitude, location.longitude)
    except Exception as e:
        # 此处可添加自定义错误提示逻辑
        print(f"定位失败: {str(e)}")
    
  • 补全网络依赖
    部分版本geopy需要额外网络库支持HTTPS请求,可在buildozer.spec的requirements中添加urllib3, certifi依赖,避免SSL请求异常。
  • 查看具体崩溃日志定位问题
    若以上配置完成后仍存在崩溃,可通过adb命令抓取Python运行日志定位具体报错:
    adb logcat -s python

内容的提问来源于stack exchange,提问作者sybe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:39:04