2010-11-10 198 views
2

我想使用谷歌地圖在Android手機上顯示我目前的位置。 下面的代碼能夠顯示我目前在谷歌地圖上的位置嗎?谷歌地圖上的當前位置

MapsActivity.java

package log1.log2; 

import log1.log2.MyLocation.LocationResult; 

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.MapView.LayoutParams; 

import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.LinearLayout; 

public class MapsActivity extends MapActivity 
{  
    MapView mapView; 
    MapController mc; 
    GeoPoint p; 

    /** Called when the activity is first created. */ 
    @SuppressWarnings("deprecation") 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mapactivity); 

     mapView = (MapView) findViewById(R.id.mapView); 
     LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
     View zoomView = mapView.getZoomControls(); 
     zoomLayout.addView(zoomView, 
      new LinearLayout.LayoutParams(
       LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     mapView.displayZoomControls(true); 
    } 
    MyLocation myLocation = new MyLocation(); 
    private void locationClick() { 
     myLocation.getLocation(this, locationResult); 
    } 

    public LocationResult locationResult = new LocationResult(){ 
     public void gotLocation(final Location location){ 
      //Got the location! 
      }; 
     }; 

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

MyLocation.java

package log1.log2; 

import java.util.Timer; 
import java.util.TimerTask; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 

public class MyLocation { 
    Timer timer1; 
    LocationManager lm; 
    LocationResult locationResult; 
    boolean gps_enabled=false; 
    boolean network_enabled=false; 

    public boolean getLocation(Context context, LocationResult result) 
    { 
     //I use LocationResult callback class to pass location value from MyLocation to user code. 
     locationResult=result; 
     if(lm==null) 
      lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 

     //exceptions will be thrown if provider is not permitted. 
     try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} 
     try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} 

     //don't start listeners if no provider is enabled 
     if(!gps_enabled && !network_enabled) 
      return false; 

     if(gps_enabled) 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps); 
     if(network_enabled) 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); 
     timer1=new Timer(); 
     timer1.schedule(new GetLastLocation(), 20000); 
     return true; 
    } 

    LocationListener locationListenerGps = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerNetwork); 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    LocationListener locationListenerNetwork = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      timer1.cancel(); 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerGps); 
     } 
     public void onProviderDisabled(String provider) {} 
     public void onProviderEnabled(String provider) {} 
     public void onStatusChanged(String provider, int status, Bundle extras) {} 
    }; 

    class GetLastLocation extends TimerTask { 
     @Override 
     public void run() { 
      lm.removeUpdates(locationListenerGps); 
      lm.removeUpdates(locationListenerNetwork); 

      Location net_loc=null, gps_loc=null; 
      if(gps_enabled) 
       gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if(network_enabled) 
       net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

      //if there are both values use the latest one 
      if(gps_loc!=null && net_loc!=null){ 
       if(gps_loc.getTime()>net_loc.getTime()) 
        locationResult.gotLocation(gps_loc); 
       else 
        locationResult.gotLocation(net_loc); 
       return; 
      } 

      if(gps_loc!=null){ 
       locationResult.gotLocation(gps_loc); 
       return; 
      } 
      if(net_loc!=null){ 
       locationResult.gotLocation(net_loc); 
       return; 
      } 
      locationResult.gotLocation(null); 
     } 
    } 

    public static abstract class LocationResult{ 
     public abstract void gotLocation(Location location); 
    } 
} 

謝謝。

+3

您告訴我們。運行它並找出答案。 – Galen 2010-11-10 05:03:21

+0

我無法測試它,因爲我沒有安卓手機。我只能運行模擬器,其中只顯示了世界地圖。 – User358218 2010-11-10 05:20:06

+0

Google地圖在模擬器上運行得非常好。您可以通過DDMS – Falmarri 2010-11-10 20:20:50

回答

6

如果您只想顯示自己的位置,那麼MyLocationOverlay可能是最簡單的。這裏

快速的信息(即本文的其餘部分可能也有幫助):

http://www.vogella.com/articles/AndroidLocationAPI/article.html#maps_mylocation

