0

我是 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,在 Python 中的 Pinging 服务器上),

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 已启动!”)。所以这会让我相信访问互联网本身不是问题:问题要么是使用谷歌 api,要么是使用 urllib2(这有意义吗?)。

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

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

如果到目前为止我所说的有道理,有人可以评论 google api/google-play-services_lib 问题吗?总的来说,我真的不太熟悉 api,并且有点超出我的深度。或者也许这不是问题,我错过了一些明显的东西。

无论如何,提前谢谢。

编辑

我想我已经缩小了问题的范围。我可以使用不需要密钥的 api,但不能使用需要密钥的 api。像How to get google map apikey in android这样的帖子让我相信我只需要将 google api 密钥(在 google 方向 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...

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

4

1 回答 1

2

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

问题是我试图访问 https url,因此需要使用 openssl 构建 android apk。不需要 android 元数据或 google play 服务,只需将 openssl 添加到 buildozer.spec 文件中的要求。 requirements = openssl,kivy

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

希望这对将来的某人有所帮助。

于 2015-06-14T21:15:14.590 回答