Googleマップを使用する場合Android API V2 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マップアプリ自体の両方がありません。
LogCatはこのエラーを報告します:Google Maps Android API:Google Mapsアプリケーションがありません。
質問-デバイスでGoogleマップが利用できるかどうか、上記と同様のチェックを実行するにはどうすればよいですか?次に、ユーザーが既にGoogleマップをインストールしている場合、インストールしたバージョンがAndroid Maps APIのV2と互換性があることを確認する必要があると思います。
Update次に、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);
}
}
}
もう少し突っ込んで突っ込んだ後、GoogleマップがインストールされているかどうかPackageManagerに尋ねるだけでよいことに気づきました。 IMOこれは本当にGoogleマップに含める必要があります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ストアにリダイレクトする方法
if (mapIntent.resolveActivity(getPackageManager()) != null) {
...
}
MapFragment.getMap()メソッドまたはMapView.getMap()メソッドを呼び出し、返されたオブジェクトがnullでないことを確認することで、GoogleMapが利用可能であることを確認できます。
public GoogleMap getMap()
GoogleMap。フラグメントのビューの準備がまだ整っていない場合はnull。これは、フラグメントのライフサイクルがまだonCreateView(LayoutInflater、ViewGroup、Bundle)を通過していない場合に発生する可能性があります。これは、Google Playサービスが利用できない場合にも発生する可能性があります。その後Google Playサービスが利用可能になり、フラグメントがonCreateView(LayoutInflater、ViewGroup、Bundle)を通過した場合、このメソッドを再度呼び出すと、GoogleMapが初期化されて返されます。
ここでマップの可用性を確認 について読むことができます。