Подтвердить что ты не робот

API Google Android Android 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 сообщит об этой ошибке: API Google Maps для Android: приложение Google Maps отсутствует.

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

Обновление Вот мой метод 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);
        }
    }
}
4b9b3361

Ответ 1

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

Здесь, как проверить, установлены ли Карты Google и перенаправить пользователя в список Play Маркета для карт 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 и перенаправить пользователя в Play Store

Ответ 2

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

public GoogleMap getMap()

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

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