Android MapActivity:无法获取连接工厂客户端

我试图让Google地图演示程序正常工作,正如Google API示例项目中所提供的。 我正在使用AVD,并尝试过版本8,10和11,并得到相同的问题。

我已经生成了我自己的debugging密钥并添加到项目中。 我可以看到应用程序启动地图,并可以放大等 – 所以我得到的地图瓷砖,罚款。 是的 – 我在Manifest文件中设置了正确的权限和库(按照样本)。

但是,我无法通过DDMS或Telnet在地图上设置位置。 我在LogCat中看到以下错误:MapActivity:无法获取连接工厂客户端

我已经阅读了关于这个问题的许多线索,但他们似乎总是作为一个糟糕的API密钥的结果; 我没有,因为我正在检索地图瓷砖。

所以我创build了我自己的项目来进一步testing,并在我的映射初始化时执行以下代码:

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 – 但仍然没有喜悦。 我还没有尝试过这个实际的设备 – 将尽快。

在这个问题上的任何帮助将不胜感激 – 这真的让我困惑;)

干杯

我和你刚才描述的完全一样。

当你看到地图图块时,显然有一些在地图上看不到的位置:

你需要一个位置 。 我认识到仅通过DDMS视图设置地理位置到模拟器是不够的。 你必须明确地按下DDMS中的“发送”button来触发模拟器上的位置更新。 (只是提及:在一个真正的设备,你有时走一点,使您的设备得到位置更新;),我非常生气,直到我走过去想现在该怎么做^^)

2.你需要一个正确的OverlayItem实现ItemizedOverlay 。 我写了自己的覆盖,有点“复杂”。 如果您不确定您的实现是否正确,请使用本指南以最less的更改来创build实现Map视图教程Android开发人员

或者使用这个:

 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相同的叠加层中使用不同的标记,那么也要小心,你也可以在那里调用它。

你必须把地图上的视图移到你的观点 。 你可以做到这一点:

 MapController mapController = mapView.getController(); mapController.setCenter(point) 

我认识到, mapController.zoomToSpan函数不起作用。 (至less对我来说,我还在开发这个应用程序)。 也许它与animateTo一样 。 我没有尝试。 设置中心作品。 (并设置缩放级别)。

也许在我提到的几点中可能会导致你的地图不能像你想要的那样工作。

祝你好运!

编辑:我忘了提及,我仍然得到该工厂客户端错误,即使它的工作原理是获得一个有效的位置,真正的设备上,仿真器上通过ddms发送假)。 我现在只是忽略了。

请确保您在应用程序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"/> 

并确保密钥库指向您创build的密钥库。

在eclipse Check Window – > Preferences – > Android – > Build:Default Debug keystore中,指向您使用keytool创build的密钥,否则使用Browsebutton并指向实际的密钥。

各位开发者,

我也经历过这个问题,花了近半天的时间试图弄清楚发生了什么事情。 最初,地图活动根本不会显示,我收到一个错误,指出“无法获取连接工厂客户端”,这反过来又创build了另一个错误“java.io.IOException:Server returned 3”。

造成这种情况的原因是Google无法有效地与其开发基地进行有效沟通,即在开发过程中(即在签署和发布应用程序之前),必须使用在testing时使用的debugging密钥对应用程序进行签名。 为此,请按照以下方法用您自己的密码replace[密码]和[密码密码]。

从.android目录中,发出以下命令:

 keytool -list -alias androiddebugkey -keystore debug.keystore storepass [password] -keypass [key password] 

完成上述操作后,您将很高兴收到您的MD5证书指纹,您可以使用它来注册您的Google地图API密钥。 在您的项目中replace您的Google Maps API密钥,执行Project Clean并重新运行您的应用程序。 你现在应该能够查看你的Google地图,并摆脱你烦人的错误。

如何获取Google Maps Android API密钥

我有同样的问题“MapActivity无法获得连接工厂客户端”我解决这个问题的方式非常简单! 我只是卸载整个应用程序,并重新安装它。 有效!!!

我面临同样的问题,问题是我错过了当我设置适当的布局的代码是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布局,因为添加这样的视图会导致这个错误

这似乎有多种原因发生。 我已经修复了它改变我的项目生成目标到api 10(点击项目/属性/ Android),然后在api级别15(尽pipe非常,非常慢!)在模拟器上运行。

我在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" /> 

有人在评论中已经说过:重新启动手机。 或者如果你在模拟器中运行:重新启动模拟器。