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

Когато използвам Android API V2 на Google Maps, следвам документацията за настройка на Google Play Services за да направя проверка, за да се уверя, че услугите на 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 ще докладва тази грешка: API на Google Карти за Android: приложението Google Карти липсва.

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

Актуализация Ето моя метод setupMapIfNeeded(), който се извиква в края на onCreate(). Това е мястото, където мисля, че бих искал да определя дали Google Maps е инсталиран и да предупредя потребителя, вижте блока 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 maps са инсталирани. IMO това наистина трябва да бъде включено в ръководството за разработчици на Google Maps Android API V2... ще има много разработчици, които ще пропуснат този случай и ще разочароват потребителите.

Ето как да проверите дали Google Maps са инсталирани и да пренасочите потребителя към списъка в Play Store за Google Maps, ако не е инсталиран (вижте 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 Maps, класът MapFragment автоматично ще се увери, че услугите за игра са инсталирани, актуализирани и включени. - person mpellegr; 27.10.2014
comment
Този метод не работи. В момента можем да получим екземпляр на GoogleMap с mapFragment?.getMapAsync(this) (mMap във вашия случай). isGoogleMapsInstalled() връща true дори на API 19 емулатор без Google Play Services. - 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() и проверите дали върнатият обект не е null.

публична GoogleMap getMap()

GoogleMap. 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 Карти (play.google.com/store/apps/) извикването на MapFragment.getMap() не е нула. Нито една от плочките обаче няма да се зареди. Бутоните за мащабиране са налице и изгледът изглежда като карта, но няма да се изтеглят картографски данни и LogCat докладва: E/Google Maps Android API(23235): приложението Google Maps липсва. Имам нужда от начин да открия това или потребителите ще се оплачат, че приложението не работи. Актуализиран въпрос с моя метод setupMapIfNeeded. - person DiscDev; 09.12.2012
comment
Току-що се опитах да премахна Google Maps и картите работят добре в приложението ми. Вероятно най-новите услуги на Google Play позволяват да използвате карта без Google Maps. - person IlyaEremin; 02.02.2015