【发布时间】:2012-12-05 11:24:57
【问题描述】:
我正在尝试使用 Android 支持库将新的 Google Maps Android API v2 合并到应用程序中。 我经历了多次迭代,试图找到工作的地方,现在我放弃了,认为我应该在这里问。
我去了 API 控制台,创建了一个项目,启用了适用于 Android 的 Google Maps API v2,根据需要创建了一个调试 KEY 并将其粘贴到清单上。没有身份验证问题或类似问题。很确定我做对了。
在我的项目的libs 文件夹中,我放置了android-support-v4.jar(通过项目右键单击->Android->添加支持库...)。在 Eclipse 中,我执行了 File->Import->Android->Existing Android Code Into Workspace 并导入了最新的(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 在此之后再次为空。
然后我看到有一个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
这可能是罪魁祸首,但我没有找到解决办法。
在这一点上,我没有想法。我阅读了几个线程here、here、here,但没有一个建议能解决问题。对于后者,他们建议不包括项目依赖项,只包括 jar 文件。好吧,使用 google-play-services_lib/libs 文件夹中的 google-play-services.jar 或从该项目导出我自己的 jar 都不起作用。
顺便说一下,我是在实际设备(2.3.5 和 3.2 的平板电脑)上运行,而不是模拟器。
衷心感谢任何帮助。 :)
更新:
解决方案是下面的量子位。
至于导出库依赖项,一种不必处理它的简洁方法(在处理存储库时很痛苦)是使用FatJar 并导出google_play_services_lib 项目(我没有创建一个本地副本,因为当它更新时我不想重新导入),并将输出 fat jar 文件作为另一个 jar 文件包含在您的项目中。
注意:在选择要包含在 fat jar 中的 jar 文件时,我必须排除 annotations.jar 文件,因为它已经预先包含并且会导致重复错误。
现在我所要做的就是将google_play_services_rev_3.jar 包含在我项目的libs 文件夹中,然后就可以开始了。
【问题讨论】:
-
由于这不是您的问题的答案,我将仅作为评论给出:当您不想做的不仅仅是基于 GPS/WLAN 的定位、显示地图、绘制到显示我建议使用 sourceforge.net/projects/libwlocate 的类 ouf 的地图。恕我直言,它们更容易处理并为多种地图类型提供支持。
-
这个“google_play_services_rev_3.jar”应该是通用的,对任何项目和配置都一样,我想?感谢 FatJar 的提示,现在我的项目在 Jenkins CI 中使用此程序工作。
-
@JaakL 是的,它是通用的,您可以在任何项目中导入它。 :)
标签: android google-maps android-support-library google-play-services google-maps-android-api-2