私はKivyが初めてで(Pythonも比較的新しい)、UrlRequestsを機能させるのに問題があります。特に、Android 用アプリで Google 方向 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」が含まれています。
また、フォームの関数を使用してアプリに Google へのアクセスを試みさせました (ユーザーによって送信されました: 10flow、Python の Ping サーバーで)、
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 is up!」というラベルを作成します)。したがって、これは、インターネットへのアクセス自体が問題ではないと私に信じさせるでしょう.問題は、Google APIを使用しているか、urllib2を使用していることです(それは理にかなっていますか?)。
また、urllib2 の代わりに UrlRequest を使用して URL クエリを実行する関数も作成しましたが、最終的には同じ問題が発生しました (Android ではなく Linux で動作します)。
したがって、問題はGoogle APIの使用にあると思います。そして、buildozer.spec ファイルの android.library 参照として「google-play-services_lib/」を追加することと関係があると思います。
私がこれまでに言ったことが理にかなっているとしたら、だれか google api/google-play-services_lib の問題についてコメントしてもらえますか? 私は一般的にAPIに精通しておらず、やや深みがありません。あるいは、これは問題ではなく、明らかな何かを見逃しているのかもしれません。
とにかく、事前に感謝します。
編集
問題をある程度絞り込んだと思います。キーを必要としない API は使用できますが、キーが必要な API は使用できません。How to get google map apikey in androidのような投稿は、buildozer.spec ファイルの android メタデータに google api キー (google 方向 api の場合) を追加するだけでよいと信じさせてくれます。次のいくつかのバリエーションを試してみましたが、失敗しました。
# (list) Android application meta-data to set (key=value format)
android.meta_data = com.google.android.maps.v2.API_KEY=AI...
誰かが私が間違っていることを教えてくれれば、それは非常に役に立ちます! ありがとう。