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

时间:2011-05-15 06:17:58

标签: android google-maps mapactivity mylocationoverlay

我正在尝试使用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 - 但仍然没有喜悦。 我还没有在实际设备上试过这个 - 很快就会做到。

对此问题的任何帮助都将非常感激 - 这是真的 困惑我;)

欢呼声

8 个答案:

答案 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地图并摆脱烦人的错误。

How to obtain a Google Maps Android API Key

答案 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)

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