Google映射android api v1 mapview教程崩溃

时间:2013-02-25 23:57:59

标签: android google-maps

我正在执行此处的MapView教程:https://developers.google.com/maps/documentation/android/v1/hello-mapview

问题在于它一直在崩溃。这是代码:

package com.example.googlemapstest;

import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.Menu;

public class MainActivity extends MapActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MapView mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);

    List<Overlay> mapOverlays = mapView.getOverlays();

    Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);
    HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);

    GeoPoint point = new GeoPoint(19240000,-99120000);
    OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");

    drawable.setBounds(0,0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
    overlayitem.setMarker(drawable); 

    itemizedoverlay.addOverlay(overlayitem, drawable);
    mapOverlays.add(itemizedoverlay);

}

@Override
protected boolean isRouteDisplayed() {
    return false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

HelloItemizedOverlay类:

package com.example.googlemapstest;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class HelloItemizedOverlay extends ItemizedOverlay
{
private ArrayList<OverlayItem> mOverlays;
Context mContext; 

public HelloItemizedOverlay(Drawable defaultMarker) {
      super(boundCenterBottom(defaultMarker));
      mOverlays =  new ArrayList<OverlayItem>(); 
      populate(); 
    }

public void addOverlay(OverlayItem overlay, Drawable drawable) {
    overlay.setMarker(drawable); 
    mOverlays.add(overlay);
    populate();
}

@Override
public int size() {
  return mOverlays.size();
}

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
      super(boundCenterBottom(defaultMarker));
      mContext = context;
      mOverlays =  new ArrayList<OverlayItem>(); 
      populate(); 
    }

@Override
protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
}

@Override
protected OverlayItem createItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}
}

我不断获得的例外是

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.googlemapstest/com.example.googlemapstest.MainActivity} : java.lang.NullPointerException

崩溃发生在itemizedoverlay.addOverlay(overlayitem,drawable)的populate()行; 现在,我最初发现我添加的OverlayItem的mMarker变量为null,并添加了两行来手动设置它。但是,该程序仍然崩溃!

然后我发现了这个问题:Problem with crash with ItemizedOverlay似乎正在处理同样的错误。

我按照那里的最佳答案做了推荐,但仍然没有运气。

我相信我已经对此进行了彻底的梳理,无法想象零错误的来源。任何帮助深表感谢。

2 个答案:

答案 0 :(得分:1)

我很确定你不应该在null中返回createItem(int index),这意味着你应该在HelloItemizedOverlay类中更改以下方法:

@Override
protected OverlayItem createItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

最基本的实现应该返回适​​合给定OverlayItem的{​​{1}}对象。很可能,您只想返回位于同一索引的index列表中的任何对象。例如:

OverlayItem

只有在某处填充该列表时才会有意义。另外,为避免混淆,您可能应该将变量重命名为@Override protected OverlayItem createItem(int index) { return mOverlays.get(index); } ,因为它包含的内容(而不是'覆盖')。

更重要的是,正如@ianhanniballake已经提到的:Android Maps SDK v1已被弃用,转而支持v2。这意味着,从 2013年3月3日,您将无法再为v1请求API密钥。如果你还没有这样做,那么现在最好快点并生成一个密钥,或者现在只迁移到v2,这可能不是一个糟糕的举动。

答案 1 :(得分:0)

截至2012年12月3日已正式弃用Google Maps Android API的第1版

使用Google Map API V2,让您的生活变得轻松

https://developers.google.com/maps/documentation/android/

快乐编码