android程序运行空指针问题。

Turisla 2012-08-23 11:16:14
调试程序报错空指针。
我是在网上找别人的代码。

Mylocation.java



package com.swift.mylocation;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import android.app.PendingIntent;

import android.content.Context;
import android.content.Intent;

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;
import android.widget.Toast;

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 com.swift.mylocation.R;

public class Mylocation extends MapActivity {

MapController mapController;
List<Overlay> overlays;
MyPositionOverlay positionOverlay;
LocationManager locationManager;
MapView myMapView;

final String PROXIMITY_ALERT = new String(
"android.intent.action.proximityalert");

@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);

myMapView = (MapView) findViewById(R.id.myMapView);

mapController = myMapView.getController();

myMapView.setSatellite(true);
myMapView.setStreetView(true);
myMapView.displayZoomControls(false);

mapController.setZoom(17);

positionOverlay = new MyPositionOverlay();
overlays = myMapView.getOverlays();
overlays.add(positionOverlay);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(true);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

String provider = locationManager.getBestProvider(criteria, true);

Location location = locationManager.getLastKnownLocation(provider);

updateWithNewLocation(location);

locationManager.requestLocationUpdates(provider, 2000, 10,
locationListener);

setProximityAlert();

}

private final LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateWithNewLocation(location);
}

@Override
public void onProviderDisabled(String provider) {
updateWithNewLocation(null);
}

@Override
public void onProviderEnabled(String provider) {
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
};




void setProximityAlert() {

double lat = 31.620356666666666;
double lng = 121.38631333333333;
float radius = 50f;
long expiration = -1;

Intent intent = new Intent(PROXIMITY_ALERT);
intent.setAction(PROXIMITY_ALERT);
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, -1,
intent, 0);

locationManager.addProximityAlert(lat, lng, radius, expiration,
proximityIntent);

}

/** Update UI with a new location */
private void updateWithNewLocation(Location location) {

String latLongString;
TextView myLocationText;
myLocationText = (TextView) findViewById(R.id.myLocationText);
String addressString = "No address found";
if (location != null) {

positionOverlay.setLocation(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.CHINA);
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.getCountryName());
sb.append(address.getLocality()).append("\n");
}
addressString = sb.toString();
} catch (IOException e) {
}
} else {
latLongString = "No location found";
}
myLocationText.setText("Your Current Position is:\n" + latLongString
+ "\n" + addressString);

Toast.makeText(this,this.getIntent().getStringExtra(PROXIMITY_ALERT) , Toast.LENGTH_LONG);
}

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




MyPostionOverlay.java




package com.swift.mylocation;

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 {

Location location, mlocation;
final Double lat = 31.620356666666666 * 1E6,
lon = 121.38631333333333 * 1E6;
final int ccc = 50;
private final int mRadius = 5;

/**
* @return the location
*/
public Location getLocation() {
return location;
}

/**
* @param location
* the location to set
*/
public void setLocation(Location location) {
this.location = location;
}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Projection projection = mapView.getProjection();
if (shadow == false) {

Double latitude = location.getLatitude() * 1E6;
Double longitude = location.getLongitude() * 1E6;
GeoPoint geoPoint, gp;
geoPoint = new GeoPoint(latitude.intValue(), longitude.intValue());
gp = new GeoPoint(lat.intValue(), lon.intValue());

Point point = new Point();
projection.toPixels(geoPoint, point);
RectF oval = new RectF(point.x - mRadius, point.y - mRadius,
point.x + mRadius, point.y + mRadius);

Paint paint = new Paint();
paint.setARGB(250, 255, 0, 0);
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);

Point center = new Point();

projection.toPixels(gp, center);

Paint ccp = new Paint();
ccp.setARGB(250, 0, 0, 255);
ccp.setAntiAlias(true);

canvas.drawCircle(center.x, center.y, ccc, ccp);

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);
}

