web-dev-qa-db-fra.com

Cette application ne fonctionnera pas sauf si vous mettez à jour une erreur des services Google Play.

Je suis un peu perdu en ce moment… .. J'implémente une application Android à l'aide de Google Maps.

Pour que cela fonctionne, j'ai suivi des tutoriels assez efficaces. Cependant je suis coincé avec ceci ":

enter image description here

Pour résoudre ce problème, j'ai trouvé quelques astuces ici ou ici qui indiquent que pour résoudre ce problème, vous devez utiliser une configuration spéciale pour l'émulateur. Voici le mien:

enter image description here

et d'installer du .apk sur l'émulateur.

enter image description here

Et la magie est supposée être terminée et la carte doit apparaître, ce qui n'est pas mon cas.

J'ai vérifié que mes extras étaient bien installés:

enter image description here

Voici mon AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="mypack"
          Android:versionCode="1"
          Android:versionName="1.0">

    <uses-sdk Android:minSdkVersion="16"/>

    <permission Android:name="mypack.permission.MAPS_RECEIVE"
                Android:protectionLevel="signature"/>
    <uses-permission Android:name="mypack.permission.MAPS_receive"/>

    <!-- Permission pour utiliser la connexion internet -->
    <uses-permission Android:name="Android.permission.INTERNET" />
    <!-- Permission permettant de vérifier l'état de la connexion -->
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <!-- Permission pour stocker des données en cache de la map -->
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission Android:name="com.google.Android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />

    <uses-feature
            Android:glEsVersion="0x00020000"
            Android:required="true" />

    <application Android:label="@string/app_name" Android:icon="@drawable/ic_launcher">
        <meta-data
                Android:name="com.google.Android.maps.v2.API_KEY"
                Android:value="MYKEY" />

        <meta-data Android:name="com.google.Android.gms.version"
                   Android:value="@integer/google_play_services_version" />

        <activity Android:name="Home"
                  Android:label="@string/app_name">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN"/>
                <category Android:name="Android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

Voici mon activité principale

import Android.app.Activity;
import Android.os.Bundle;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.MapFragment;

public class Home extends Activity {
    /**
     * Called when the activity is first created.
     */
    private GoogleMap map;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
    }
}

et la mise en page correspondante:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:orientation="vertical"
              Android:layout_width="fill_parent"
              Android:layout_height="fill_parent"
        >
    <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:id="@+id/map"
              Android:name="com.google.Android.gms.maps.MapFragment"
              Android:layout_width="match_parent"
              Android:layout_height="match_parent" />
</LinearLayout>

J'espère trouver une solution ou ce que j'ai manqué ici, merci d'avance.

25
Florent Gz

Dans Android SDK Manager, vous devez installer "Google API (image système x86)" sous "Android 4.4.2 (API 19)". Quittez Eclipse et redémarrez-le.

Créez ensuite un nouveau périphérique virtuel Android dans le gestionnaire AVD et choisissez "API Google x86 (Google Inc.) - API de niveau 19" comme cible. Cochez "Utiliser l'hôte GPU" pour vous assurer que le dessin de la carte sera accéléré.

Ça y est, Play Services sera préinstallé sur ce nouvel émulateur et il fonctionnera plus rapidement car il s'agit d'une image x86.

17
BladeCoder

en utilisant Android Studio, la seule chose qui m'a aidé était de réduire la version de Google Play Services dans le fichier gradle de la dernière version à ceci:

compile 'com.google.Android.gms:play-services:4.2.+'

(bien sûr, ceci est un "contournement" temporaire pour vous permettre de continuer à courir)

15
dvrm

J'ai eu un problème pour obtenir cette erreur et appuyer sur le bouton «Mettre à jour» n'a pas fonctionné, il était bloqué sur une boucle. Ce qui a fonctionné est le suivant (dans Android Studio):

  • Allez dans Outils> Android> Gestionnaire de SDK
  • Cochez l'option 'Afficher les détails du paquet'
  • Sous la version Android de votre choix (version 7.1.1 pour le moment), vérifiez Google Play Image système du système Intel x86 Atomgoogle play intel atom system image
  • Appuyez sur Appliquer/OK et laissez l’installation de l’image
  • Maintenant, allez dans Outils> Android> Gestionnaire AVD
  • Créer un périphérique virtuel
  • Sélectionnez l'un des appareils portant le logo Google Play: devices with a Google Play logo
  • Exécutez votre application dans le nouvel émulateur. Vous pouvez maintenant cliquer sur «Mettre à jour» lorsque vous obtenez l'erreur, mettre à jour les services Google Play via le Play Store sur votre appareil et tester votre application en toute tranquillité.
