Google Maps Android API V2 проверяет, установлены ли GoogleMaps на устройстве

При использовании Google Maps Android API V2 я следую документации по настройке сервисов Google Play чтобы убедиться, что сервисы Google Play установлены, используя следующий код в моем основном действии:

@Override
public void onResume()
{
      checkGooglePlayServicesAvailability();

      super.onResume();
}

public void checkGooglePlayServicesAvailability()
  {
      int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
      if(resultCode != ConnectionResult.SUCCESS)
      {
          Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, this, 69);
          dialog.setCancelable(false);
          dialog.setOnDismissListener(getOnDismissListener());
          dialog.show();
      }

      Log.d("GooglePlayServicesUtil Check", "Result is: " + resultCode);
  }

Это прекрасно работает. Однако я заметил, что на некоторых старых телефонах Android, которые у меня есть (в основном с версией 2.2), отсутствуют как GooglePlayServices, так и само приложение Google Maps.

LogCat сообщит об этой ошибке: Google Maps Android API: приложение Google Maps отсутствует.

Вопрос: как выполнить аналогичную вышеописанной проверку доступности Google Maps на устройстве? Во-вторых, если у пользователя уже установлены Карты Google, я думаю, что проверка должна убедиться, что их установленная версия совместима с V2 API Карт Android.

Обновление Вот мой метод setupMapIfNeeded(), который вызывается в конце onCreate(). Здесь я думаю, что хотел бы определить, установлены ли Карты Google, и предупредить пользователя, см. блок else:

private void setUpMapIfNeeded() 
{
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) 
    {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap();

        if (mMap != null) 
        {
            mMap.setLocationSource(this);

            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(44.9800, -93.2636), 10.0f));
            setUpMap();
        }
        else
        {
            //THIS CODE NEVER EXECUTES - mMap is non-null even when Google Maps are not installed
            MapConstants.showOkDialogWithText(this, R.string.installGoogleMaps);
        }
    }
}

person DiscDev    schedule 08.12.2012    source источник
comment
Могу я просто спросить, что это за 69 у вас есть в параметрах метода getErrorDialog?   -  person luiscvalmeida    schedule 09.12.2012
comment
@luiscvalmeida 69 — это просто код запроса (я выбрал его). См. метод getErrorDialog на сайте developer.android.com. /reference/com/google/android/gms/common/   -  person DiscDev    schedule 09.12.2012


Ответы (3)


Хорошо, после того, как я потыкал и подтолкнул, я понял, что мне просто нужно спросить PackageManager, установлены ли карты Google. IMO, это действительно должно быть включено в руководство для разработчиков Google Maps Android API V2... будет много разработчиков, которые пропустят этот случай и разочаруют пользователей.

Вот как проверить, установлены ли Карты Google, и перенаправить пользователя к списку Play Store для карт Google, если они не установлены (см. isGoogleMapsInstalled()):

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) 
    {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.basicMap)).getMap();

        if(isGoogleMapsInstalled())
        {
            if (mMap != null) 
            {
                setUpMap();
            }
        }
        else
        {
            Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("Install Google Maps");
            builder.setCancelable(false);
            builder.setPositiveButton("Install", getGoogleMapsListener());
            AlertDialog dialog = builder.create();
            dialog.show();
        }
    }
}

public boolean isGoogleMapsInstalled()
{
    try
    {
        ApplicationInfo info = getPackageManager().getApplicationInfo("com.google.android.apps.maps", 0 );
        return true;
    } 
    catch(PackageManager.NameNotFoundException e)
    {
        return false;
    }
}

public OnClickListener getGoogleMapsListener()
{
    return new OnClickListener() 
    {
        @Override
        public void onClick(DialogInterface dialog, int which) 
        {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.google.android.apps.maps"));
            startActivity(intent);

            //Finish the activity so they can't circumvent the check
            finish();
        }
    };
}

Я написал короткую запись в блоге со следующими подробностями: Как проверить, установлены ли Google Maps, и перенаправить пользователя в Play Store

person DiscDev    schedule 09.12.2012
comment
ура, сделал трюк без проблем! Это действительно должно быть частью APi или, по крайней мере, лучше задокументировано. - person Aiden Fry; 13.12.2012
comment
Рад, что это полезно. Я полностью согласен с тем, что это должно быть как минимум частью документации по API... почему бы не сделать что-то похожее на GooglePlayServicesUtil для карт? - person DiscDev; 13.12.2012
comment
Большое спасибо, это очень полезно. - person Abijeet Patro; 24.05.2013
comment
К вашему сведению, люди, читающие это с помощью карт Google, класс MapFragment автоматически обеспечит установку, обновление и включение игровых сервисов. - person mpellegr; 27.10.2014
comment
Этот метод не работает. В настоящее время мы можем получить экземпляр GoogleMap с mapFragment?.getMapAsync(this) (в вашем случае mMap). isGoogleMapsInstalled() возвращает true даже на эмуляторе API 19 без сервисов Google Play. - person CoolMind; 19.07.2019
comment
@CoolMind Я написал этот ответ почти 7 лет назад, многое изменилось. - person DiscDev; 19.07.2019
comment
@DiscDev, согласен с тобой. Я только хотел написать это для будущих читателей. - person CoolMind; 19.07.2019
comment
Вы больше не можете делать это с Android 11 - person Marcus Wolschon; 29.09.2020

Из руководства Google

if (mapIntent.resolveActivity(getPackageManager()) != null) {
    ...
}
person Oleksandr Kruk    schedule 08.05.2016

Вы можете убедиться, что карта GoogleMap доступна, вызвав методы MapFragment.getMap() или MapView.getMap() и проверив, что возвращаемый объект не является нулевым.

публичный GoogleMap getMap()

Карта Google. Null, если представление фрагмента еще не готово. Это может произойти, если жизненный цикл фрагмента еще не прошел onCreateView(LayoutInflater, ViewGroup, Bundle). Это также может произойти, если сервисы Google Play недоступны. Если после этого сервисы Google Play станут доступны и фрагмент будет обработан onCreateView(LayoutInflater, ViewGroup, Bundle), повторный вызов этого метода приведет к инициализации и возврату GoogleMap.

Вы можете прочитать о проверке доступности карты здесь.

person Paul Wein    schedule 09.12.2012
comment
Нет, это не работает. С установленными сервисами Google Play, но не установленными Google Maps (play.google.com/store/apps/) вызов MapFragment.getMap() не равен нулю. Однако ни одна из плиток не загружается. Кнопки масштабирования присутствуют, и вид выглядит как карта, но данные карты не загружаются, и LogCat сообщает: E/Google Maps Android API (23235): приложение Google Maps отсутствует. Мне нужен способ обнаружить это, иначе пользователи будут жаловаться, что приложение не работает. Обновленный вопрос с моим методом setupMapIfNeeded. - person DiscDev; 09.12.2012
comment
Я только что попытался удалить карты Google, и карты отлично работают в моем приложении. Вероятно, новейшие сервисы Google Play позволяют использовать карту без карт Google. - person IlyaEremin; 02.02.2015