2011-05-15 5 views
14

Я пытаюсь работать с демонстрационными картами Map, как показано в примерах проектов API Google . Я использую AVD и пробовал с версиями 8, 10 и 11 и получал ту же самую проблему.Android MapActivity: Не удалось получить соединение с заводским клиентом

Я создал собственный ключ отладки и добавлен в проект. Я вижу карту при запуске приложения, и может увеличивать и т. Д. - поэтому я получаю карту плиток, отлично. Да - у меня есть правильные разрешения и библиотека, установленные в файле манифеста (согласно образцам).

Но я не могу установить местоположение на карте, используя 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

@funaktron: «Но я не могу установить местоположение на карте, либо через DDMS, либо через Telnet. Я вижу следующую ошибку в LogCat: MapActivity: не удалось получить соединение с заводским клиентом» - эта ошибка не имеет ничего общего с вашим кодом. Каждый получает это, даже с рабочим кодом. Что касается вашей проблемы, я никогда не пытался использовать «MyLocationOverlay» на эмуляторе с фактическим исправлением, поэтому я понятия не имею, работает ли оно. Эмулятор SDK 8 на самом деле хороший. Не используйте эмуляторы SDK 9/10, так как они будут повреждены при попытке установить фальшивое местоположение. Эмулятор SDK 11 должен работать, если он не слишком медленный для вас. – CommonsWare

+0

@CommonsWare: Спасибо за сообщение. После дальнейших тестов один и тот же код работает на устройстве, то есть наложение наложения карты, поэтому его явно просто эмулятор. Хотя интересно, что никто не может ответить, почему появляется ошибка; вопрос все еще остается. – electricSunny

ответ

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); 
} 

я хочу особо подчеркнуть, что вы должны вызвать boundCenter или boundCenterBottom на доступном.иначе он не будет нарисован. будьте также осторожны, если вы используете разные маркеры в том же наложении с overlayItem.setMarker, что и вызываете его там.

3. Вам необходимо переместить представление о карте в пункт:. Вы можете достичь этого, как это:

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

я признал, что функция mapController.zoomToSpan не работает. (по крайней мере для меня, я все еще разрабатываю это приложение). возможно, это то же самое с animateTo. Я не пытался. установленный центр работает. (и setZoom).

Возможно, в упомянутых вами точках есть что-то, что может привести к тому, что ваша карта не работает так, как вы хотите.

Удачи вам!

Редактировать: я забыл упомянуть, что я все еще получаю эту ошибку заводского клиента, даже если он работает, чтобы получить правильное местоположение, реально на устройстве и подделку на эмуляторе через ddms send). Я просто игнорирую сейчас.

+0

Диего, спасибо за ответ. Я собираюсь дать ему завихнуться и вернуться к вам. Cheers – electricSunny

+0

Я хочу, чтобы библиотека работала в устройстве, если я подписываю файл APK. Если я начну работать в Debug-Mode, он будет работать очень хорошо ... любые идеи? –

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

Пожалуйста убедитесь, что вы используете разрешения в своем приложении AndroidManifest.xml.

добавить эти 3 строки в AndroidManifest.xml

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

А также убедитесь, что хранилище ключей указывает на хранилище вы создали.

В окне проверки eclipse -> Настройки -> Android -> Построение: по умолчанию Debug keystore, указывает на ключ, созданный с помощью keytool, иначе используйте кнопку «Обзор» и укажите фактический ключ.

+4

ACCESS_COARSE_LOCATION не требуется. –

2

У меня была такая же проблема с «MapActivity Не удалось получить соединение с клиентом фабрики» То, как я исправил проблему, было очень простым! Я просто удалил все приложение и переустановил его. Это сработало!!!

+0

Привет! У меня тоже есть проблема ... поэтому я хочу спросить, что вы имеете в виду, переустановив приложение? Потому что мы просто запускаем его в эмуляторе ... вы хотите переустановить наше приложение в эмуляторе? Спасибо заранее! : D –

+0

Я тоже сталкиваюсь с той же проблемой, и я также не понимаю, что она устанавливает и деинсталлирует, мы используем простой эмулятор. –

+0

Мне это перестало работать после игры с разными версиями sdk. Попытка вернуть его к первой версии, но безуспешно. Почти перестать пытаться, когда у меня есть другая идея: почему бы не перезапустить телефон после установки и повторной установки приложения. наконец, это сработало. – cosmincalistru

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> 

Тогда я изменил главный.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" 
/> 
0

Там, кажется, Mulitple причины для этого случая. Я исправил это, изменяя мою цель построения проекта на api 10 (rclick в проекте/Свойства/Android), а затем работает на эмуляторе на уровне api 15 (хотя и очень, очень медленно!).

4

Здравствуйте, товарищи разработчики

Я тоже испытал эту проблему и провел почти половину дня, пытаясь выяснить, что происходит. Первоначально активность карты вообще не отображалась, и я получал сообщение об ошибке: «Не удалось получить соединение с заводским клиентом», который, в свою очередь, создал другую ошибку, «java.io.IOException: Server вернулся 3».

Причина в том, что Google не смогла эффективно взаимодействовать с их базой разработки, которая в процессе разработки, то есть перед подписанием и выпуском приложения, вы должны подписать свое приложение с помощью отладочного ключа, который используется во время тестирования. Для этого следуйте приведенному ниже методу, заменив пароль [password] и [key password] своими паролями.

Из вашего .android каталога, выполните следующую команду:

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

После выполнения выше, вы будете рады получить ваши отпечатки пальцев MD5 сертификата, который вы можете использовать, чтобы зарегистрироваться для ключа Google Maps API. Замените свой API API Карт Google в своем проекте, выполните проект «Очистить» и повторно запустите приложение. Теперь вы сможете просматривать свою карту Google и избавляться от своих досадных ошибок.

How to obtain a Google Maps Android API Key

+1

если команда выше не работает, попробуйте использовать android, android для обоих паролей. – Mat

+0

Я сделал то же самое, что вы упоминали, но теперь работает и показывает ту же ошибку. –

0

Кто-то там уже сказал это в комментарии Перезапустите телефон. Или, если вы используете эмулятор: Перезапустите эмулятор.