2013-02-01 10 views
18

Próbuję utworzyć pole autouzupełniania, które powinno pobierać miasta według typów użytkowników za pomocą interfejsu API Miejsc Google opisanego w tym samouczku: https://developers.google.com/places/training/autocomplete-androidOdmowa podania żądania Google Places API dla autouzupełniania Androida, nawet z odpowiednim kluczem APi

Prawdopodobnie już wcześniej wiele razy znalazłeś to pytanie, ale żadna z odpowiedzi mi nie pomogła. Oto rzeczy, które warto wiedzieć:

URL jest https://maps.googleapis.com/maps/api/place/autocomplete/json?sensor=false&key=myKey&components=country:ro&input=whatTheUserTypes

Prosimy nie odpowiadać mówiąc pan zastąpił klucz API z własną rękę i to działało - klucz API, który jeździ tam musi być specyficzny Android i nie będzie działać z poziomu przeglądarki.

Tak więc zrobiłem klucz API systemu Android przy użyciu odcisków palców SHA1 uzyskanych z magazynu kluczy, z którym podpisałem aplikację. Włączyłem Maps i Places API z konsoli. Limit nie został przekroczony.

Wszyscy ci i nadal daje mi REQUEST_DENIED

Co mi się nie wspomnieć, że mam O2Auth aktywny - czy to coś zmieni? Czy nie powinno to być tak proste, jak umieszczenie klucza API w aplikacji?

Dzięki!

Odpowiedz

26

Interfejs API Miejsc Google nie obsługuje obecnie kluczy Android lub iOS wygenerowanych z konsoli Google APIs. Obecnie obsługiwane są tylko klucze serwera i przeglądarki.

Jeśli chcesz poprosić o tę pomoc, zgłoś plik Places API - Feature Request.

+0

Jeszcze raz dziękuję, że rzuciło to wiele światła na ten numer Czy zostało to gdzieś wspomniane w dokumentacji? W samouczku autouzupełniania jest napisane, że klucz API "powinien" być przechowywany na serwerze proxy, ale wielu z nas myśli, że możemy go użyć bezpośrednio z aplikacji. –

+0