有關無法測試它在模擬器:您可以測試它。在Eclipse切換到DDMS透視圖中,在左邊看到「Emulator Control」,在那裏你可以在「位置控制」下面「發送」位置。這在上面的教程中已有描述。

+0

發送仿真器GPS座標好吧。我會檢查教程。非常感謝。 – User358218 2010-11-10 06:15:39

+0

鏈接腐....... – 2012-05-25 10:34:17

6

不知道,我還沒有通過代碼走了,但下面的代碼爲我工作:

public class GoogleMapsActivity extends MapActivity { 
    public static final String TAG = "GoogleMapsActivity"; 
    private MapView mapView; 
    private LocationManager locationManager; 
    Geocoder geocoder; 
    Location location; 
    LocationListener locationListener; 
    CountDownTimer locationtimer; 
    MapController mapController; 
    MapOverlay mapOverlay = new MapOverlay(); 

    @Override 
    protected void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.googlemap); 
     initComponents(); 
     mapView.setBuiltInZoomControls(true); 
     mapView.setSatellite(true); 
     mapController = mapView.getController(); 
     mapController.setZoom(16); 
     locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     if (locationManager == null) { 
      Toast.makeText(GoogleMapsActivity.this, 
        "Location Manager Not Available", Toast.LENGTH_SHORT) 
        .show(); 
      return; 
     } 
     location = locationManager 
       .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location == null) 
      location = locationManager 
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     if (location != null) { 
      double lat = location.getLatitude(); 
      double lng = location.getLongitude(); 
      Toast.makeText(GoogleMapsActivity.this, 
        "Location Are" + lat + ":" + lng, Toast.LENGTH_SHORT) 
        .show(); 
      GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
      mapController.animateTo(point, new Message()); 
      mapOverlay.setPointToDraw(point); 
      List<Overlay> listOfOverlays = mapView.getOverlays(); 
      listOfOverlays.clear(); 
      listOfOverlays.add(mapOverlay); 
     } 
     locationListener = new LocationListener() { 
      @Override 
      public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
      } 

      @Override 
      public void onProviderEnabled(String arg0) { 
      } 

      @Override 
      public void onProviderDisabled(String arg0) { 
      } 

      @Override 
      public void onLocationChanged(Location l) { 
       location = l; 
       locationManager.removeUpdates(this); 
       if (l.getLatitude() == 0 || l.getLongitude() == 0) { 
       } else { 
        double lat = l.getLatitude(); 
        double lng = l.getLongitude(); 
        Toast.makeText(GoogleMapsActivity.this, 
          "Location Are" + lat + ":" + lng, 
          Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }; 
     if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
      locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 1000, 10f, locationListener); 
     locationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, 1000, 10f, locationListener); 
     locationtimer = new CountDownTimer(30000, 5000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       if (location != null) 
        locationtimer.cancel(); 
      } 

      @Override 
      public void onFinish() { 
       if (location == null) { 
       } 
      } 
     }; 
     locationtimer.start(); 
    } 

    public MapView getMapView() { 
     return this.mapView; 
    } 

    private void initComponents() { 
     mapView = (MapView) findViewById(R.id.googleMapview); 
    } 

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

    class MapOverlay extends Overlay { 
     private GeoPoint pointToDraw; 

     public void setPointToDraw(GeoPoint point) { 
      pointToDraw = point; 
     } 

     public GeoPoint getPointToDraw() { 
      return pointToDraw; 
     } 

     @Override 
     public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
       long when) { 
      super.draw(canvas, mapView, shadow); 

      Point screenPts = new Point(); 
      mapView.getProjection().toPixels(pointToDraw, screenPts); 

      Bitmap bmp = BitmapFactory.decodeResource(getResources(), 
        R.drawable.pingreen); 
      canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 24, null); 
      return true; 
     } 
    } 

} 
+1

Correcta .... :) – mAc 2011-11-14 04:45:14

+0

謝謝男人。 .. – 2012-12-13 05:51:41

+0

@AndroidTechMe:最受歡迎 – 2012-12-13 07:15:44

相關問題