web-dev-qa-db-fra.com

Android MapActivity: impossible d'obtenir le client de la fabrique de connexions

J'essaie de faire fonctionner les démonstrations de carte, comme indiqué dans l'API Google Exemples de projets. J'utilise AVD et ai essayé avec les versions 8, 10 Et 11 et obtenir le même problème.

J'ai généré ma propre clé de débogage et ajouté au projet. Je peux voir La carte sur l’application se lancer, et peut zoomer, etc. .file (selon les échantillons).

Toutefois, je ne peux pas définir d’emplacement sur la carte, que ce soit via DDMS ou Telnet. Je constate l’erreur suivante dans LogCat: MapActivity: impossible d’obtenir le client de la fabrique de connexions

J'ai lu de nombreux sujets sur ce problème, mais ils semblent toujours être dus à une mauvaise clé API; que je n'ai pas, comme je suis récupérer des tuiles de carte.

J'ai donc créé mon propre projet pour le tester davantage et j'exécute le code suivant lors de l'initialisation de ma carte:

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

Je vois ma première instruction de journal, mais jamais la seconde, et "MapActivity: Impossible d'obtenir le client de la fabrique de connexions" est écrit dans LogCat à ce point

J'ai lu qu'il y avait des problèmes avec les émulateurs SDK v8, donc j'ai essayé avec les versions 10 et 11 - mais toujours pas de joie ... Je ne l'ai pas encore essayé sur un périphérique réel - le fera bientôt.

Toute aide sur ce sujet serait grandement appréciée - c’est vraiment Déroutant;)

à votre santé

14
electricSunny

j'ai eu exactement la même situation initiale que vous avez décrite.

quand vous voyez les tuiles de la carte, il en manque visiblement pour voir une position sur la carte:

1. vous avez besoin d’un emplacement . J’ai reconnu qu’il ne suffisait pas de définir une position géographique via l’affichage DDMS. vous devez appuyer explicitement à chaque fois sur le bouton "Envoyer" dans DDMS pour déclencher une mise à jour de la localisation de votre émulateur . (juste pour mentionner: sur un périphérique réel, vous devez parfois marcher un peu pour que votre périphérique obtienne une localisation. mise à jour;), j'étais tellement énervé que je me suis promené en pensant à quoi faire maintenant ^^)

2. vous avez besoin d'une implémentation correcte de ItemizedOverlay avec un OverlayItem ..__ correct. J'ai écrit ma propre superposition qui s'est un peu compliquée. si vous n'êtes pas sûr que votre implémentation est correcte, utilisez ce guide pour créer une implémentation avec des modifications minimes Tutoriel sur l'affichage de la carte Développeurs Android

ou utilisez ceci:

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

je tiens à souligner que vous devez appeler boundCenter ou boundCenterBottom sur le dessin. sinon, il ne sera pas tiré. soyez également prudent si vous utilisez différents marqueurs dans la même superposition avec overlayItem.setMarker, que vous l’appeliez aussi.

3. vous devez déplacer la vue sur la carte vers votre point. vous pouvez réaliser ceci comme ceci:

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

j'ai reconnu que la fonction mapController.zoomToSpan} _ ne fonctionnait pas. (au moins pour moi, je développe encore sur cette application). Peut-être que c'est la même chose avec animateTo. je n'ai pas essayé. set center fonctionne. (et setZoom level également).

Peut-être y at-il quelque chose dans les points que j'ai mentionnés qui pourrait conduire à ce que votre carte ne fonctionne pas comme vous le souhaitez.

Bonne chance!

edit: j’ai oublié de mentionner que j’obtiens toujours cette erreur de client d’usine même si cela fonctionne pour obtenir un emplacement valide, réel sur le périphérique et simulé sur l’émulateur via ddms send). J'ignore juste pour l'instant.

6
Diego Frehner

Veuillez vous assurer que vous utilisez les autorisations dans votre application AndroidManifest.xml.

ajouter ces 3 lignes dans 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"/>

Assurez-vous également que le magasin de clés pointe sur le magasin de clés que vous avez créé.

Dans la fenêtre de contrôle Eclipse -> Préférences -> Android -> Construire: Le magasin de clés de débogage par défaut pointe vers la clé créée à l'aide de keytool. Sinon, utilisez le bouton Parcourir et pointez sur la clé réelle.

4
Prem

Bonjour chers développeurs,

J'ai moi aussi vécu ce problème et passé près d'une demi-journée à essayer de comprendre ce qui se passait. Initialement, l'activité de la carte ne s'affichait pas du tout et je recevais une erreur indiquant, "Impossible d'obtenir le client de la fabrique de connexions", ce qui a créé une autre erreur, "Java.io.IOException: le serveur a renvoyé 3".

Cela s’explique par le fait que Google n’a pas réussi à communiquer efficacement avec sa base de développement. Par conséquent, avant de signer et de publier votre application, vous devez signer votre application avec une clé de débogage utilisée lors des tests. Pour ce faire, suivez la méthode ci-dessous en remplaçant le [mot de passe] et le [mot de passe clé] par vos propres mots de passe.

Depuis votre répertoire .Android, lancez la commande suivante:

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

Ce faisant, vous serez ravi de recevoir votre empreinte digitale de certificat MD5 que vous pourrez utiliser pour vous inscrire à la clé de votre API Google Maps. Remplacez la clé de votre API Google Maps dans votre projet, effectuez un nettoyage de projet et réexécutez votre application. Vous devriez maintenant pouvoir visualiser votre carte Google et vous débarrasser de vos erreurs gênantes.

Comment obtenir une clé API Google Maps Android

4
Mat

J'ai rencontré le même problème et le problème était que j'ai manqué lorsque j'ai défini la mise en page appropriée sur MapActivity Le code était 

setContentView(R.layout.main);

le fichier de mise en page main.xml ne contient aucune mapview 

c'est devenu

setContentView(R.layout.mapview) 

qui ont le code XML suivant

<?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>

La carte fonctionne maintenant, espérons que cela aiderait

Vous pouvez également vérifier si vous avez ajouté quelque chose à votre mise en page mapview, car l’ajout de telles vues entraînerait cette erreur.

2

J'ai eu le même problème avec "MapActivity ne pouvait pas obtenir le client d'usine de connexion" La façon dont j'ai résolu le problème était très simple! Je viens de désinstaller toute l'application et de le réinstaller. Ça a marché!!!

2
user1161829

Il semble y avoir plusieurs raisons à cela. Je l'ai corrigé en modifiant ma cible de construction de projet sur api 10 (cliquez sur le projet/Propriétés/Android), puis sur un émulateur au niveau de l'api 15 (bien que très, très lentement!).

0
Broo

Quelqu'un là-haut l'a déjà dit dans un commentaire: Redémarrez le téléphone ..__ ou si vous utilisez l'émulateur: redémarrez l'émulateur.

0
Seppo Jokinen

J'ai eu le même problème avec ci-dessous 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>

Puis j'ai changé le main.xml comme ci-dessous, le problème a été résolu

<?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
Leo