web-dev-qa-db-fra.com

Google Maps affiche une carte vierge

Je suis actuellement coincé avec ce problème: Google Maps ne semble pas charger du tout. S'il vous plaît voir l'image ci-dessous:  enter image description here

Cela me rend vraiment fou. J'ai déjà fait ce qui suit:

  1. Ajout du nom de mon package + SHA1 (magasin de clés de débogage) + SHA1 (magasin de clés de version) à la console du développeur Google.
  2. Maps SDK pour Android est activé. La clé API a une restriction d'application Android
  3. Ajout de google-services.json à mon application depuis la console Firebase
  4. Ajout des autorisations nécessaires:
  5. Clé API ajoutée au fichier manifeste - à partir de la console développeur Google
  6. Ajout de métadonnées pour la version gms

Voici le code de mon fragment:

import Android.content.Context;
import Android.content.pm.FeatureInfo;
import Android.content.pm.PackageManager;
import Android.support.v4.app.ActivityCompat;
import Android.support.v4.app.Fragment;
import Android.support.v4.app.FragmentActivity;
import Android.os.Bundle;
import Android.view.LayoutInflater;
import Android.view.View;
import Android.view.ViewGroup;
import Android.widget.TextView;
import Android.widget.Toast;

import com.google.Android.gms.common.ConnectionResult;
import com.google.Android.gms.common.ErrorDialogFragment;
import com.google.Android.gms.common.GoogleApiAvailability;
import com.google.Android.gms.maps.CameraUpdateFactory;
import com.google.Android.gms.maps.GoogleMap;
import com.google.Android.gms.maps.MapFragment;
import com.google.Android.gms.maps.MapView;
import com.google.Android.gms.maps.MapsInitializer;
import com.google.Android.gms.maps.OnMapReadyCallback;
import com.google.Android.gms.maps.SupportMapFragment;
import com.google.Android.gms.maps.model.CameraPosition;
import com.google.Android.gms.maps.model.LatLng;
import com.google.Android.gms.maps.model.MarkerOptions;

public class MapsActivity extends Fragment implements OnMapReadyCallback {

    private MapFragment mapFragment;
    protected boolean readyToGo() {
        GoogleApiAvailability checker=
                GoogleApiAvailability.getInstance();

        int status=checker.isGooglePlayServicesAvailable(getActivity());

        if (status == ConnectionResult.SUCCESS) {
            if (getVersionFromPackageManager(getActivity())>=2) {
                return(true);
            }
            else {
                Toast.makeText(getActivity(), "no maps", Toast.LENGTH_LONG).show();

            }
        }
        else if (checker.isUserResolvableError(status)) {

        }
        else {
            Toast.makeText(getActivity(),"no maps", Toast.LENGTH_LONG).show();

        }

        return(false);
    }
    private static int getVersionFromPackageManager(Context context) {
        PackageManager packageManager=context.getPackageManager();
        FeatureInfo[] featureInfos=
                packageManager.getSystemAvailableFeatures();
        if (featureInfos != null && featureInfos.length > 0) {
            for (FeatureInfo featureInfo : featureInfos) {
                // Null feature name means this feature is the open
                // gl es version feature.
                if (featureInfo.name == null) {
                    if (featureInfo.reqGlEsVersion != FeatureInfo.GL_ES_VERSION_UNDEFINED) {
                        return getMajorVersion(featureInfo.reqGlEsVersion);
                    }
                    else {
                        return 1; // Lack of property means OpenGL ES
                        // version 1
                    }
                }
            }
        }
        return 1;
    }
    private static int getMajorVersion(int glEsVersion) {
        return((glEsVersion & 0xffff0000) >> 16);
    }
    public static MapsActivity newInstance() {
        MapsActivity fragment = new MapsActivity();
        return fragment;
    }

    public MapsActivity() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        readyToGo();

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_maps, null, false);

        SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        return view;
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng augsburg = new LatLng(48.348527, 10.915952);

        if (ActivityCompat.checkSelfPermission(getActivity(), Android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        googleMap.setMyLocationEnabled(true);
        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(augsburg, 13));

        googleMap.addMarker(new MarkerOptions()
                .title("Augsburg Zoo")
                .snippet("Der coolste Zoo der Welt")
                .position(augsburg));
    }
}

Et voici le code de ma mise en page:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/constraintLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:name="com.google.Android.gms.maps.SupportMapFragment"
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"/>

    <TextView
        Android:id="@+id/textView15"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:text="Coming soon!"
        Android:textColor="@color/colorPrimary"
        Android:textSize="30sp"
        Android:visibility="invisible" />
</RelativeLayout>

Quelqu'un peut-il dire ce qu'il me manque encore?

LOGCAT:

10-17 15:33:25.917 1637-1648/system_process I/ActivityManager: Killing 2335:com.google.Android.apps.maps/u0a39 (adj 15): empty #17
10-17 15:33:43.441 3591-3591/com.apptechgateway.AppTech I/DynamiteModule: Considering local module com.google.Android.gms.maps_dynamite:0 and remote module com.google.Android.gms.maps_dynamite:220
    Selected remote version of com.google.Android.gms.maps_dynamite, version >= 220
