Я пытаюсь включить новый API Android Google Maps v2 в приложение, используя библиотеку поддержки Android. Я прошел через много итераций, чтобы попытаться найти работу, и теперь я сдался и подумал, что я должен спросить здесь.
Я пошел в API-консоль, создал проект, включил Google Maps API v2 для Android, создал необходимый отладочный ключ и вставил его в манифест. Нет проблем с проверкой подлинности или что-то в этом роде. Совершенно верно, я сделал это правильно.
В моей папке libs
я положил android-support-v4.jar
(через проект правой кнопкой мыши → Android- > Добавить библиотеку поддержки...). В Eclipse я сделал File- > Import- > Android- > Существующий код Android в рабочей области и импортировал последнюю версию (rev 3) android-sdk/google/google_play_services/libproject/google-play-services_lib. Затем я добавил его как библиотеку зависимостей в свой проект (проект правой кнопкой мыши- > Свойства- > Android- > Добавить его как зависимость библиотеки внизу.
В моем манифесте я:
<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>
В моем mainview.xml у меня есть:
<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" />
Теперь на 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
после этого снова имеет значение null.
Затем я увидел, что есть класс 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), а не эмулятор.
Любая помощь всем сердцем ценится.:)
UPDATE:
Решение ниже по кубиту.
При экспорте зависимостей библиотеки аккуратный способ не иметь дело с этим (что является болью при работе с репозиториями) заключается в использовании FatJar и экспортируйте проект google_play_services_lib
(который я НЕ создавал локальную копию, потому что когда он обновляется, я не хочу повторно импортировать), и включайте в файл проекта файл с избыточным файлом в качестве другого файла jar,
ПРИМЕЧАНИЕ. При выборе файлов jar для включения в жирную банку мне пришлось исключить файл annotations.jar
, поскольку он уже был предварительно включен и вызывает ошибки для дублирования.
Теперь все, что мне нужно сделать, это включить google_play_services_rev_3.jar
в мою папку проекта libs
, и мне хорошо идти.