需求是这样的:如果手机已安装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一定要熟悉。。