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

如何在Pydroid中不依赖Kivy App使用Plyer获取GPS定位

解决Pydroid中Plyer GPS单独调用的Segmentation Fault问题

核心原因

Plyer的GPS模块在Android环境(Pydroid)下必须依赖Kivy应用的主线程循环和Android应用上下文。裸跑单独的GPS代码时,缺少必要的环境初始化,会导致底层内存访问错误,触发Segmentation Fault。而通知功能对环境依赖较弱,所以能正常运行。

解决方案

必须将GPS逻辑嵌入完整的Kivy App结构中,同时正确使用主线程装饰器处理回调:

修正后的可运行代码

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import mainthread
from plyer import gps

class GPSApp(App):
    def build(self):
        self.status_label = Label(text="等待GPS定位...")
        # 配置GPS回调与参数
        gps.configure(
            on_location=self.update_location,
            on_status=self.handle_status
        )
        # 启动GPS:每1秒更新一次,位移超过1米触发回调
        gps.start(minTime=1000, minDistance=1)
        return self.status_label

    @mainthread
    def update_location(self, **kwargs):
        lat = kwargs.get('lat', '未获取')
        lon = kwargs.get('lon', '未获取')
        self.status_label.text = f"纬度: {lat}\n经度: {lon}"

    @mainthread
    def handle_status(self, stype, status):
        self.status_label.text += f"\n状态: {stype} - {status}"

    def on_stop(self):
        # 应用退出时停止GPS,避免资源泄漏
        gps.stop()
        super().on_stop()

if __name__ == '__main__':
    GPSApp().run()

关键注意事项

  1. 必须启动Kivy事件循环:通过GPSApp().run()初始化Android应用上下文,这是Plyer GPS能正常调用系统服务的前提。
  2. 主线程回调:@mainthread装饰器确保GPS回调在Kivy主线程执行,避免Android系统回调与子线程的冲突(之前黑屏是因为仅加装饰器但未启动完整的App生命周期)。
  3. 资源清理:在on_stop方法中停止GPS,防止后台持续耗电和资源占用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 06:51:00