2012-10-28 68 views
2

我不知道这里发生了什么。我正在添加一个声明,以便在长按时让手机振动。我把声明放在错误的地方,电话不断振动。所以我拔掉了电话并关闭了电源。然后我删除了导致我的电话执行此操作的代码。然后尝试重新启动应用程序,因为它之前我添加了代码,现在我得到了这个。我不确定发生了什么,因为代码与工作时完全一样。缓存的文件是否会导致这种情况?现在应用程序启动它不

这里是我的logcat:

10-28 17:34:51.381: W/dalvikvm(718): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
10-28 17:34:51.389: E/AndroidRuntime(718): FATAL EXCEPTION: main 
10-28 17:34:51.389: E/AndroidRuntime(718): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.almyz125.stamp/com.almyz125.stamp.Map}: java.lang.NullPointerException 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.os.Handler.dispatchMessage(Handler.java:99) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.os.Looper.loop(Looper.java:137) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.ActivityThread.main(ActivityThread.java:4745) 
10-28 17:34:51.389: E/AndroidRuntime(718): at java.lang.reflect.Method.invokeNative(Native Method) 
10-28 17:34:51.389: E/AndroidRuntime(718): at java.lang.reflect.Method.invoke(Method.java:511) 
10-28 17:34:51.389: E/AndroidRuntime(718): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
10-28 17:34:51.389: E/AndroidRuntime(718): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-28 17:34:51.389: E/AndroidRuntime(718): at dalvik.system.NativeStart.main(Native Method) 
10-28 17:34:51.389: E/AndroidRuntime(718): Caused by: java.lang.NullPointerException 
10-28 17:34:51.389: E/AndroidRuntime(718): at com.almyz125.stamp.Map.onCreate(Map.java:88) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.Activity.performCreate(Activity.java:5008) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
10-28 17:34:51.389: E/AndroidRuntime(718): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
10-28 17:34:51.389: E/AndroidRuntime(718): ... 11 more 

这里是我的代码也:

public class Map extends MapActivity implements LocationListener { 

// variable for determining long press and then automatically adding a pin 
// to the map 
private int minMillisecondThresholdForLongClick = 800; 
private long startTimeForLongClick = 0; 
private float xScreenCoordinateForLongClick; 
private float yScreenCoordinateForLongClick; 
private float xtolerance = 10;// x pixels that your finger can be off but 
           // still constitute a long press 
private float ytolerance = 10;// y pixels that your finger can be off but 
           // still constitute a long press 
private float xlow; // actual screen coordinate when you subtract the 
        // tolerance 
private float xhigh; // actual screen coordinate when you add the tolerance 
private float ylow; // actual screen coordinate when you subtract the 
        // tolerance 
private float yhigh; // actual screen coordinate when you add the tolerance 

// Variables 
MapView mapView; 
MapController mc; 
long start; 
long stop; 
int x, y, longTemp, latTemp; 
GeoPoint touchPoint; 
LocationManager lm; 
Drawable d; 
Location lastKnownLoc; 
List<Overlay> mapoverlays; 
GeoPoint gp; 
private MyLocationOverlay myLocOverlay, compass; 

// Auto Generated Methods 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    // sets view to map 
    setContentView(R.layout.main); 
    mapView = (MapView) findViewById(R.id.mvMain); 
    mc = mapView.getController(); 
    compass = new MyLocationOverlay(Map.this, mapView); 
    d = getResources().getDrawable(R.drawable.icon); 
    mapoverlays = mapView.getOverlays(); 
    myLocOverlay = new MyLocationOverlay(this, mapView); 

    mapoverlays = mapView.getOverlays(); 

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lastKnownLoc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

    longTemp = (int) (lastKnownLoc.getLongitude() * 1e6); 
    latTemp = (int) (lastKnownLoc.getLatitude() * 1e6); 
    gp = new GeoPoint(latTemp, longTemp); 

    // enables on screen zoom buttons 
    mapView.setBuiltInZoomControls(true); 

    // create overlay that shows our location 

    // add this overlay to the map and refresh it 
    mapView.getOverlays().add(myLocOverlay); 
    mapView.invalidate(); 

    mapoverlays.add(compass); 
    compass.enableMyLocation(); 
    compass.enableCompass(); 

} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    // return super.onCreateOptionsMenu(menu); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.options, menu); 
    return true; 
} 

