Карты Google показывают пустую карту

В настоящее время я столкнулся с этой проблемой: кажется, что Google Maps вообще не загружается. См. Изображение ниже: Карты Google показывают пустую карту

Это действительно сводит меня с ума. Я уже сделал следующее:

  1. Добавлено имя моего пакета + SHA1 (хранилище ключей отладки) + SHA1 (хранилище ключей выпуска) в консоль разработчика Google.
  2. SDK Карт для Android включен. Ключ API имеет ограничение для приложения Android
  3. Добавлен google-services.json в мое приложение из консоли Firebase
  4. Добавлены необходимые разрешения:
  5. Добавлен ключ API в файл манифеста - из консоли разработчика Google
  6. Добавлены метаданные для версии gms

Это код моего фрагмента:

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

А вот код моего макета:

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

Может ли кто-нибудь сказать, что мне еще не хватает?

ЛОГКАТ:

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

Обратите внимание, что когда я использую тот же API_KEY для других проектов карт, он отлично работает. Кажется, что карта не отображается в моем приложении, но я работаю над другими проектами.

Это мои зависимости:

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'

А вот содержимое моего 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>

что говорит ваш логарифм?

Faiz Mir 17.10.2018 08:41

Предоставлять logcat при отображении активности на карте

Truong Hieu 17.10.2018 08:41

Показать журнал тура, должно быть исключение.

Syed Hamza Hassan 17.10.2018 08:51

Я уже добавил логарифм @FaizMir

Jayson Tamayo 17.10.2018 09:38

вы пробовали обновлять версию игрового сервиса устройства?

Tejas Pandya 17.10.2018 11:31

Думаю, у него последняя версия @TejasPandya

Jayson Tamayo 17.10.2018 17:11

В приложениях Cordova, которые используют карты Google, когда ключ api неверен, карта показывает это.

Simão Garcia 19.10.2018 19:58

@ SimãoGarcia Ключ API правильный, поскольку я использовал его в других проектах

Jayson Tamayo 20.10.2018 03:31

Я думаю, вы отправили неправильную часть logcat

Radesh 20.10.2018 10:59

Сколько у вас типов сборки?

Onik 20.10.2018 14:44

Вы сказали, что добавили имя пакета, а не идентификатор приложения. Может быть, вы добавляете к нему суффикс с помощью Gradle?

tynn 21.10.2018 09:03

Что ты имеешь в виду @tynn

Jayson Tamayo 21.10.2018 14:15

Возможно, вы определяете applicationIdSuffix в своем файле Gradle. Если вы ограничили доступ к имени вашего пакета, это не будет применяться к вашему applicationId, предоставленному проекту. Эти двое тогда не соответствуют.

tynn 21.10.2018 16:23

вы должны попытаться использовать mapview вместо фрагмента карты при использовании карты внутри фрагмента

Asad Ali 24.10.2018 06:37

попробуйте использовать другой ключ API

Kevin Kurien 24.10.2018 09:07

вы используете отпечатки сертификата SHA1 ??

Radesh 24.10.2018 16:22

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

eli 26.10.2018 13:07

не могли бы вы добавить свою основную деятельность, где вы заменяете этот фрагмент

Vinayak B 26.10.2018 13:51
15
18
7 167
9

Ответы 9

Вчера у меня возникла эта проблема при разработке клиента в компании. это были два сумасшедших дня, чтобы решить эту проблему с клиентом позади меня. Что я сделал:

  1. Удалите текущий ключ (API-ключ) из API-интерфейсов Google Dashboard. Удалите веб-ключ firebase из API панели управления Google. Создать новый Key API для Android, зарегистрируйте SHA-1 и имя пакета. а также добавить в проект андроид студию;

  2. В проекте FIrebase удалите код SHA-1, чтобы добавить его снова. Скачать google-services.json и добавьте в проект;

  3. Создайте приложение в режиме выпуска, опубликуйте в магазине и загрузите на каком-то устройстве при запуске приложение должно нормально отображать карту;

  4. Если нет, он покажет вам ошибку в LogCat, говоря, что вы должны зарегистрируйте следующий ключ SHA-1: XXXXXXXXXXXXXXXXX и пакет name: com.your.packagename;

  5. Просто зарегистрируйте этот ключ в Google API, и он будет работать через несколько секунд, даже не обновляя приложение в магазине.

ЗАМЕТКА: Другое дело, подумайте об обновлении зависимостей Google Maps и Google Services.

Надеюсь это поможет.

Вы пробовали эти методы?

Включить Multidex:

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

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

Примечание: Если ваш проект настроен для multidex с minSdkVersion 20 или ниже и вы развертываете на целевых устройствах под управлением Android 4.4 (уровень API 20) или ниже, Android Studio отключает Instant Run.

Отключить мгновенный запуск:

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

попробуйте добавить этот фрагмент кода в свой метод 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));

Несколько замечаний.

  1. Проверка разрешений времени выполнения (Детали) - ваш logcat сообщает, что разрешение отклонено в одной из строк
  2. Попробуйте загрузить приложение в игровой магазин в канале альфа или бета-тестирования (чтобы предотвратить доступ к целевым пользователям до того, как приложение пройдет все тесты). Некоторые API-интерфейсы не работают, если ваше приложение не зарегистрировано.
  3. Если проблема не устранена, попробуйте удалить и повторно зарегистрировать приложение в firebase.

  4. Также обратите внимание, что API карт Google больше не доступны бесплатно, как раньше. Вам необходимо подписаться. Следуйте этому ссылка для получения дополнительной информации. Надеюсь это поможет.

Поскольку вы используете карту во фрагменте, измените свой код, как показано ниже: -

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

Измените тег фрагмент в макете на FrameLayout, как показано ниже: -

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

Обновите SDK карты: -

implementation 'com.google.android.gms:play-services-maps:16.0.0'

Я предполагаю, что это может быть связано с несоответствием отпечатка SHA 1. Дважды проверьте, что вы используете одно и то же хранилище ключей для получения SHA1.

или Давайте проверим, что ваш ключ API действителен или нет. Для этого добавьте следующий MAP_API в качестве ключа

AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY

добавить ключ прямо в манифест

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

Добавьте следующее разрешение в свой AndroidManifest.xml (необязательно / необязательно)

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

Создайте свой apk. И протестируйте это.

Если карта отображается, мы можем исправить проблему с вашим ключом API.

Иначе

Возможно, из-за диспетчера дочерних фрагментов, поэтому инициализируйте свой фрагмент в пейджере просмотра, как показано ниже. затем проверьте это

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

Решение:

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

У меня была такая проблема. В моем случае я поменял ключ API и все заработало правильно. Проверьте журнал на наличие проблемы. Если это та же проблема, измените ключ, и он должен работать.

Я сделал простое исправление, и теперь Google Maps работает отлично: Настройки-Приложения-Карты-Нажмите на 3 точки в правом верхнем углу-Удалите все обновления. Вы получите предупреждение о том, что Карты будут сброшены до заводских настроек. Просто проигнорируйте это и нажмите ОК. Перезагрузите телефон.

Другие вопросы по теме