Google Maps показывает пустую карту - программирование

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

В настоящее время я придерживаюсь этой проблемы: Google Maps, похоже, вообще не загружается. См. Изображение ниже: enter image description here

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

  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>

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

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

Обратите внимание, что когда я использую тот же 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>
4b9b3361

Ответ 1

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

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

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

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

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

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

ПРИМЕЧАНИЕ. Другое дело, подумайте над обновлением зависимостей Google Maps и сервисов Google.

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

Ответ 2

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

Включить Multidex:

fooobar.com/questions/2399148/...

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

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

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

fooobar.com/questions/1688359/...

Ответ 3

Я предполагаю, что это может быть связано с несоответствием SHA 1 Fingerprint. Дважды проверьте, что вы используете одно и то же хранилище ключей для получения 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" />

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

Решение:

 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

Ответ 8

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