Próbuję włączyć nowy interfejs API Map Google do systemu Android w wersji 2 do aplikacji przy użyciu biblioteki pomocy systemu Android. Przeszedłem wiele iteracji, aby spróbować dostać się do pracy, a teraz zrezygnowałem i pomyślałem, że powinienem zapytać tutaj.Google Maps Android API v2 wyrzuca GooglePlayServicesNotAvailable wyjątek, nieaktualny, SupportMapFragment.getMap() zwraca null
Poszedłem do konsoli API, utworzyłem projekt, włączyłem Google Maps API v2 dla Androida, utworzyłem klucz debugujący zgodnie z wymaganiami i wkleiłem go do manifestu. Brak problemów z uwierzytelnianiem lub coś podobnego. Jestem pewien, że zrobiłem to dobrze.
W folderze Mój projekt libs
wstawiam android-support-v4.jar
(przez projekt prawym przyciskiem myszy-> Android-> Dodaj bibliotekę wsparcia ...). W Eclipse zrobiłem File-> Import-> Android-> Existing Android Code Into Workspace i zaimportowałem najnowszą wersję (rev 3) android-sdk/google/google_play_services/libproject/google-play-services_lib. Potem dodaje się go jako biblioteka zależność do mojego projektu (projekt prawym click> Ustawienia-> Android-> Dodaj go jako biblioteka uzależnienia od dołu
w moim manifest mam.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...>
<permission
android:name="myapp.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<All the uses-permission required like INTERNET, ACCESS_NETWORK_STATE, WRITE_EXTERNAL_STORAGE, FINE AND COARSE LOCATION, etc>
<uses-permission android:name="myapp.permission.MAPS_RECEIVE"/>
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<application ...>
...
<uses-library android:name="com.google.android.maps" />
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AI..."/>
</application>
W moim mainview.xml mam:
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
teraz na MainView.java mam:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
public class MainView extends FragmentActivity ... {
private GoogleMap mMap;
@Override
protected void onResume() {
...
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map);
SupportMapFragment mapFragment = (SupportMapFragment)fragment;
mMap = mapFragment.getMap();
//PROBLEM: mMap is null here even though mapFragment is not
}
}
Potem tho ught pewnie trzeba zainicjować fragmenty więc dodałem w moim onCreate
po ustawieniu widoku treści:
//Fragments
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, SupportMapFragment.newInstance());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();
Wtedy powiedziałem, może to nie SupportMapFragment
ale faktycznie powinna odnosić się do rzeczywistego fragmentu, aw moim onResume
I wykonano:
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.map);
SupportMapFragment mapFragment = (SupportMapFragment)fragment;
//Fragments
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, mapFragment);
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();
mMap = mapFragment.getMap();
mMap
ponownie jest pusty.
Potem zobaczyłem, że jest klasa MapsInitializer
, więc pomyślałem, że najpierw powinienem to zrobić.
Więc dodaniu kodu przed uzyskaniem fragmentu w powyższym kodzie:
try {
MapsInitializer.initialize(this);
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
Dzięki tej logcat zgłoszone ostrzeżenie (linia 313 jest MapsInitializer.initialize(this)
):
com.google.android.gms.common.GooglePlayServicesNotAvailableException
at com.google.android.gms.internal.n.c(Unknown Source)
at com.google.android.gms.internal.n.a(Unknown Source)
at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source)
at myapp.activities.MainView.inflateSelectedViewAndSetData(MainView.java:313)
at myapp.activities.MainView.onClick(MainView.java:642)
at android.view.View.performClick(View.java:3153)
at android.view.View$PerformClick.run(View.java:12148)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:4615)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Przez moich prób Logcat zgłasza następujące ostrzeżenie:
Google Play services out of date. Requires 2010100 but found 1013
To może być a/winowajca, ale nie znalazłem rozwiązania.
W tym momencie nie mam pomysłów. Przeczytałem kilka wątków here, here, here, ale żadna z sugestii nie rozwiązała problemu. W tym ostatnim przypadku sugerują, że nie uwzględniają zależności projektu i tylko dołączają plik jar. Cóż, to nie zadziałało, albo używając google-play-services.jar
z folderu google-play-services_lib/libs
, albo eksportując własny jar z tego projektu.
Przy okazji używam rzeczywistego urządzenia (2.3.5 i tabletu z 3.2), a nie emulatora.
Każda pomoc doceniona z całego serca. :)
UPDATE:
Roztwór poniżej w qubitu.
Jak daleko eksportu zależność biblioteka, zgrabny sposób, aby nie miały do czynienia z tym (co jest uciążliwe gdy ma do czynienia z repozytoriów) jest użycie FatJar i wyeksportować projekt google_play_services_lib
(co nie utworzyć lokalną kopię z ponieważ po aktualizacji nie chcę ponownie importować) i dołączyć plik wyjściowy słoika tłuszczu do projektu jako inny plik jar. UWAGA: Wybierając pliki jar, które mają być dołączone do słoika, musiałem wykluczyć plik annotations.jar
, ponieważ był on już wstępnie dołączony i powodował błędy podczas duplikowania. Teraz wszystko, co muszę zrobić, to dołączyć google_play_services_rev_3.jar
do folderu mojego projektu libs
i jestem gotowy do pracy.
Ponieważ nie jest to odpowiedź na Twój problem, dam to tylko jako komentarz: gdy nie chcesz robić więcej niż lokalizacji opartej na GPS/WLAN, pokazywanie map, rysowanie na pokazanych mapach I "Zaleca się używanie klas z http://sourceforge.net/projects/libwlocate/. IMHO są znacznie łatwiejsze w obsłudze i zapewniają wsparcie dla kilku typów map. – Elmi
To "google_play_services_rev_3.jar" powinno być ogólne, tak samo działa dla każdego projektu i konfiguracji, jak przypuszczam?Dzięki za podpowiedź FatJar, mam teraz swój projekt pracujący w Jenkins CI z tą procedurą. – JaakL
@JaakL Tak, jest to ogólne i można go zaimportować do dowolnego projektu. :) – iliask