我正在尝试使用Google API中提供的地图演示 样本项目。我正在使用AVD并尝试使用版本8,10 和11并得到同样的问题。
我已经生成了自己的调试密钥并添加到了项目中。我可以看到 应用程序上的地图启动,并可以放大等 - 所以我得到了地图 瓷砖,很好。 是的 - 我在Manifest中设置了正确的权限和库 文件(根据样本)。
但是,我无法通过DDMS或Telnet在地图上设置位置。一世 在LogCat中看到以下错误: MapActivity:无法获取连接工厂客户端
我已经阅读了很多关于这个问题的主题,但他们似乎总是如此 由于API密钥错误导致的;这是我没有的,就像我一样 检索地图图块。
所以我创建了自己的项目来进一步测试,并且正在执行 以下代码初始化我的地图:
myLocationOverlay = new MyLocationOverlay(this, mapView);
mapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
myLocationOverlay.enableMyLocation();
Log.i("funkatron: ", "ABOUT TO CALL RUN ON FIRST FIX");
myLocationOverlay.runOnFirstFix(new Runnable() {
public void run() {
String loc = "we have a location, executing AnimateTo().
"+myLocationOverlay.getMyLocation().toString();
Log.i("funkatron:",loc);
mapController.animateTo(myLocationOverlay.getMyLocation());
}
});
我看到了我的第一个日志语句,但从来没有看到第二个,而且“MapActivity: 无法获得连接工厂客户端“写入LogCat 点。
我已经读过SDK v8模拟器存在问题,所以我有 试过v10和11 - 但仍然没有喜悦。 我还没有在实际设备上试过这个 - 很快就会做到。
对此问题的任何帮助都将非常感激 - 这是真的 困惑我;)
欢呼声
答案 0 :(得分:6)
我和你描述的初始情况完全一样。
当你看到地图图块时,显然有一些人看不到地图上的位置:
<强> 1。你需要一个位置。 我认识到仅通过DDMS视图设置地理位置到模拟器是不够的。每次DDMS中的“发送”按钮都必须明确按下以在模拟器上触发位置更新。 (只是提一下:在一个真实的设备上,你有时会走一点让你的设备得到一个位置更新;),我很生气,直到我走来走去想着现在该做什么^^)
<强> 2。你需要一个正确的ItemizedOverlay实现与正确的OverlayItem 。 我写了自己的叠加层,有点“复杂”。如果您不确定您的实施是否正确,请使用本指南创建一个只需最少更改的实施Map view tutorial android developers
或使用此:
private class MyItemizedOverlay extends ItemizedOverlay {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
public MyItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public void addOverlay(OverlayItem overlay) {
mOverlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return mOverlays.get(i);
}
@Override
public int size() {
return mOverlays.size();
}
}
private void updateLocationOverlay() {
if (location == null) { return };
List<Overlay> mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.XXXX);
MyItemizedOverlay myItemizedOverlay = new MyItemizedOverlay(drawable);
GeoPoint point = new GeoPoint((int)(location.getLatitude() * 1E6), (int)(location.getLongitude() * 1E6));
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
myItemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(myItemizedOverlay);
}
我想特别指出你必须在drawable上调用boundCenter或boundCenterBottom。否则它不会被绘制。如果你在overlayItem.setMarker的同一个叠加层中使用不同的标记,也要小心,你也可以在那里调用它。
第3。你必须将地图上的视图移动到你的位置。你可以这样做:
MapController mapController = mapView.getController();
mapController.setCenter(point)
我认识到函数 mapController.zoomToSpan 不起作用。 (至少对我而言,我仍在开发此应用程序)。也许与 animateTo 相同。我没试过。设置中心工作。 (还有setZoom级别)。
也许我提到的观点中有些内容可能会导致您的地图无法正常运作。
祝你好运!编辑:我忘了提到我仍然得到工厂客户端错误,即使它可以获得一个有效的位置,真正的设备和虚拟模拟器通过ddms发送)。我暂时忽略了。
答案 1 :(得分:4)
请确保您在应用AndroidManifest.xml中使用权限。
在AndroidManifest.xml中添加这3行
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
还要确保密钥库指向您创建的密钥库。
在日食检查窗口 - &gt;首选项 - &gt; Android - &gt;构建:默认调试密钥库,指向您使用keytool创建的密钥,否则使用“浏览”按钮并指向实际密钥。
答案 2 :(得分:4)
Hello开发人员,
我也经历过这个问题,花了将近半天的时间试图弄清楚发生了什么。最初地图活动根本不会显示,我收到一条错误,指出“无法获取连接工厂客户端”,而这又导致了另一个错误,“java.io.IOException:Server返回3”。
造成这种情况的原因是Google未能有效地与其开发基础进行通信,即在开发过程中,即在签署和发布应用程序之前,您必须使用在测试时使用的调试密钥对应用程序进行签名。为此,请按照以下方法使用您自己的密码替换[密码]和[密钥密码]。
从.android目录中,发出以下命令:
keytool -list -alias androiddebugkey -keystore debug.keystore storepass [password] -keypass [key password]
完成上述操作后,您将很高兴收到MD5证书指纹,您可以使用该指纹注册Google地图API密钥。替换项目中的Google Maps API密钥,执行Project Clean并重新运行您的应用程序。您现在应该可以查看您的Google地图并摆脱烦人的错误。
答案 3 :(得分:2)
我遇到了同样的问题,问题是当我为MapActivity设置合适的布局时我错过了 代码是
setContentView(R.layout.main);
main.xml布局文件不包含任何mapview
它成了
setContentView(R.layout.mapview)
具有以下XML代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="YOU_API_KEY"
/>
</LinearLayout>
地图现在正在运行fid,希望这会有所帮助
此外,您可以检查是否在mapview布局中添加了任何内容,因为添加此类视图会导致此错误
答案 4 :(得分:2)
我遇到了同样的问题&#34; MapActivity无法获得连接工厂客户端&#34; 我解决这个问题的方式非常简单!我刚刚卸载了整个应用程序并重新安装了它。它工作!!!
答案 5 :(得分:0)
我在 main.xml
下遇到了同样的问题<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="Your API-KEY"
/>
</LinearLayout>
然后我将 main.xml 更改为如下,问题解决了
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="Your API-KEY"
/>
答案 6 :(得分:0)
这种情况似乎有多种原因。我已修复它将我的项目构建目标更改为api 10(在项目/属性/ Android上单击rclick)然后在api级别15的模拟器上运行(尽管非常非常慢!)。
答案 7 :(得分:0)
有人在评论中说过:重新启动手机。 或者,如果您在模拟器中运行:重新启动模拟器。