@Override 
public boolean onMenuItemSelected(int featureId, MenuItem item) { 
    // handle on menu item selected here 
    super.onMenuItemSelected(featureId, item); 

    // if item is selected satellite view is toggled 
    if (item.getItemId() == R.id.opt_tog_view) { 
     toggleSat(); 
    } 

    return true; 
} 

// method to toggles satellite view called in option menu 
public void toggleSat() { 
    if (mapView.isSatellite()) { 

     mapView.setSatellite(false); 
    } else { 
     mapView.setSatellite(true); 
    } 
} 

// Volume keys zoom in and out. 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    mc = mapView.getController(); 
    switch (keyCode) { 
    case KeyEvent.KEYCODE_VOLUME_UP: 
     mc.zoomIn(); 
     break; 
    case KeyEvent.KEYCODE_VOLUME_DOWN: 
     mc.zoomOut(); 
     break; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 
    compass.disableMyLocation(); 
    compass.disableCompass(); 
    myLocOverlay.disableMyLocation(); 

} 

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    gp = new GeoPoint(latTemp, longTemp); 
    myLocOverlay.enableMyLocation(); 
    compass.enableMyLocation(); 
    compass.enableCompass(); 
    mapoverlays.add(compass); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderDisabled(String arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    /* 
    * We want to capture the place the user long pressed on the map and add 
    * a marker (pin) on the map at that lat/long. This solution: 1. Allows 
    * you to set the time threshold for what constitutes a long press 2. 
    * Doesn't get fooled by scrolling, multi-touch, or non-multi-touch 
    * events 
    * 
    * Thank you Roger Kind Kristiansen for the main idea 
    */ 

    // get the action from the MotionEvent: down, move, or up 
    int actionType = ev.getAction(); 


    if (actionType == MotionEvent.ACTION_DOWN) { 
     // user pressed the button down so let's initialize the main 
     // variables that we care about: 
     // later on when the "Action Up" event fires, the "DownTime" should 
     // match the "startTimeForLongClick" that we set here 
     // the coordinate on the screen should not change much during the 
     // long press 

     startTimeForLongClick = ev.getEventTime(); 
     xScreenCoordinateForLongClick = ev.getX(); 
     yScreenCoordinateForLongClick = ev.getY(); 


    } else if (actionType == MotionEvent.ACTION_MOVE) { 
     // For non-long press actions, the move action can happen a lot 
     // between ACTION_DOWN and ACTION_UP 
     if (ev.getPointerCount() > 1) { 
      // easiest way to detect a multi-touch even is if the pointer 
      // count is greater than 1 
      // next thing to look at is if the x and y coordinates of the 
      // person's finger change. 
      startTimeForLongClick = 0; // instead of a timer, just reset 
             // this class variable and in our 
             // ACTION_UP event, the DownTime 
             // value will not match and so we 
             // can reset. 
     } else { 
      // I know that I am getting to the same action as above, 
      // startTimeForLongClick=0, but I want the processor 
      // to quickly skip over this step if it detects the pointer 
      // count > 1 above 
      float xmove = ev.getX(); // where is their finger now? 
      float ymove = ev.getY(); 
      // these next four values allow you set a tiny box around their 
      // finger in case 
      // they don't perfectly keep their finger still on a long click. 
      xlow = xScreenCoordinateForLongClick - xtolerance; 
      xhigh = xScreenCoordinateForLongClick + xtolerance; 
      ylow = yScreenCoordinateForLongClick - ytolerance; 
      yhigh = yScreenCoordinateForLongClick + ytolerance; 
      if ((xmove < xlow || xmove > xhigh) 
        || (ymove < ylow || ymove > yhigh)) { 
       // out of the range of an acceptable long press, reset the 
       // whole process 
       startTimeForLongClick = 0; 

      } 

     } 



    } else if (actionType == MotionEvent.ACTION_UP) { 
     // determine if this was a long click: 
     long eventTime = ev.getEventTime(); 
     long downTime = ev.getDownTime(); // this value will match the 
              // startTimeForLongClick 
              // variable as long as we didn't 
              // reset the 
              // startTimeForLongClick 
              // variable because we detected 
              // nonsense that invalidated a 
              // long press in the ACTION_MOVE 
              // block 

     // make sure the start time for the original "down event" is the 
     // same as this event's "downTime" 
     if (startTimeForLongClick == downTime) { 
      // see if the event time minus the start time is within the 
      // threshold 
      if ((eventTime - startTimeForLongClick) > minMillisecondThresholdForLongClick) { 
       // make sure we are at the same spot where we started the 
       // long click 
       float xup = ev.getX(); 
       float yup = ev.getY(); 
       // I don't want the overhead of a function call: 
       xlow = xScreenCoordinateForLongClick - xtolerance; 
       xhigh = xScreenCoordinateForLongClick + xtolerance; 
       ylow = yScreenCoordinateForLongClick - ytolerance; 
       yhigh = yScreenCoordinateForLongClick + ytolerance; 
       if ((xup > xlow && xup < xhigh) 
         && (yup > ylow && yup < yhigh)) { 

        // **** safe to process your code for an actual long 
        // press **** 
        // comment out these next rows after you confirm in 
        // logcat that the long press works 
        long totaltime = eventTime - startTimeForLongClick; 
        String strtotaltime = Long.toString(totaltime); 
        Log.d("long press detected: ", strtotaltime); 

        // Below is code from my touchy class 

        x = (int) ev.getX(); 
        y = (int) ev.getY(); 
        touchPoint = mapView.getProjection().fromPixels(x, y); 

        Builder alert = new AlertDialog.Builder(Map.this); 
        alert.setTitle("Pick an option."); 
        alert.setNeutralButton("Place a marker", 
          new DialogInterface.OnClickListener() { 

           public void onClick(DialogInterface dialog, 
             int which) { 

            OverlayItem overlayItem = new OverlayItem(
              touchPoint, "What's up", 
              "2nd String"); 
            Mark custom = new Mark(d, Map.this); 
            custom.dropMarker(overlayItem); 
            mapoverlays.add(custom); 

           } 
          }); 
        alert.setPositiveButton("Get Address", 
          new DialogInterface.OnClickListener() { 

           public void onClick(DialogInterface dialog, 
             int which) { 

            Geocoder geocoder = new Geocoder(
              getBaseContext(), Locale 
                .getDefault()); 

            try { 

             List<Address> address = geocoder.getFromLocation(
               touchPoint.getLatitudeE6()/1E6, 
               touchPoint.getLongitudeE6()/1E6, 
               1); 
             if (address.size() > 0) { 
              String display = ""; 
              for (int i = 0; i < address 
                .get(0) 
                .getMaxAddressLineIndex(); i++) { 

               display += address.get(0) 
                 .getAddressLine(i) 
                 + "\n"; 
              } 

              Toast t = Toast.makeText(
                getBaseContext(), 
                display, 
                Toast.LENGTH_LONG); 
              t.show(); 
             } 
            } catch (IOException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
            } finally { 

            } 

           } 
          }); 
        alert.show(); 

       } 

      } 
     } 


    } 

    return super.dispatchTouchEvent(ev) && true; 
} 
} 

