Naszło mnie wczoraj na przemyślenia na temat kluczy do API Google i narzuconych limitów.
W aplikacji korzystam z serwisów google (dokładnie to Google Maps Elevation API które wymaga klucza, oraz kilku innych API, standardowych i w żaden sposób nielimitowanych), i niemiło zorientowałem się wczoraj po sprawdzeniu konsoli developerskiej, że na GM Elevation jest narzucony globalny limit zapytań 2500/dzień/klucz (jak przekroczysz to płać, albo odcinamy dostęp do serwisu).
W aplikacji używałem tego serwisu żeby otrzymać bardzo dokładną informację o wysokości nad poziomem morza (na zasadzie podania latitude i longitude z GPS, i dla tych wartości otrzymania wyniku zwrotnego z wartością elevation). Podyktowane było to tym, że wartości wysokości z GPS/LocationServices są strasznie niedokładne, ale za to zwracają (mniej więcej) dokładną długość i szerokość geograficzną. Nie miałem jeszcze sytuacji przekroczenia limitu, ale jestem jednym użytkownikiem z jednym urządzeniem. Ostatecznie chciałem wypuścić aplikację do sklepu, z ficzerami jak zapisywanie do baz danych, ściąganie jako plik, za darmo i bez żadnych bzdetnych reklam itp., jednak już kilka(naście) osób łatwo przekroczy granicę 2500 zapytań/dzień.
Powiem szczerze, że szukałem tego wczoraj całe popołudnie oraz sporą część nocy, i nie znalazłem konkretnych odpowiedzi.
Piszę oczywiście o Androidzie, nie o web serwisach, stronach itp.
Pytania:
- Czy może źle rozumiem użytkowanie tych kluczy i odnoszą się one na zasadzie 2500 zapytań/użytkownik? Jeśli da się tak, to jak do tego podejść?
- Co stałoby się gdyby w ogóle nie używać klucza w żądaniu? Sprawdziłem sobie teraz z ciekawości i wszystko działa, na konsoli developerskiej nie wyskakuje mi żadne naliczanie nowych żądań. Czy w takiej sytuacji jest to naliczane względem IP? Czegoś innego?
- Jak w ogóle ugryźć temat ciągłego (możliwie jak najdokładniejszego, kilka razy na minutę) aktualizowania danych o wysokości?
Ktokolwiek widział ktokolwiek wie? :)
EDIT: dodaję jeszcze trochę kodu, żeby było jaśniejsze do zrozumienia o co pytam. Komentarze PL dodałem teraz.
Otrzymywanie aktualizacji nowych lokalizacji z GPS:
// konstruktor mojego location listenera (korzysta z GoogleApiClient), nie rozwijam tutaj tego dalej, bo są tam standardowe metody (zbudowanie, połączenie z serwisem)
public GoogleLocationListener() {
buildGooglePlayService();
connectGoogleAPIClient();
}
// po kliknięciu PLAY budowane jest zapytanie/żądanie o aktualizację lokalizacji (ustawia się tam kilka parametrów, takich jak odstęp czasu między kolejnymi żądaniami, dokładność itp)
@Override
public void startListenForLocations() {
// set location request
LocationRequest locationRequest = new LocationRequest();
locationRequest = setLocationRequest(locationRequest);
// build request settings
LocationSettingsRequest.Builder builder =
new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
// tutaj sprawdzane są pozwolenia, od Android API 23 otrzymywanie aktualizacji lokalizacji wymaga tego rodzaju sprawdzenia
// check for location permissions
checkLocationPermissions(mContext, locationRequest);
}
// sprawdzenie czy aplikacja otrzymała pozwolenia i wykonanie jakiejś akcji (ja dodaję tam żądanie do wykonania)
private void checkLocationPermissions(@NonNull Context context, LocationRequest locationRequest) {
// check for location permissions (required in android API 23 and above)
if ("BARDZO DŁUGI KILKULINIJKOWY WARUNEK")
} else {
// remove old location request and add new one
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this);
}
}
// później przy zmianie lokalizacji przekaż ją dalej za pomocą callback
@Override
public void onLocationChanged(Location location) {
mCallback.onNewLocationFound(location);
}
O samym GPS tyle. Lokalizacja ma względnie dokładną latitude i longitude, ale elevation/altitude jest żałośnie niedokładna (brana na żywca, może da się porobić jakieś przeliczenia na dokładniejszy wynik-> nie wiem)
Później, mając latitude i longitude chciałem skorzystać z serwisu Google Maps Elevation na zasadzie wyciągnięcia wysokości z mapy dla tego punktu koordynacyjnego przy wykorzystaniu AsyncTask. Streszczając:
standardowe połączenie za pomocą HttpURLConnection w doInBackground() i otrzymanie zwrotnych danych dla danej lokalizacji w formacie JSON:
{
"results" : [
{
"elevation" : 1608.637939453125,
"location" : {
"lat" : 39.73915360,
"lng" : -104.98470340
},
"resolution" : 4.771975994110107
}
],
"status" : "OK"
}
Z powyższego wyciągałem sobie wartość "elevation" i gitara. Mam bardzo dokładną wartość, gdy w tym samym czasie GPS zwracał wartości +/-30 metrów, albo w ogóle zero.
Cały ten kod dodałem tylko poglądowo. Sens tego tematu to początek + te trzy pytania:).
Ciekaw jestem czy ktoś z zajmujących się Androidem miał w ogóle tutaj do czynienia z takim problemem.