31

Google マップ 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 を実行) の一部には、Google PlayServices と Google マップ アプリ自体の両方が欠けていることに気付きました。

LogCat は次のエラーを報告します: Google マップ Android API: Google マップ アプリケーションが見つかりません。

質問- デバイスで Google マップを使用できるかどうかについて、上記と同様のチェックを行うにはどうすればよいですか? 次に、ユーザーが既に Google マップをインストールしている場合、インストールされているバージョンが Android Maps API の V2 と互換性があることを確認する必要があると思います。

更新 onCreate() の最後に呼び出される setupMapIfNeeded() メソッドは次のとおりです。ここで、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);
        }
    }
}
4

3 に答える 3

55

さらに突っついたり突っ込んだりした後、GoogleマップがインストールされているかどうかをPackageManagerに尋ねるだけでよいことに気付きました。IMO これは本当に Google Maps Android API V2 開発者ガイドに含まれているはずです...このケースを見逃してユーザーを苛立たせる多くの開発者がいるでしょう。

Google マップがインストールされているかどうかを確認し、インストールされていない場合は Google マップの Play ストアのリストにユーザーをリダイレクトする方法を次に示します (「 」を参照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 ストアにリダイレクトする方法

于 2012-12-09T17:35:21.847 に答える
4

グーグルガイドより

if (mapIntent.resolveActivity(getPackageManager()) != null) {
    ...
}
于 2016-05-08T01:39:55.253 に答える
0

MapFragment.getMap()またはMapView.getMap()メソッドを呼び出し、返されたオブジェクトがnullでないことを確認することで、GoogleMapが使用可能であることを確認できます。

public GoogleMap getMap()

GoogleMap。フラグメントのビューがまだ準備できていない場合はnull。これは、フラグメントのライフサイクルがまだonCreateView(LayoutInflater、ViewGroup、Bundle)を通過していない場合に発生する可能性があります。これは、GooglePlayサービスが利用できない場合にも発生する可能性があります。その後、Google Playサービスが利用可能になり、フラグメントがonCreateView(LayoutInflater、ViewGroup、Bundle)を通過した場合、このメソッドを再度呼び出すと、GoogleMapが初期化されて返されます。

マップの可用性の確認については、こちらをご覧ください。

于 2012-12-09T14:30:05.573 に答える