10-17 15:33:43.464 3800-3800/? E/dex2oat: Failed to create oat file: /data/dalvik-cache/x86_64/data@[email protected]@app_chimera@m@[email protected]@classes.dex: Permission denied
10-17 15:33:43.465 3591-3591/com.apptechgateway.AppTech W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg  --debuggable --instruction-set=x86_64 --instruction-set-features=smp,ssse3,sse4.1,sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86_64 --instruction-set-features=default --dex-file=/data/data/com.google.Android.gms/app_chimera/m/00000006/MapsDynamite.apk --oat-file=/data/dalvik-cache/x86_64/data@[email protected]@app_chimera@m@[email protected]@classes.dex) because non-0 exit status
10-17 15:33:43.514 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services client version: 12451000
10-17 15:33:43.517 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services package version: 12874027
10-17 15:33:56.802 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services package version: 12874027

Veuillez noter que lorsque j'utilise la même API_KEY avec d'autres projets de carte, cela fonctionne parfaitement. Il semble que la carte ne s'affiche pas sur mon application, mais travaille sur d'autres projets.

Ce sont mes dépendecies:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.Android.support:appcompat-v7:28.0.0'
    implementation 'com.Android.support:design:28.0.0-rc02'
    implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.Android.support:support-v4:28.0.0'

    implementation 'com.google.Android.gms:play-services-maps:15.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.Android.support.test:runner:1.0.2'
    androidTestImplementation 'com.Android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.mikhaellopez:circularimageview:3.2.0'
    implementation 'gr.pantrif:easy-Android-splash-screen:0.0.1'
    implementation 'com.github.GrenderG:Toasty:1.3.0'
    implementation 'com.github.adrielcafe:AndroidAudioRecorder:0.3.0'
    implementation 'com.google.firebase:firebase-core:16.0.1'
    implementation 'com.crashlytics.sdk.Android:crashlytics:2.9.5'
    implementation 'com.Android.volley:volley:1.1.0'
    compile 'com.github.ybq:Android-SpinKit:1.1.0'
    implementation 'com.google.firebase:firebase-database:16.0.1'
    compile 'com.Android.support:cardview-v7:28.0.0'
    compile 'com.github.bumptech.glide:glide:3.6.0'
    compile 'com.github.clans:fab:1.6.4'
    compile 'com.github.blikoon:QRCodeScanner:0.1.2'
    compile 'com.github.droidbyme:DroidDialog:c6decc7167'
    implementation 'com.Android.support:multidex:1.0.3'
    compile project(':library')

}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'

Et voici le contenu de mon AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    package="com.sample.x">

    <uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
    <uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission Android:name="Android.permission.INTERNET" />
    <uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
    <uses-permission Android:name="Android.permission.RECEIVE_SMS" />
    <uses-permission Android:name="Android.permission.READ_SMS" />
    <uses-permission Android:name="Android.permission.SEND_SMS" />
    <uses-permission Android:name="Android.permission.RECORD_AUDIO" />
    <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission Android:name="Android.permission.WAKE_LOCK" />
    <uses-permission Android:name="Android.permission.CAMERA" />
    <uses-permission Android:name="Android.permission.VIBRATE" />




    <application
        Android:allowBackup="true"
        Android:icon="@mipmap/ic_launcher"
        Android:label="@string/app_name"
        Android:largeHeap="true"
        Android:supportsRtl="true"
        Android:theme="@style/AppTheme">
        <meta-data
            Android:name="com.google.Android.geo.API_KEY"
            Android:value="MY_API_KEY" />

        <provider
            Android:name="Android.support.v4.content.FileProvider"
            Android:authorities="${applicationId}.com.vansuita.pickimage.provider"
            Android:exported="false"
            Android:grantUriPermissions="true"
            tools:replace="Android:authorities">
            <meta-data
                Android:name="Android.support.FILE_PROVIDER_PATHS"
                Android:resource="@xml/picker_provider_paths"
                tools:replace="Android:resource" />
        </provider>

        <activity
            Android:name=".SplashscreenActivity"
            Android:label="@string/app_name"
            Android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            Android:name=".MapsMarkerActivity"
            Android:label="MAPS" />
        <activity
            Android:name=".MapsActivity2"
            Android:label="@string/title_activity_maps2"></activity>
    </application>

</manifest>
14
Jayson Tamayo

