当尝试使用谷歌方向api时,Kivy应用程序(在Android上)崩溃

时间:2015-06-06 15:34:54

标签: urllib2 kivy urlrequest buildozer

我是Kivy的新手(并且对Python来说相对较新),我遇到了让UrlRequests工作的问题。特别是,我试图在Android的应用程序中使用谷歌方向api。

首先,当我通过python运行main.py文件时,代码完全正常工作。 该应用程序还使用buildozer成功构建和部署到我的手机。应用程序加载并运行直到您按下按钮以启动urlrequest,此时应用程序才会关闭。

所以我相信问题就在于这个按钮。现在我认为按钮的全部细节有点不必解释,但基本上它会多次使用一个函数(如下所示)来返回不同位置之间的距离。

import urllib2

#the google api key
google_api_key = '...'

def distance_checker(origin, destination):
    # This function outputs the distance between two places in meters
    api_key = google_api_key
    url = 'https://maps.googleapis.com/maps/api/directions/json?origin='
    start = origin.replace(' ', '%20')
    end = destination.replace(' ', '%20')
    final_url = url + start + '&destination=' + end + '&mode=walking' + '&key=' + api_key
    json_obj = urllib2.urlopen(final_url)
    data = json.load(json_obj)

    return data['routes'][0]['legs'][0]['distance']['value']

在我的buildozer.spec文件中,我确实有' android.permissions = INTERNET'包括在内。

我的应用尝试使用表单功能访问谷歌(由用户提交:10flow,Pinging servers in Python),

import os

def ping_function(self):
    hostname = "google.com" #example
    response = os.system("ping -c 1 " + hostname)

    #and then check the response...
    if response == 0:
        self.box.add_widget(Label(text=(hostname + ' is up!'), size_hint_y=None, height=40))
    else:
        self.box.add_widget(Label(text=(hostname + ' is down!'), size_hint_y=None, height=40))

为清楚起见,“'框'上面使用的是ScrollView小部件。此功能在Android中的应用程序中可以正常工作(即它确实创建了一个标签,说“google.com已经启动了!”#39;)。因此,这会让我相信访问互联网本身不是问题:问题是使用谷歌API,还是使用urllib2(这有意义?)。

我还编写了一个使用UrlRequest而不是urllib2进行url查询的函数,但最终有同样的问题(适用于linux,不适用于android)。

所以我想这个问题是使用google apis。我认为它与添加&google-play-services_lib /'有关。作为buildozer.spec文件中的android.library引用。

如果我到目前为止所说的有意义,那么有人可以评论google api / google-play-services_lib问题吗?我一般都不熟悉api,而且有点超出我的深度。或许这不是问题,我错过了一些明显的东西。

无论如何,提前谢谢。

修改

我想我已经在某种程度上缩小了这个问题。我可以使用不需要密钥的api,我也不能使用需要密钥的api。像How to get google map apikey in android这样的帖子让我相信我只需要将google api密钥(在google Directions api的情况下)添加到buildozer.spec文件中的android元数据。我没有成功尝试以下几种变体,

# (list) Android application meta-data to set (key=value format)
android.meta_data = com.google.android.maps.v2.API_KEY=AI...

如果有人能告诉我我做错了什么,那将非常有帮助! 感谢。

1 个答案:

答案 0 :(得分:2)

所以对于其他人和后人,我通过Kivy用户论坛找到了答案(http://kivy.org/#forum,问题:UrlRequest与api需要api密钥的问题)。

问题是我试图访问https网址,因此需要使用openssl构建android apk。不需要Android元数据或谷歌播放服务,只需将openssl添加到buildozer.spec文件中的要求即可。 requirements = openssl,kivy

一旦发现openssl成为问题,还有一个问题需要克服,即buildozer试图下载openssl.org网页上不再存在的openssl tar文件。但是,可以编辑openssl版本buildozer尝试在your_project / .buildozer / android / platform / python-for-android / recipes / openssl / recipe.sh中下载。您还需要更新该文件中的MD5值。

希望这可以帮助将来的某个人。