Kivy和Plyer的GPS示例并不适用于Android

时间:2015-08-12 16:49:00

标签: android gps kivy

我最近发现了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库

1 个答案:

答案 0 :(得分:2)

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

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