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

