我有一个使用GoogleMap v2的应用。在我的设备(Galaxy Nexus)工作正常,但在其他手机崩溃,我不知道为什么。我的代码:
public class Activity_Maps extends android.support.v4.app.FragmentActivity {
private GoogleMap map = null;
//...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
setUpMapIfNeeded(); // Verify Google Maps and load it
//...
map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); // HERE CRASH !!!!!!!!!
//...
}
private void setUpMapIfNeeded() {
if (map == null) {
if (isGoogleMapsInstalled()) {
map = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map)).getMap();
Notification notification = new Notification(getBaseContext(),
"GoogleMaps", getResources().getString(
R.string.googlemaps_found));
notification.show();
} else {
dialogNeedGoogleMap();
}
} else {
Log.i(TAG, "map != null");
}
}
public boolean isGoogleMapsInstalled() {
try {
getPackageManager().getApplicationInfo(
"com.google.android.apps.maps", 0);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
/*
* Go GooglePlay to install GoogleMap
*/
public void dialogNeedGoogleMap() {
final String MARKET = "market://details?id=com.google.android.apps.maps";
AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle(getResources().getString(
R.string.googlemaps_need1));
dialog.setMessage(getResources().getString(
R.string.googlemaps_need2));
dialogo.setCancelable(false);
dialog.setPositiveButton(getResources().getString(R.string.ok),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri
.parse(MARKET));
startActivity(intent);
finish();
}
});
dialog.setNegativeButton(getResources().getString(R.string.cancel),
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
dialog.show();
}
我在xml中的地图:
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
我认为崩溃可能来自没有GoogleMap的设备,但在这种情况下应显示一个对话框,提供安装或退出选项而不加载地图。在这种情况下,应显示一个对话框,提供安装或退出的选项。
我从GoogleAnalytics中捕获了异常,并且他们都在排队:
map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
我可以捕获此异常并显示GoogleMaps的对话框,但我无法理解代码如何到此为止。在我的手机中它工作正常。
答案 0 :(得分:2)
你做错了检查。使用GooglePlayServicesUtil.isGooglePlayServicesAvailable代替查找不相关的应用程序。
并把这一行:
map.setMapType(GoogleMap.MAP_TYPE_SATELLITE); // HERE CRASH !!!!!!!!!
检查内部,而不是执行后。此代码将无条件执行,因此您将始终在未安装Google Play服务的设备上获取NPE。
您也可以在自己的设备上测试。只需卸载Google Play服务。