[英]Null Pointer Exception while creating map example
它一直在为我获取此错误,并且在模拟器上显示强制关闭。 没有弄错地方。 实际上,我正在创建一个程序(参考书)来获取位置数据。 以下是我的程序和logcat错误。 我引用了这些link1 , link2 ,但是从这些中找不到解决方案。 有人可以建议我怎么了吗? 即使我已经在清单中添加了
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
并在应用程序标签中
<uses-library android:name="com.google.android.maps"/>
这是我的.java文件
public class LBSMap extends MapActivity {
MapView mapView;
MapController mc;
GeoPoint p;
LocationManager lm;
LocationListener locationListener;
private class MapOverlay extends com.google.android.maps.Overlay
{
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
Point screenPts=new Point();
mapView.getProjection().toPixels(p, screenPts);
Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50,null);
return true;
}
public boolean onTouchEvent(MotionEvent event,MapView mapView)
{
if(event.getAction()==1)
{
GeoPoint p=mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY());
Geocoder geoCoder=new Geocoder(getBaseContext(),Locale.getDefault());
try{
List<Address> addresses=geoCoder.getFromLocation(p.getLatitudeE6()/1E6, p.getLongitudeE6()/1E6, 1);
String add="";
if(addresses.size()>0)
{
for(int i=0;i<addresses.get(0).getMaxAddressLineIndex();i++)
add +=addresses.get(0).getAddressLine(i) + "\n";
}
Toast.makeText(getBaseContext(),add,Toast.LENGTH_SHORT).show();
}catch(IOException e){
e.printStackTrace();
}
return true;
}
return false;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lbsmap);
mapView=(MapView)findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(true);
mapView.setTraffic(true);
mc=mapView.getController();
Geocoder geoCoder=new Geocoder(this,Locale.getDefault());
try{
List<Address> addresses=geoCoder.getFromLocation(p.getLatitudeE6()/1E6, p.getLongitudeE6()/1E6, 1); //line 103
String add="";
if(addresses.size()>0)
{
for(int i=0;i<addresses.get(0).getMaxAddressLineIndex();i++)
add +=addresses.get(0).getAddressLine(i) + "\n";
}
Toast.makeText(getBaseContext(),add,Toast.LENGTH_SHORT).show();
}catch(IOException e){
e.printStackTrace();
}
MapOverlay mapOverlay=new MapOverlay();
List<Overlay> listOfOverlays=mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
mapView.invalidate();
lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
}
public void onResume()
{
super.onResume();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
public void onPause()
{
super.onPause();
lm.removeUpdates(locationListener);
}
private class MyLocationListener implements LocationListener
{
public void onLocationChanged(Location loc)
{
if(loc!=null){
Toast.makeText(getBaseContext(), "Location changed : Lat: "+loc.getLatitude()+ "Lng: "+loc.getLongitude(), Toast.LENGTH_SHORT).show();
p=new GeoPoint((int)(loc.getLatitude()*1E6),(int)(loc.getLongitude()*1E6));
mc.animateTo(p);
mc.setZoom(18);
}
}
public void onProviderDisabled(String provider)
{}
public void onProviderEnabled(String provider)
{}
public void onStatusChanged(String provider, int status, Bundle extras)
{}
}
@Override
public boolean isRouteDisplayed()
{
return false;
}
}
下面是logcat的屏幕截图。
我猜您的onCreate()
的GeoPoint p
为null,因为当您在Overlay代码中为其分配值时,您会使用
GeoPoint p=mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY());
这将创建另一个局部变量,而不是使用全局变量。 尝试使用:
p=mapView.getProjection().fromPixels((int)event.getX(),(int)event.getY());
您可能需要在声明中添加final
修饰符,以使其在另一个类中起作用。
请检查您是否具有适用于SDK版本> 9的Internet访问代码
// Allow network access
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.