需求是这样的:如果手机已安装google map,通过google map打开google地图;否则通过浏览器打开google地图(无论是否已安装其它地图程序)。

网上比较普遍的判断方法是通过Class.forName判断有没有这个类:

try {
    Class.forName("com.google.android.maps.MapActivity");
} catch (Exception e) {
     return;
}

例如这个如何在Android真机上检测是否有Google Map add-on

国外一位大牛指出:在标签中还包含了一个没有公布的属性"android:required",你可以将com.google.android.maps库的这个属性设置为false,即:

这代表如果在目标机器上内置了Google Map add-on,则可以正常使用应用;如果目标机器没有内置Google Map add-on,也可以成功安装应用。但是开发人员需要在代码中自行判断Google Map add-on是否可用。

try {
    Class.forName("com.google.android.maps.MapActivity");
} catch (Exception e) {
    Toast.makeText(MainActivity.this, "Oop! google地图不可用", Toast.LENGTH_SHORT).show();
    return;
}
Intent intent = new Intent();
intent.setClass(MainActivity.this, MyMapActivity.class);
startActivity(intent);

但是这种方法在有些版本的系统上不生效。后来一朋友说他们是这样实现的:

1.首先定义一个方法isIntentAvailable(Intent intent);用来判断有没有这个intent要”启动的“应用。

private boolean isIntentAvailable(Intent intent) {
	List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent,
                PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
	return activities.size() != 0;
}

2.然后调用判断即可。

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://ditu.google.cn/maps?hl=zh&mrt=loc&q="+ mStatus.getCdn()));
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.setClassName("com.google.android.apps.maps","com.google.android.maps.MapsActivity");
if (isIntentAvailable(intent)) {
    startActivity(intent);
    return;
}
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://ditu.google.cn/maps?hl=zh&mrt=loc&q="+ mStatus.getCdn()));
startActivity(intent);

关键是isIntentAvailable()方法。不但可以判断地图程序,还可以判断任意程序是否已安装。 API一定要熟悉。。