【问题标题】:Android Map with current location具有当前位置的 Android 地图
【发布时间】:2011-05-09 13:28:32
【问题描述】:

我有以下代码,但我的 gps 没有获取当前位置,在触摸时向我显示地址并且没有覆盖。我得到的纬度和经度为0.0。基本上只显示地图。非常感谢您的帮助。谢谢!

公共类 Map 扩展 MapActivity{

MapView mapView;
MapController mc;
GeoPoint p;
private LocationManager lm;
private LocationListener locationListener;
Button btn_send;
int lat, lng;


class MapOverlay extends com.google.android.maps.Overlay
{
    @Override
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    {
        super.draw(canvas, mapView, shadow);                   

        //---translate the GeoPoint to screen pixels---
        Point screenPts = new Point();
        mapView.getProjection().toPixels(p, screenPts);

        //---add the marker---
        Bitmap bmp = BitmapFactory.decodeResource(
            getResources(), R.drawable.pin);            
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);         
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    {   
        //---when user lifts his finger---
        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;
            }
            else                
                return false;
    }
} 


  public boolean onKeyDown(int keyCode, KeyEvent event) 
    {
        MapController mc = mapView.getController(); 
        switch (keyCode) 
        {
            case KeyEvent.KEYCODE_3:
                mc.zoomIn();
                break;
            case KeyEvent.KEYCODE_1:
                mc.zoomOut();
                break;
        }
        return super.onKeyDown(keyCode, event);
    }    


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.map);
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
            0, new GeoUpdateHandler());

    Button btnSend = (Button) findViewById(R.id.btn_send);
    btnSend.setOnClickListener(new View.OnClickListener(){

        public void onClick(View v){

                Intent new_intent = new Intent("net.learn2develop.SendSMS");
                startActivity(new_intent);
        }
    });

    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);
    mapView.setSatellite(false);
    mapView.setStreetView(true);

    mc = mapView.getController();
    String latitude = Integer.toString(lat);
    String longitude = Integer.toString(lng); 
    String coordinates[] = {latitude, longitude};
    double lati = Double.parseDouble(coordinates[0]);
    double lngi = Double.parseDouble(coordinates[1]);
    System.out.println("lat" + lati + "lng" + lngi );
    p = new GeoPoint(
        (int) (lati * 1E6), 
        (int) (lngi * 1E6));

    mc.animateTo(p);
    mc.setZoom(17); 
    mapView.invalidate();

  //---Add a location marker---
    MapOverlay mapOverlay = new MapOverlay();
    List<Overlay> listOfOverlays = mapView.getOverlays();
    listOfOverlays.clear();
    listOfOverlays.add(mapOverlay);        

    mapView.invalidate();


}


@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}
public class GeoUpdateHandler implements LocationListener {

    @Override
    public void onLocationChanged(Location location) {
        lat = (int) (location.getLatitude() * 1E6);
        lng = (int) (location.getLongitude() * 1E6);
        System.out.println("lat shld b smth " + lat + "lng smth " +lng);
        //GeoPoint point = new GeoPoint(lat, lng);
        //mc.animateTo(point); //   mapController.setCenter(point);
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

}

【问题讨论】:

  • 您好 user596379,我可以获取项目源代码吗?我正在尝试为我的论文创建一个原型。你会分享吗?非常感谢;)

标签: android gps


【解决方案1】:

如果要显示用户的当前位置,最好使用 MyLocationOverlay。您还可以对其进行子类化并覆盖 onLocationChanged,以插入自定义代码。

通过调用 enableMyLocation onResume() 和 disableMyLocation onPause() 来启用它。

【讨论】:

    【解决方案2】:

    获取卫星 GPS 定位需要 2 到 15 分钟。您应该将渲染点的代码移至onLocationChanged()

    【讨论】:

    • 你的意思是我要移动这段代码吗? //---添加位置标记--- MapOverlay mapOverlay = new MapOverlay(); List listOfOverlays = mapView.getOverlays(); listOfOverlays.clear(); listOfOverlays.add(mapOverlay);
    • 不要从“String latitude = Integer.toString(lat);”中移动所有内容继续 onLocationChanged()
    • 我已经移动了代码,但我的应用程序现在崩溃了。我得到空指针作为错误。是不是因为我需要在真机而不是模拟器上进行测试?
    • 您从未在问题中提及模拟器。如果您使用的是模拟器,则有一个 ddms 设置,您可以在其中输入 lat、lon 或 kml。其次,始终检查在 onLocationChanged() 中获得的位置是否为空
    • 是的。我已经输入了纬度和经度。我做了一个 S.O.P hre double lati = Double.parseDouble(coordinates[0]);双 lngi = Double.parseDouble(坐标[1]); System.out.println("lat" + lati + "lng" + lngi );.但它没有动画到那个地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多