我正在使用此代码覆盖我在谷歌地图上的位置使用GPS这个代码在我有Android 3.1时工作但是当操作系统升级到3.2时它停止工作并且强制关闭错误在最后出现。
此档案是位置叠加
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;
import android.location.Location;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;
public class MyPositionOverlay extends Overlay {
private final int mRadius = 5;
Location location;
public Location getLocation() {
return location;
}
public void setLocation(Location location) {
this.location = location;
}
@Override
public boolean onTap(GeoPoint point, MapView mapView) {
return false;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
if (shadow == false) {
// Get the current location
Double latitude = location.getLatitude()*1E6;
Double longitude = location.getLongitude()*1E6;
GeoPoint geoPoint;
geoPoint = new
GeoPoint(latitude.intValue(),longitude.intValue());
// Convert the location to screen pixels
Point point = new Point();
projection.toPixels(geoPoint, point);
RectF oval = new RectF(point.x - mRadius, point.y - mRadius,
point.x + mRadius, point.y + mRadius);
// Setup the paint
Paint paint = new Paint();
paint.setARGB(250, 255, 255, 255);
paint.setAntiAlias(true);
paint.setFakeBoldText(true);
Paint backPaint = new Paint();
backPaint.setARGB(175, 50, 50, 50);
backPaint.setAntiAlias(true);
RectF backRect = new RectF(point.x + 2 + mRadius,
point.y - 3*mRadius,
point.x + 65, point.y + mRadius);
// Draw the marker
canvas.drawOval(oval, paint);
canvas.drawRoundRect(backRect, 5, 5, backPaint);
canvas.drawText("Here I Am",
point.x + 2*mRadius, point.y,
paint);
}
super.draw(canvas, mapView, shadow);
}
}
这是主文件
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
public class WhereAmI extends MapActivity {
@Override
protected boolean isRouteDisplayed() {
return false;
}
MapController mapController;
MyPositionOverlay positionOverlay;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView myMapView = (MapView)findViewById(R.id.myMapView);
mapController = myMapView.getController();
myMapView.setSatellite(true);
myMapView.setStreetView(true);
myMapView.displayZoomControls(false);
mapController.setZoom(17);
// Add the MyPositionOverlay
positionOverlay = new MyPositionOverlay();
List<Overlay> overlays = myMapView.getOverlays();
overlays.add(positionOverlay);
LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = (LocationManager)getSystemService(context);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
String provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);
updateWithNewLocation(location);
locationManager.requestLocationUpdates(provider, 2000, 10,
locationListener);
}
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}
public void onProviderDisabled(String provider){
updateWithNewLocation(null);
}
public void onProviderEnabled(String provider){ }
public void onStatusChanged(String provider, int status,
Bundle extras){ }
};
private void updateWithNewLocation(Location location) {
String latLongString;
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.myLocationText);
String addressString = "No address found";
if (location != null) {
// Update my location marker
positionOverlay.setLocation(location);
// Update the map location.
Double geoLat = location.getLatitude()*1E6;
Double geoLng = location.getLongitude()*1E6;
GeoPoint point = new GeoPoint(geoLat.intValue(),
geoLng.intValue());
mapController.animateTo(point);
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
double latitude = location.getLatitude();
double longitude = location.getLongitude();
Geocoder gc = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = gc.getFromLocation(latitude,
longitude, 1);
StringBuilder sb = new StringBuilder();
if (addresses.size() > 0) {
Address address = addresses.get(0);
for (int i = 0; i < address.getMaxAddressLineIndex(); i++)
sb.append(address.getAddressLine(i)).append("\n");
sb.append(address.getLocality()).append("\n");
sb.append(address.getPostalCode()).append("\n");
sb.append(address.getCountryName());
}
addressString = sb.toString();
} catch (IOException e) {}
} else {
latLongString = "No location found";
}
myLocationText.setText("Your Current Position is:\n" +
latLongString + "\n" + addressString);
}
}
for xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/myLocationText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
<com.google.android.maps.MapView
android:id="@+id/myMapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0LSm5iUqsTW3O-7e74GQTt4pQKnxW7YVu-3Cftg"
/>
</LinearLayout>
logcat输出错误
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): FATAL EXCEPTION: main
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): java.lang.NullPointerException
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.paad.whereami.MyPositionOverlay.draw(MyPositionOverlay.java:37)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.google.android.maps.Overlay.draw(Overlay.java:179)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:45)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.google.android.maps.MapView.onDraw(MapView.java:530)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.View.draw(View.java:9279)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.drawChild(ViewGroup.java:2584)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.drawChild(ViewGroup.java:2582)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.drawChild(ViewGroup.java:2582)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.drawChild(ViewGroup.java:2582)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.View.draw(View.java:9282)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.widget.FrameLayout.draw(FrameLayout.java:419)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1923)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewRoot.draw(ViewRoot.java:1695)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewRoot.performTraversals(ViewRoot.java:1410)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.view.ViewRoot.handleMessage(ViewRoot.java:2040)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.os.Handler.dispatchMessage(Handler.java:99)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.os.Looper.loop(Looper.java:132)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at android.app.ActivityThread.main(ActivityThread.java:4123)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at java.lang.reflect.Method.invokeNative(Native Method)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at java.lang.reflect.Method.invoke(Method.java:491)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-07 13:33:43.180: ERROR/AndroidRuntime(1811): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:2)
我怀疑这是导致空指针的操作系统版本。 更可能是因为当调用draw时,overlay类中的'location'为null。
在draw方法中替换
if (shadow == false) {
带
if ((shadow == false) && (location != null)) {