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.