Google Maps Android - карта внезапно перестает отображаться

Я работаю над интеграцией Google Maps в приложение, над которым я работаю, и у меня было довольно неприятное время. Несмотря на это, я наконец получил SupportMapFragment, отображающий карту, и установил местоположение и уровень масштабирования.

Вот функциональные биты моего кода:

@Override
public void onActivityCreated( Bundle savedInstanceState ) {

    super.onActivityCreated( savedInstanceState );

    Location location = BundleChecker.getExtraOrThrow( KEY_LOCATION, new Bundle[] { savedInstanceState, getArguments() } );
    setLocation( location );

    if ( checkGooglePlayServicesStatus() == ConnectionResult.SUCCESS ) {
        setMapFragment( new SupportMapFragment() );
        getActivity().getSupportFragmentManager().beginTransaction().add( R.id.location_detail_mapFrame, getMapFragment() ).commit();

    }

    populateAddress();
    attachButtonListeners();

    Runnable initMap = new Runnable() {

        @Override
        public void run() {

            if ( checkGooglePlayServicesStatus() == ConnectionResult.SUCCESS ) {
                try {
                    GoogleMap map = getMapFragment().getMap();
                    LatLng latLng = getLocation().getAddress().getLatLng( getActivity() );
                    CameraUpdate update = CameraUpdateFactory.newLatLngZoom( latLng, DEFAULT_MAP_ZOOM );
                    map.animateCamera( update );
                }
                catch (IOException e) {
                    Log.e( TAG, e.getMessage(), e );
                    Toast.makeText( getActivity(), "Unable to find location", Toast.LENGTH_SHORT ).show();
                }
            }

        }
    };

    Handler handler = new Handler();
    handler.postDelayed( initMap, 200 );
}

Кроме того, я написал простой метод удобства, чтобы получить LatLng из моей модели Address, которую вы также можете критиковать:

/*
 * Convenience method to easily check if there is a valid lat & lng in this address
 */
public boolean hasLatLng() {

    return getLatitude() != null && getLongitude() != null;
}

/*
 * Convenience method for use with Google Maps API
 */
public LatLng getLatLng( Context context ) throws IOException {

    LatLng latLng = null;
    if ( hasLatLng() ) {
        latLng = new LatLng( getLatitude(), getLongitude() );
    }
    else {
        String locationString = getStreet() + ", " + AddressUtil.makeCityStateZipString( this );
        Geocoder geoCoder = new Geocoder( context );
        try {
            List<android.location.Address> matches = geoCoder.getFromLocationName( locationString, 2 );
            if ( matches != null && matches.size() > 0 ) {
                double lat = matches.get( 0 ).getLatitude();
                double lng = matches.get( 0 ).getLongitude();
                latLng = new LatLng( lat, lng );
            }
        }
        catch (IOException e) {
            throw new IOException( e );
        }
    }

    return latLng;
}

Я знаю, что этот код не идеален и нуждается в рефакторинге. Это мой первый опыт работы с Google Maps, поэтому, пожалуйста, не стесняйтесь предлагать предложения относительно того, как я могу это сделать. У меня возникло много проблем при попытке использовать MapFragment как в моем макете XML, поэтому я создаю его программно.

Сердце вопроса: Я получал некоторые ложные адресные данные с промежуточного сервера, и это привело к тому, что метод getLatLng Address # возвращал значение null, которое вызвало исключение при вызове CameraUpdateFactory.newLatLngZoom. После того, как я получил это исключение, я больше не мог получать данные из Google. Теперь фрагмент карты пуст, и сообщения отображаются в logcat:

SupportMapFragment with no map content

05-21 18: 11: 42.903: API Android для Android/Android (15747): не удалось связаться с серверами Google. Другая попытка будет сделана при установлении соединения.

05-21 18: 11: 43.093: E/API Google Maps для Android (15747): Не удалось загрузить карту. Ошибка при обращении к серверам Google. Вероятно, это проблема аутентификации (но может быть из-за сетевых ошибок).

Я создал новый ключ api и заменил текущий в своем манифесте без изменений. Единственные изменения, которые я внес в вышеуказанный код, - это учет нулевого LatLng, и с тех пор я отменил эти изменения в бессмысленной попытке вернуть мой код в функциональное состояние.

Кроме того, чтобы сделать вещи немного странными, я построил проект с образцами карт, который входит в состав сервисов Google Play Services, и он отлично работает (имеет отдельный ключ API, кстати).

Что я мог сделать здесь неправильно? Могу ли я игнорировать что-то очевидное?

Ответ 1

Эта проблема обычно возникает из-за проблемы при ссылке на библиотеку google-play-service. Взгляните на это сообщение в блоге, которое я написал о том, как интегрировать Google Maps в ваше приложение, особенно первые три шага:

API Google Maps V2

Другая причина может заключаться в том, что вы неправильно настроили консоль Google API, поэтому я также предлагаю вам ознакомиться с этим руководством:

Ключ API Google Maps V2

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

Ответ 2

Используйте что-то вроде этого:

  • Обновить службы воспроизведения Google в SDK.

  • Вручную удалить приложение с устройства и перезагрузить устройство. я пробовал это, и он отлично работает bro

Также сделайте одно, чтобы новый ключ api отредактировал новый код sh1 из https://code.google.com/apis/console/

вы можете получить свой sh1-код из окна-preference-android-buid

Ответ 3

Создание карт Google - это Googlemare. Это сработало для меня:

-Услуги Google Play в Android Manager -Сделайте новый apikey с: Sha1 keystore (Window- > preferences- > Android- > Build) и именем пакета проекта. Сделайте это по адресу: https://code.google.com/apis/console/

Кто-то изменил имя пакета и сорвал приложение!

Попробуйте это, прежде чем вам понадобится терапия управления гневом благодаря картам google.