我是 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...
如果有人能告诉我我做错了什么,那将非常有帮助!谢谢。