Карты Google показывают пустую карту - PullRequest
0 голосов
/ 17 октября 2018

Я в настоящее время застрял с этой проблемой: 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/data@data@com.google.android.gms@app_chimera@m@00000006@MapsDynamite.apk@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@data@com.google.android.gms@app_chimera@m@00000006@MapsDynamite.apk@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>

Ответы [ 8 ]

0 голосов
/ 26 октября 2018

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

0 голосов
/ 26 октября 2018

Я предполагаю, что это может быть связано с несовпадением отпечатков пальцев 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" />

Построй свой апк.И протестируйте его.

Если карта отображается, то мы можем исправить проблему с ключом 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" />
0 голосов
/ 26 октября 2018

Решение:

 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

0 голосов
/ 26 октября 2018

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

  // 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'
0 голосов
/ 24 октября 2018

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

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

0 голосов
/ 23 октября 2018

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

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

Включить мультидекс:

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

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

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

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

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

0 голосов
/ 20 октября 2018

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...