【问题标题】:GPS example with Kivy and plyer doesn't work on Android带有 Kivy 和 plyer 的 GPS 示例在 Android 上不起作用
【发布时间】:2015-08-12 16:48:59
【问题描述】:

我最近发现了 Kivy,并且一直在玩一些简单的例子。我修改了 Dusty Phillips 书中在 Kivy 中创建应用程序中的一些代码,但无法在我的 Android 手机上获得 GPS 输出。我只是想让代码每秒显示一次位置。这是我的 main.py 文件的相关部分:

class AddLocationForm(BoxLayout):
    def myclock(self, *args):
        try:


            gps.start()

        except:
            self.outputs.item_strings=["", "No Location", str(random.random())]

    @mainthread
    def on_location(self, **kwargs):
        try:
            self.outputs.item_strings = ["","","", str(kwargs['lat']),"","","",str(kwargs['lon']), "","","",str(random.random())]
        except:
            pass
    def on_status(sefl, **kwargs):
        self.outputs.item_strings = ["", "","", "On status", "", "",str(random.random())]

    def send_location(self):
        try:

            gps.configure(on_location=self.on_location, on_status=self.on_status)

            Clock.schedule_interval(self.myclock, 1)
        except NotImplementedError:
            self.outputs.item_strings=["", "No GPS", str(random.random())]



class WeatherApp(App):
    def on_pause(self):
        return True

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

我的 KV 文件是:

AddLocationForm:

<AddLocationForm>:
    orientation: "vertical"
    outputs: outputs_list
    BoxLayout:
        height: "40dp" 
        size_hint_y: None
        Button:
            text: "Start"
            size_hint_x: 25 
            on_press: root.send_location()
        Button:
            text: "End"
            size_hint_x: 25 
    ListView: 
        id: outputs_list
        item_strings: []

该应用程序在我的桌面上运行良好,因为它会遇到 NotImplementedError。当我编译应用程序(使用 buildozer 通过运行buildozer android debug 创建 .apk 文件)并将其安装在我的 Android 手机上时,它似乎一开始可以工作大约一分钟,然后冻结而没有任何响应。起初在后台暂停/运行似乎不是问题。例如,我可以在应用程序之间切换并返回它,它仍然会输出位置。然而,一段时间后,应用程序只是冻结了......没有多次运行send_location()

我已在 buildozer.specs 文件中启用访问权限和权限以及 plyer 库

【问题讨论】:

  • logcat 是否提供任何有用的信息?另外,您是否添加了 ACCESS_FINE_LOCATION 和 ACCESS_COARSE_LOCATION 权限?
  • 瑞恩,感谢您的建议。我同时使用 Fine 和 Coarse 位置。我实际上是通过将 kwargs['lat'] 修改为 str(kwargs['lat']) 来使其工作的,但是,现在该应用程序似乎在一分钟左右后变得无响应(尽管它起初可以工作)有什么建议吗?跨度>
  • 您上面的代码中没有足够的信息来回答这个问题。不过,如果您不止一次致电send_location,这可能就是问题所在。
  • 再次感谢您的回复。我已经修改了上面的代码以包含所有内容,包括 KV 文件 ....

标签: android gps kivy


【解决方案1】:

首先,您需要确保您不会多次致电gps.configure()gps.start()。我必须查看 plyer 代码以确定这是否真的是一个问题,但这肯定是一种不好的做法。通常,您应该在应用启动时调用一次(on_start 回调),然后在应用暂停时停止(on_pause 回调),在应用恢复时重新启动(on_resume 回调)并在应用退出时再次停止(@ 987654327@回调)。我经常只是将这些电话放在on_pauseon_resume 中,然后让on_start 拨打on_resumeon_stop 拨打on_pausegps.configure() 可能只需要调用一次,因为它会连接事件,并且当 GPS 功能启动和停止时,事件会开始和停止触发。

但冻结的原因可能是您的on_status 回调没有像on_location 那样的@mainthread 装饰器。 on_status 回调将定期使用GPS_EVENT_SATELLITE_STATUS 调用。

【讨论】:

  • 将来我想将用户的位置连续传输到网络应用程序。在这种情况下,即使在后台运行,我也确实需要应用程序来获取位置。我想这意味着我需要多次调用 gps.start() 对吧?
  • 如果您想持续检查,您需要使用 Android 服务。当设备进入睡眠状态时,还需要唤醒锁定以保持轮询。 tshirtman 做了一个很好的服务教程:kivy.org/planet/2014/01/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2016-08-23
  • 2019-12-31
  • 1970-01-01
相关资源
最近更新 更多