web-dev-qa-db-de.com

Google Maps zeigt eine leere Karte

Ich stehe derzeit mit diesem Problem fest: Google Maps scheint überhaupt nicht zu laden. Bitte sehen Sie das Bild unten:  enter image description here

Das macht mich wirklich verrückt. Ich habe schon folgendes gemacht:

  1. Mein Paketname + SHA1 (Debug-Keystore) + SHA1 (Release-Keystore) wurde der Google Developer-Konsole hinzugefügt.
  2. Karten-SDK für Android ist aktiviert. Der API-Schlüssel hat eine Android-App-Einschränkung
  3. Google-services.json wurde meiner App von der Firebase-Konsole aus hinzugefügt
  4. Notwendige Berechtigungen hinzugefügt:
  5. API-Schlüssel zur Manifest-Datei hinzugefügt - über Google Developer Console
  6. Metadaten für die gms-Version hinzugefügt

Dies ist der Code meines Fragments:

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

Und das ist der Code für mein Layout:

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

Kann jemand sagen was mir noch fehlt?

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/[email protected]@[email protected][email protected]@[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/[email protected]@[email protected][email protected]@[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

Bitte beachten Sie, dass es einwandfrei funktioniert, wenn ich dasselbe API_KEY für andere Kartenprojekte verwende. Es scheint, dass die Karte nicht in meiner App angezeigt wird, sondern an anderen Projekten arbeitet.

Dies sind meine Abhängigkeiten:

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'

Und das ist der Inhalt meines 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

Ich hatte dieses Problem gestern, als ich einen Kunden im Unternehmen entwickelte. Es waren zwei verrückte Tage, um es mit dem Kunden hinter mir zu klären. Was ich gemacht habe war:

  1. Löschen Sie den aktuellen Schlüssel (API-Schlüssel) aus den Google Dashboard-APIs. Löschen Sie den Firebase-Webschlüssel aus den Google-Dashboard-APIs. Erstellen Sie einenew-Schlüssel-API für Android, registrieren Sie den SHA-1 und den Paketnamen. und im Projekt Android Studio hinzufügen;

  2. Löschen Sie im FIrebase-Projekt den SHA-1-Code, um ihn erneut hinzuzufügen. Laden Sie Google-services.json herunter und fügen Sie das Projekt hinzu.

  3. Generieren Sie die App im Freigabemodus, veröffentlichen Sie sie im Store und laden Sie Auf einem Gerät herunter. Wenn die App ausgeführt wird, sollte die Map normal angezeigt werden.

  4. Wenn nicht, wird der Fehler in LogCat angezeigt, der besagt, dass Sie den folgenden SHA-1-Schlüssel registrieren müssen:XXXXXXXXXXXXXXXund das Paketname: com.your.packagename;

  5. Registrieren Sie diesen Schlüssel einfach in den Google-APIs, und es funktioniert in wenigen Sekunden, ohne dass Sie die App im Store aktualisieren müssen.

HINWEIS: Erwägen Sie ein weiteres Upgrade der Abhängigkeiten von Google Maps und Google Services. 

Hoffe das hilft.

8
Pedro Massango

Hast du diese Methoden ausprobiert?

Multidex aktivieren:

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

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

Hinweis: Wenn Ihr Projekt für Multidex mit minSdkVersion 20 oder niedriger konfiguriert ist und Sie es auf Zielgeräten bereitstellen, auf denen Android 4.4 (API Level 20) oder niedriger ausgeführt wird, deaktiviert Android Studio den Instant Run.

Instant Run deaktivieren:

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

4

Ich gehe davon aus, dass dies möglicherweise auf Nichtübereinstimmung SHA 1 Fingerprint zurückzuführen ist. Vergewissern Sie sich, dass Sie denselben Schlüsselspeicher verwenden, um SHA1 zu erhalten.

oder überprüfen Sie, ob Ihr API-Schlüssel gültig ist oder nicht. Fügen Sie dazu folgendes MAP_API als Schlüssel hinzu

AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY

schlüssel direkt zum Manifest hinzufügen

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

Fügen Sie folgende Berechtigung in Ihrer AndroidManifest.xml hinzu (optional/nicht erforderlich)

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

Bauen Sie Ihren apk. Und teste es.

Wenn die Karte angezeigt wird, können wir beheben, dass Ihr API-Schlüssel das Problem ist. 

Andernfalls

Möglicherweise aufgrund eines untergeordneten Fragmentmanagers. Initialisieren Sie Ihr Fragment in der Ansicht "Pager" wie unten. dann testen Sie es

 <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

Wenn Sie die Karte in einem Fragment verwenden, ändern Sie Ihren Code wie folgt: -

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

Ändern Sie das fragment Tag im Layout in FrameLayout wie folgt:

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

Aktualisieren Sie Ihre Karte sdk: -

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

fügen Sie diesen Code in Ihre onMapReady - Methode ein

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

Ein paar Dinge zu beachten.

  1. Laufzeitberechtigungen überprüfen ( details ) - Ihr Logcat sagt, dass die Berechtigung für eine der Zeilen verweigert wurde
  2. Versuchen Sie, die App in den Playstore im Alfa- oder Beta-Test-Kanal hochzuladen (um den Zugriff auf bestimmte Benutzer zu verhindern, bevor die App alle Tests besteht.) Einige APIs funktionieren nur, wenn Ihre App registriert ist.
  3. Wenn das Problem weiterhin besteht, versuchen Sie, Ihre App in Firebase zu löschen und erneut zu registrieren.

  4. Beachten Sie auch, dass Google Maps-APIs nicht mehr wie bisher kostenlos zur Verfügung stehen. Sie müssen sich anmelden. Folgen Sie diesem link für weitere Informationen . Hoffe, das hilft.

3
m__

Lösung:

 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.

Ich hatte dieses Problem. In meinem Fall habe ich den API-Schlüssel geändert und alles hat richtig funktioniert. Überprüfen Sie das Logcat auf das Problem. Wenn es sich um dasselbe Problem handelt, ändern Sie den Schlüssel und es sollte funktionieren.

0
Leena Bhandari