Nie jest to wspomniane w dokumentacji interfejsu API Miejsc, jednak jest wymienione w [Pomocy konsoli API] (https://developers.google.com/console/help/#generatingdevkeys): _ "Należy pamiętać, że klucze systemu Android są tylko obsługiwane przez niektóre interfejsy API "_. –

+0

i co jeśli chcę przetestować to z mojej przeglądarki internetowej, nie ma szansy na pracę? – andi

4

https://developers.google.com/places/training/autocomplete-android

Przechowywanie Klucz API

Chociaż powyższy kod demonstruje, jak komunikować się bezpośrednio między aplikacji Android i usługi Miejsca autouzupełniania, należy nie przechowywać swoje miejsca klucz API z telefonem aplikacja.

Należy zatem zbudować aplikację internetową przechowującą klucz API i pełniący rolę proxy w usługach API lokalizacji. Aby zabezpieczyć komunikację między aplikacją na Androida a usługą proxy, należy wymagać uwierzytelnienia użytkownika w usłudze sieciowej proxy. Twoja aplikacja na Androida może bezpiecznie przechowywać dane uwierzytelniające użytkownika i przekazywać je do usługi internetowej, lub użytkownik może zalogować się do aplikacji internetowej za pośrednictwem Android WebView.

W tym drugim przypadku aplikacja internetowa powinna utworzyć i zwrócić użytkownikowi token uwierzytelniający użytkownika do aplikacji dla systemu Android, a aplikacja na Androida powinna następnie przekazać ten token do usługi sieciowej proxy.

+0

Jest to związane z kluczowymi zabezpieczeniami, a nie z rozwiązywaniem pytania OP –

+1

to jest odpowiedź na pytanie, szybkie naprawienie to użycie klawisza przeglądarki i zezwolenie na dowolne odnośnik, ale metoda opisuje dokumentację jest drogą do zrobienia. – overlii

+0

Ta odpowiedź naprawdę powinna być głosowana znacznie wyżej. Chociaż najwyżej oceniona odpowiedź pokazuje sposób obejścia klucza API bezpośrednio na urządzeniu, zaleceniem firmy Google jest * nie * przechowywanie danych uwierzytelniających bezpośrednio na urządzeniu, ponieważ można je łatwo pobrać. – markquezada

93

Mimo, że odpowiedź na to pytanie, myślę, że społeczność może zrobić lepiej.

Rozdzierałem sobie włosy na ten temat, to po prostu nie miało dla mnie sensu. Robiłem aplikację na iOS/Android, więc zrobiłem klucz iOS/Android ... Nieprawidłowy.

Dzięki Google Places API Twój identyfikator pakietu nie jest nawet brany pod uwagę.

Co naprawdę chcesz zrobić to: (używam nowy interfejs użytkownika)

1. Zaloguj się https://cloud.google.com/console#/project

Wybierz nazwę projektu, a następnie przejść do API & Auth> APIs

Upewnij się, że masz włączony interfejs API Miejsc. Jest to jedyna rzecz, która musi być włączona, aby interfejs API Miejsc działał. enter image description here

2. Przejdź do poświadczenia

kliknij przycisk Utwórz nowy klucz pod API publicznego dostępu enter image description here

3. Wybierz przeglądarka KEY enter image description here

4. Kliknij przycisk Utwórz, Nic innego

Zostaw puste pole HTTP Refer.

enter image description here

5. Za pomocą klawisza Generated tutaj

Ten klucz pozwoli dowolnemu użytkownikowi dostęp z dowolnego urządzenia do API za pomocą loginu Developer. Można spróbować go tutaj: (Pamiętaj, aby zastąpić YOUR_KEY_HERE z wygenerowanego klucza)

https://maps.googleapis.com/maps/api/place/autocomplete/json?input=Food%20Sh&sensor=false&radius=500&location=0,0&key=YOUR_KEY_HERE 

6. Ciesz

Teraz można korzystać z tego adresu URL powyżej w urządzeniu Android/iOS .

+0

Świetna pomoc od Ciebie. !!!!! – user1673099

+0

Odpowiedź udzielona przez @Arc sprawia, że ​​odpowiedź brzmi jak "niepewna szybka naprawa" w przeciwieństwie do prawidłowej techniki produkcji. Ale nadal nie jestem pewien. Klucz przeglądarki używany w zwykłej przeglądarce internetowej jest bardzo narażony na kradzież i ponowne użycie (łatwo jest udawać, że jest to nagłówek REFERRERA). Klucz przeglądarki używany w aplikacji Andriod/iOS jest o wiele trudniejszy do wykradzenia - przeczesuje binarny atak aplikacji lub MIM przy połączeniu SSL z Google. To dziwne, że Google pozostawia to tak niejasnym. – mpoisot

+0

Trochę dziwne, ale działa. Nie mogę znaleźć żadnego wyraźnego odniesienia do tego w ich dokumentach. Dziękuję Ci. – elbuild

0

W konsoli programisty Google, powinieneś być w stanie znaleźć zarówno "Places API" i "Places API dla Androida"

dev console search

upewnij się, aby użyć "Places API dla Androida"

Z jakiegoś powodu "API miejsca dla Androida" jest ukryty na liście API, ale można uzyskać do niego dostęp za pomocą wyszukiwarki.

+0

Czy mówisz, że zabezpieczyłeś interfejs API Miejsc Google dla Androida za pomocą odcisków palców + nazwy pakietu SHA1 i wykonujesz połączenia * bezpośrednio * z aplikacji do API i * nie * otrzymujesz Request_Denied? Zrobiłem to i nadal widzę Request_Denied. – Baker

0

miałem ten sam problem, to naprawić poprzez pozostawienie

Zebrane wnioski od tych kierujących HTTP (strony WWW) (opcjonalnie)

w przeglądarce klucz Empty

0

jestem wciąż nowe, więc nie mogę komentować, ale aby rzucić trochę światła na odpowiedź Moe, rozwiązałem niektóre podobne problemy z Google Maps API dotyczące zapytań adresów URL (wskazówki, używając Volley), wykonując następujące czynności:

  1. Uzyskaj klucz API Androida (w tym Google Maps Directions API w moim przypadku).
  2. Uzyskaj klucz API "Server" (który wydaje się być tworzony za pomocą kluczowego ograniczenia "odesłania HTTP" w tych dniach - naprawdę, jest używany tylko do wysyłania zapytań URL przez HTTP).
  3. Zapisz klucz Androida API jako znacznik meta-data w tagu application w AndroidManifest.xml z android:name="com.google.android.maps.v2.API_KEY" i android:value jako klucz. Służy do bezpośredniej interakcji z interfejsem API Map Google (bez zapytań o adresy URL).
  4. Użyj klucza API serwera podczas wysyłania kwerend URL.

Nie jestem pewien, czy dotyczy to również zapytań o adresy URL w interfejsie API Miejsc, jeśli potrzebujesz tylko klucza API serwera, lub jeśli istnieje lepsze rozwiązanie, ale to zadziałało.

Wyobrażam sobie, że działa tylko z pierwszym kluczem - tym, który nie jest ograniczony do systemu Android.

Powiązane problemy