NullPointerException某些设备中的GoogleMaps

时间:2013-06-01 09:57:30

标签: android google-maps nullpointerexception fragment

我有一个使用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的对话框,但我无法理解代码如何到此为止。在我的手机中它工作正常。

1 个答案:

答案 0 :(得分:2)

你做错了检查。使用GooglePlayServicesUtil.isGooglePlayServicesAvailable代替查找不相关的应用程序。

并把这一行:

map.setMapType(GoogleMap.MAP_TYPE_SATELLITE);   // HERE CRASH !!!!!!!!!
检查内部,而不是执行后。此代码将无条件执行,因此您将始终在未安装Google Play服务的设备上获取NPE。

您也可以在自己的设备上测试。只需卸载Google Play服务。