Google Maps Android API v2 выбрасывает исключение GooglePlayServicesNotAvailableException, устарело, SupportMapFragment.getMap () возвращает ноль
Я пытаюсь включить новый Google Maps Android API v2 в приложение, используя библиотеку поддержки Android. Я'Я прошел много итераций, чтобы попытаться найти работу, и теперь я сдался и решил спросить здесь.
Я пошел в консоль API, создал проект, включил Google Maps API v2 для Android, создал отладочный KEY по мере необходимости и вставил его в манифест. Нет проблем с аутентификацией или что-то в этом роде. Я уверен, что сделал все правильно.
В моем проектеlibs
папку я положилandroid-support-v4.jar
(через проект щелкните правой кнопкой мыши ->Android->Добавить библиотеку поддержки ...). В Eclipse я сделал File->Import->Android->Существующий код Android в рабочую область и импортирован последний (версия 3) android-sdk / google / google_play_services / libproject / google-play-services_lib. Затем я добавил ее как библиотеку зависимостей в свой проект (правой кнопкой мыши ->свойства->Android->Добавьте его как библиотечную зависимость снизу.
В моем манифесте я имею:
...
В моем mainview.xml у меня есть:
Теперь на MainView.java у меня есть:
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
}
}
Тогда я подумал, что мне, вероятно, нужно инициализировать фрагменты, поэтому я добавил в свойonCreate
после настройки просмотра содержимого:
//Fragments
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.map, SupportMapFragment.newInstance());
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.commit();
Тогда я сказал, может быть, этонеSupportMapFragment
но я на самом деле должен ссылаться на фактический фрагмент, и в моемonResume
Я сделал:
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
снова нуль после этого.
Потом я увидел, что естьMapsInitializer
класс, так что я подумал, может быть, я должен назвать это первым.
Поэтому я добавил код перед получением фрагмента в приведенном выше коде:
try {
MapsInitializer.initialize(this);
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
С этим LogCat сообщил о предупреждении (строка 313 является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)
В ходе моих попыток Logcat сообщал следующее предупреждение:
Google Play services out of date. Requires 2010100 but found 1013
Это может быть виновником, но я не нашел решения.
На данный момент у меня нет идей. Я читаю несколько темВот,Вот,Вот но ни одно из предложений не решило проблему. В последнем случае они предлагают не включать зависимость проекта и просто включать файл jar. Ну, это тоже не сработало, используя либоgoogle-play-services.jar
отgoogle-play-services_lib/libs
папку или экспорт моей собственной банки из этого проекта.
Кстати работаю на реальном устройстве (2.3.5 и планшете с 3.2), а не на эмуляторе.
Любая помощь искренне приветствуется. :)
ОБНОВИТЬ:
Решение ниже по кубиту.
Что касается экспорта библиотечной зависимости, то нужно использовать аккуратный способ не иметь с ней дело (что является проблемой при работе с репозиториями).FatJar и экспортироватьgoogle_play_services_lib
проект (который я не создал локальную копию, потому что, когда он обновляется, я нене хотите повторно импортировать), и включите выходной файл JAR в ваш проект в качестве другого файла JAR. ПРИМЕЧАНИЕ. При выборе файлов JAR для включения в JAR-файл необходимо было исключитьannotations.jar
файл, поскольку он уже был предварительно включен и вызывает ошибки для дублирования. Теперь все, что мне нужно сделать, это включитьgoogle_play_services_rev_3.jar
в моем проектеlibs
папка и мне хорошо идти.