@Override
public boolean onTap(GeoPoint point, MapView mapView) {
return false;
}
}
...全文
345 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Turisla 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我了个去,这个找的痛苦啊,你双击空指针,找到对应的行先
[/Quote]
提示是这一句public void draw(Canvas canvas, MapView mapView, boolean shadow) {
在MyPositionOverlay类里面。
Turisla 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

LogCat中的详细出错提示也要发上来
[/Quote]
2楼的就是logcat里提示的错误
franzhong 2012-08-23
  • 打赏
  • 举报
回复
我了个去,这个找的痛苦啊,你双击空指针,找到对应的行先
AMinfo 2012-08-23
  • 打赏
  • 举报
回复
LogCat中的详细出错提示也要发上来
Turisla 2012-08-23
  • 打赏
  • 举报
回复
错误信息
08-23 03:02:37.121: E/AndroidRuntime(943): FATAL EXCEPTION: main
08-23 03:02:37.121: E/AndroidRuntime(943): java.lang.NullPointerException
08-23 03:02:37.121: E/AndroidRuntime(943): at com.swift.mylocation.MyPositionOverlay.draw(MyPositionOverlay.java:42)
08-23 03:02:37.121: E/AndroidRuntime(943): at com.google.android.maps.Overlay.draw(Overlay.java:179)
08-23 03:02:37.121: E/AndroidRuntime(943): at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:45)
08-23 03:02:37.121: E/AndroidRuntime(943): at com.google.android.maps.MapView.onDraw(MapView.java:530)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.View.draw(View.java:13458)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.View.draw(View.java:13342)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.View.draw(View.java:13340)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.View.draw(View.java:13340)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.View.draw(View.java:13340)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.View.draw(View.java:13461)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.widget.FrameLayout.draw(FrameLayout.java:467)
08-23 03:02:37.121: E/AndroidRuntime(943): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2183)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewRootImpl.drawSoftware(ViewRootImpl.java:2256)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2151)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2019)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1830)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.Choreographer.doCallbacks(Choreographer.java:555)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.Choreographer.doFrame(Choreographer.java:525)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.os.Handler.handleCallback(Handler.java:615)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.os.Looper.loop(Looper.java:137)
08-23 03:02:37.121: E/AndroidRuntime(943): at android.app.ActivityThread.main(ActivityThread.java:4745)
08-23 03:02:37.121: E/AndroidRuntime(943): at java.lang.reflect.Method.invokeNative(Native Method)
08-23 03:02:37.121: E/AndroidRuntime(943): at java.lang.reflect.Method.invoke(Method.java:511)
08-23 03:02:37.121: E/AndroidRuntime(943): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-23 03:02:37.121: E/AndroidRuntime(943): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-23 03:02:37.121: E/AndroidRuntime(943): at dalvik.system.NativeStart.main(Native Method)
Turisla 2012-08-23
  • 打赏
  • 举报
回复
ProximityIntentReceiver.java



package com.swift.mylocation;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.location.LocationManager;
import android.util.Log;

public class ProximityIntentReceiver extends BroadcastReceiver {

private final String textin = "alert : in", textout = "alert : out";

@Override
public void onReceive(Context context, Intent intent) {
String key = LocationManager.KEY_PROXIMITY_ENTERING;
Boolean isEnter = intent.getBooleanExtra(key, false);
if (isEnter) {
Log.d("allan", textin);


} else {
Log.d("allan", textout);



}

}

}







main.xml



<?xml version="1.0" encoding="utf-8"?>
<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="0zdXWumBW73cogtigVuQ2NgzWpPwNMYmb-hjJ8A"
/>
</LinearLayout>

androidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.swift.mylocation">
<application android:icon="@drawable/icon">
<uses-library android:name="com.google.android.maps"/>
<activity android:name="com.swift.mylocation.Mylocation" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver android:name="ProximityIntentReceiver">
<intent-filter>
<action android:name="android.intent.action.proximityalert" />
</intent-filter>
</receiver>

</application>

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-sdk android:minSdkVersion="3"/>
</manifest>


小王爷 2012-08-23
  • 打赏
  • 举报
回复
08-23 03:02:37.121: E/AndroidRuntime(943): at com.swift.mylocation.MyPositionOverlay.draw(MyPositionOverlay.java:42)
这行代码粘出来啊
Turisla 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

Location location = locationManager.getLastKnownLocation(provider);
此处得到的location的值为空

updateWithNewLocation(location);
这个应该改为

if(location !=null )
{
updateWithNewLocation(location);
}
[/Quote]
还是不行,大神
fire_fire_fire 2012-08-23
  • 打赏
  • 举报
回复
神啊,谁有功夫看这么长的代码?空指针异常就打断点调啊,看是哪个变量空指针,解决一下不就完了。
AMinfo 2012-08-23
  • 打赏
  • 举报
回复
Location location = locationManager.getLastKnownLocation(provider);
此处得到的location的值为空

updateWithNewLocation(location);
这个应该改为

if(location !=null )
{
updateWithNewLocation(location);
}

80,355

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