这里是我的清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.almyz125.stamp" > 

<uses-permission android:name="android.permission.INTERNET" /> 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<application 
    android:icon="@drawable/icon" 
    android:label="@string/activity_main_map" > 
    <uses-library android:name="com.google.android.maps" /> 

    <activity 
     android:name="com.almyz125.stamp.Map" 
     android:label="STAMP" > 
     <intent-filter> 
      <category android:name="android.intent.category.LAUNCHER" > 
      </category> 

      <action android:name="android.intent.action.MAIN" > 
      </action> 
     </intent-filter> 
    </activity> 
    </application> 

</manifest> 
+0

安置自己的清单和相关代码 – Ahmad

回答

2

你不能确保getLastKnownLocation不会在创建包含MyLocationOverlay的活动时为空,因此您必须像snippe一样对其进行解释低于T:

if(lastKnownLoc != null){ 
    longTemp = (int) (lastKnownLoc.getLongitude() * 1e6); 
    latTemp = (int) (lastKnownLoc.getLatitude() * 1e6); 
    gp = new GeoPoint(latTemp, longTemp); 
} 

它的工作,你才重新启动你的手机很简单,因为机器人对您所在的位置以前的修复,但可能不会永远是这样的事实。

您可能还想尝试使用runOnFirstFix方法作为解决问题的更好方法。

compass.runOnFirstFix(new Runnable() { 

     @Override 
     public void run() { 
      Location location = compass.getLastFix(); 
      //do your location code here 
     } 
    }); 
+0

感谢您的帮助,但我仍然无法数字出来,线88: longTemp =(INT)(lastKnownLoc.getLongitude()* 1E6); – almyz125

+0

这正是我所描述的。 lastKnownLoc在该点为空。使它抛出一个NullPointerException。只要添加lastKnowLoc!= null,你就会看到它会从该行传递过来。正如我试图解释lm.getLastKnownLocation()可以为空,所以你必须说明这一点。 –

相关问题