J'ai eu ce problème hier en concevant un client dans l'entreprise. c’était deux jours fous pour régler le problème avec le client derrière moi. Ce que j'ai fait était:

  1. Supprimez la clé actuelle (clé API) des API Google Dashboard . Supprimez la clé Web firebase des API Google Dashboard. Créez une API new Key pour Android, enregistrez le SHA-1 et le nom du package. et ajouter dans le projet Android studio;

  2. Dans le projet FIrebase, supprimez le code SHA-1 à ajouter. Téléchargez Google-services.json et ajoutez-le au projet.

  3. Générez l’application en mode de publication, publiez-la dans le magasin et téléchargez Sur un appareil, lors de son exécution, l’application devrait afficher la carte normalement;

  4. Sinon, cela vous montrera l'erreur dans LogCat, en indiquant que vous devez Enregistrer la clé SHA-1 suivante:XXXXXXXXXXXXXXXXet le packagename: com.votre.packagename;

  5. Enregistrez simplement cette clé dans les API Google, et cela fonctionnera dans quelques secondes, sans même avoir à mettre à jour l'application dans le magasin.

REMARQUE: Autre chose, envisagez de mettre à niveau les dépendances de Google Maps et de Google Services. 

J'espère que cela t'aides.

8
Pedro Massango

Avez-vous essayé ces méthodes?

Activer Multidex:

https://stackoverflow.com/a/42827484/9169701

https://developer.Android.com/studio/build/multidex

Remarque: Si votre projet est configuré pour multidex avec minSdkVersion 20 ou une version inférieure et que vous déployez sur des périphériques cibles fonctionnant sous Android 4.4 (API de niveau 20) ou inférieure, Android Studio désactive Instant Run.

Désactiver Instant Run:

https://stackoverflow.com/a/46999705/9169701

4
Alexander Anokhin

Je suppose que cela peut être dû à une discordance SHA 1. Empreinte digitale. Vérifiez que vous utilisez le même magasin de clés pour obtenir SHA1.

ou vérifions si votre clé API est valide ou non. Pour cela, ajoutez MAP_API comme clé.

AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY

ajouter la clé directement au manifeste

<meta-data
        Android:name="com.google.Android.geo.API_KEY"
        Android:value="AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY" />

Ajouter l'autorisation suivante dans votre AndroidManifest.xml (facultatif/non nécessaire)

 <permission
    Android:name="your_pakage_name.permission.MAPS_RECEIVE"
    Android:protectionLevel="signature" />

Construisez votre apk. Et le tester.

Si la carte est affichée, nous pouvons résoudre le problème en raison de votre clé d’API. 

Autrement

Peut-être à cause du gestionnaire de fragments enfant, donc initialisez votre pageur dans la vue comme ci-dessous puis testez

 <fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:map="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/map"
    Android:name="yourpackage.MapsActivity"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context=".MainActivity" />
4
Vinayak B

Comme vous utilisez la carte dans un fragment, changez votre code comme ci-dessous: -

  // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mMapFragment = SupportMapFragment.newInstance();

    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.mapContainer, mMapFragment).commit();
    mMapFragment.getMapAsync(this);

Changez le fragment tag dans layout en FrameLayout comme ci-dessous: -

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/constraintLayout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <FrameLayout 
      Android:id="@+id/mapContainer"
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
    />


    .....
</RelativeLayout>

Améliorez votre carte sdk: -

implementation 'com.google.Android.gms:play-services-maps:16.0.0'
3
Nainal

essayez d’ajouter ce morceau de code à votre méthode onMapReady

MapsInitializer.initialize(Objects.requireNonNull(getContext()));
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.setMyLocationEnabled(true);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(augsburg, 13));
googleMap.addMarker(new MarkerOptions()
            .title("Augsburg Zoo")
            .snippet("Der coolste Zoo der Welt")
            .position(augsburg));
3
nitish29

Quelques choses à noter.

  1. Vérification des autorisations d'exécution ( détails ) - votre logcat indique que l'autorisation est refusée sur l'une des lignes.
  2. Essayez de télécharger l’application sur Playstore dans le canal de test alfa ou bêta (pour empêcher l’accès aux utilisateurs ciblés avant que l’application ne passe tous les tests).
  3. Si le problème persiste, essayez de supprimer et de réenregistrer votre application dans Firebase.

  4. Veuillez également noter que les API de Google Maps ne sont plus disponibles gratuitement, comme auparavant. Vous devez vous abonner. Suivez ce link pour plus d'informations . J'espère que cela vous aidera.

3
m__

Solution:

 I had the same problem in my App so you can try this open your Android studio and
 make sure you are login with the same user id of what you had created 
 `console.developer` account and after that you should do 



 SupportMapFragment mapFragment;
 GoogleMap mMap;
 Marker marker;
 LatLng Origin = new LatLng(30.5595, 22.9375);
 LatLng dest = new LatLng(30.5595, 22.9375);

  @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    googleMap.addMarker(new MarkerOptions()
            .position(Origin)
            .title("title")
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));

    googleMap.addMarker(new MarkerOptions()
            .position(dest));

    googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(Origin, 15));
}

 enter image description here

2
Nagendra kr.

J'ai eu ce problème. Dans mon cas, j'ai changé la clé API et tout a commencé à fonctionner correctement. Vérifiez le logcat pour le problème. Si c'est le même problème alors changez la clé et cela devrait fonctionner.

0
Leena Bhandari