8
james246

Bien que les réponses fournies fonctionnent pour un émulateur, cela pourrait poser un problème réel sur un périphérique réel et ces solutions ne fonctionneront pas sur un périphérique réel. Cela peut se produire sur un ancien appareil doté d'une version obsolète des services Google Play.

Pour résoudre ce problème, la bibliothèque de services Google Play dispose d'un ensemble d'API permettant de vérifier la disponibilité des services Google Play. La classe GoogleApiAvailability fournit principalement quelques méthodes pour gérer les problèmes de disponibilité, tels qu'une version obsolète.

Maintenant, pour détecter si un appareil dispose des services Google Play ou non, je crée normalement une méthode d'assistance pour exécuter le contrôle.

private boolean checkPlayServices(){
    GoogleApiAvailability gaa = GoogleApiAvailability.getInstance();
    int result = gaa.isGooglePlayServicesAvailable(getApplicationContext());

    if(result != ConnectionResult.SUCCESS){
        if(gaa.isUserResolvableError(result)){
            gaa.getErrorDialog(this,result, REQUEST_PLAY_SERVICES_RESOLUTION).show();
        }

        return false;
    }

    return true;
}

Cette méthode d'assistance vérifie si les services Google Play sont disponibles ou non en inspectant le code d'erreur renvoyé par isGooglePlayServicesAvailable. Ensuite, il appelle isUserResolvableError pour déterminer si l'erreur peut être résolue par l'utilisateur (par exemple, en mettant à jour les services Google Play). S'il est possible de le résoudre, une boîte de dialogue s'affiche pour que l'utilisateur puisse confirmer qu'il souhaite que le système résolve l'erreur. Puis appelez-le avec la méthode onCreate de l'activité, je lance cette vérification comme ci-dessous

//I normally assume Google Play services is available
private boolean playServicesAvailable = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map_selector);

    //check for rare case where Google Play Services is not available
    playServicesAvailable = checkPlayServices();

    if(!playServicesAvailable){
        //hide UI elements and turn off features that rely on Google Play Services
    }
}

J'espère que ça aide certains là-bas

2
Leo

Pour vous épargner la configuration d'un émulateur ne prenant pas en charge Google Play, utilisez toujours un émulateur avec le playiconenter image description here

comme indiqué dans l'image: L'icône play se trouve sous la ligne Playstore.

 enter image description here

Après avoir installé l'émulateur compatible avec Google Play, exécutez à nouveau l'application dans l'émulateur. Lorsque vous recevez la notification "L'application ne s'exécutera que si .....", cliquez sur la notification et suivez les instructions à l'écran: "Signature En utilisant un compte Gmail ... e-mail et mot de passe, etc. ", dès que vous acceptez la licence de Google, vous obtenez l'écran de mise à jour de Google Play:  enter image description here

mettez à jour votre jeu Google et relancez votre application . Assurez-vous également que vous avez les dépendances Google dans les graduations de niveau de votre application:

Niveau d'application build.gradle (Module: app)

dependencies {

}

    apply plugin: 'com.google.gms.google-services'

Niveau de projet Gradle "build, gradle (Project: AppName)"

dépendances {

    classpath 'com.google.gms:google-services:3.2.1'
}
2
RileyManda

Je n'ai eu ce problème que lorsque j'utilise l'émulateur Android à partir d'Android Studio ..__ J'ai résolu le problème en ajoutant le plugin google-services à gradle: app

apply plugin: 'com.google.gms.google-services'

puis sur les dépendances add

compile 'com.google.Android.gms:play-services:9.0.0'

auparavant j'utilisais 

compile 'com.google.Android.gms:play-services:9.4.0'

mais cela indique une erreur de correspondance et suggère d'utiliser com.Android.gms version 9.0.0

1
josua josh

Dans Android Studio 3, accédez à Tools -> SDK Manager et installez les services Google Play  enter image description here

1
onmyway133

J'ai eu la même erreur. Il a été corrigé en mettant à jour Android Studio avec ses outils de SDK Android connexes. 

1
george mano

J'ai rencontré cette même erreur en essayant de construire sur Android 7.0. J'ai reconstruit sous 6.0 et n'ai eu aucun problème. Rétablir 1 niveau d'API peut également vous aider.

0
Mr_Dave