Текущее местоположение не выбирается в Android

Сейчас я переезжаю с проектом, связанным с сервисом Google Map. Я хотел бы указать мое текущее местоположение на моей карте. Для этого у меня появилась идея использовать itemizedoverlay. Я получаю текущее местоположение с помощью Geopoint. Но когда я использую детализированное наложение в своем коде, местоположение не может быть выбрано, и я использую это в своем методе OnCreate. Если я перенесу это в метод OnLocationChanged, то GeoPoint (точка) не будет обнаружена детальным наложением и завершится ошибкой, а в текущем состоянии приложение будет раздавлено.

        MapView mapView;
    Location location;
    LocationManager locationmanager;
    LocationListener locationlistener; 

        public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

      mapView = (MapView) findViewById(R.id.mapView);
      mapView.setTraffic(true);
      mapView.setBuiltInZoomControls(true);

        //locationmanager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);  
   // locationlistener = new GPSLocationListener();
      //  locationmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER 0,0,locationlistener);                                                                                         

      GeoPoint point = new GeoPoint(
                (int) (location.getLatitude() * 1E6), 
                (int) (location.getLongitude() * 1E6));

            Toast.makeText(getBaseContext(), 
                "Latitude: " + location.getLatitude() + 
                " Longitude: " + location.getLongitude(), 
                Toast.LENGTH_SHORT).show();

      List<Overlay> mapOverlays = mapView.getOverlays();
      Drawable drawable = this.getResources().getDrawable(R.drawable.icon);


          HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,this);
          OverlayItem overlayitem = new OverlayItem(point,"","" );
          itemizedoverlay.addOverlay(overlayitem);
          mapOverlays.add(itemizedoverlay);

}

/*      private class GPSLocationListener implements LocationListener 
      {
        @Override
        public void onLocationChanged(Location location) {
          if (location != null) {
            GeoPoint point = new GeoPoint(
                (int) (location.getLatitude() * 1E6), 
                (int) (location.getLongitude() * 1E6));

            Toast.makeText(getBaseContext(), 
                "Latitude: " + location.getLatitude() + 
                " Longitude: " + location.getLongitude(), 
                Toast.LENGTH_SHORT).show();

            OverlayItem overlayitem = new OverlayItem(point,"","" );
              itemizedoverlay.addOverlay(overlayitem);
              mapOverlays.add(itemizedoverlay);

}
        } */


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

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

    }

    @Override
    public void onProviderDisabled(String provider) {

Toast.makeText(getBaseContext(),"GPS Disabled",Toast.LENGTH_SHORT).show();      

    }

    @Override
    public void onProviderEnabled(String provider) {

        Toast.makeText(getBaseContext(),"GPS Enabled",Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

Не могли бы вы предложить мне решение для этого ?? Заранее спасибо и извините, если я сделал какие-либо ошибки здесь.


person Tony    schedule 21.01.2013    source источник


Ответы (4)


Вы можете использовать com.google.android.maps.MyLocationOverlay, который автоматически покажет ваше местоположение на карте. Он даже обновит ваше местоположение во время путешествия.

Примечание. Вы показываете вызовы enableMyLocation и disableMyLocation для onResume и onPause соответственно для повышения производительности.

@Override
    protected void onResume() {
        super.onResume();
        if (locationOverlay != null)
            locationOverlay.enableMyLocation();
    }

    @Override
    protected void onPause() {
        if (locationOverlay != null)
            locationOverlay.disableMyLocation();
        super.onPause();
    }

ОТРЕДАКТИРОВАНО

MyLocationOverlay locationOverlay;

public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      mapView = (MapView) findViewById(R.id.mapView);
      mapView.setTraffic(true);
      mapView.setBuiltInZoomControls(true);
locationOverlay = new MyLocationOverlay(this, mapView);
List<Overlay> mapOverlays = mapView.getOverlays();
 mapOverlays.add(locationOverlay);
}

также добавьте методы onResume() и onPause().

person Vivek Khandelwal    schedule 21.01.2013
comment
Даже если я не получаю текущее местоположение на карте, это сработает, брат? - person Tony; 21.01.2013
comment
Местоположение GPS не всегда доступно, особенно в помещении. Поэтому, если у вас есть настроенный прослушиватель местоположения для поставщика GPS, и вы находитесь в помещении, вы можете не получать сигнал GPS. MyLocationOverlay находит, какой провайдер использовать, настраивает прослушиватель местоположения и дает вам местоположение. - person Vivek Khandelwal; 21.01.2013
comment
Если вы видите документацию enableMyLocation, там написано «Попытки включить MyLocation», регистрируясь для получения обновлений от LocationManager.GPS_PROVIDER и LocationManager.NETWORK_PROVIDER. Таким образом, он регистрирует обоих провайдеров, и вам не нужно беспокоиться о настройке прослушивателей и обновлении оверлея снова для обновления. - person Vivek Khandelwal; 21.01.2013
comment
Не могли бы вы опубликовать код для этого: com.google.android.maps.MyLocationOverlay. Вчера вперед я пытаюсь для этого, но до сих пор понятия не имею. Я нашел этот метод в другом месте. Но не знаю, как использовать это в моем коде. Я старался по максимуму. Извините, что я не очень опытен в этой области. - person Tony; 22.01.2013
comment
Привет Вивек, Спасибо за ваш добрый и ранний ответ; также у меня есть сомнения, что без получения местоположения (Geopoint) как мы можем указать его на карте? - person Tony; 22.01.2013
comment
MyLocationOverlay позаботится о том, чтобы узнать ваше местоположение от провайдера GPS и сетевого провайдера. Таким образом, нам не нужно ничего делать, кроме как добавить оверлей в представление карты. - person Vivek Khandelwal; 22.01.2013

Попробуйте с этим -

/**
* Setting Google Map to provided location 
*/
 private void setMaptoLocation(Location location) {
  mapView.setBuiltInZoomControls(true);
  mapView.setSatellite(true);
  int LAT = (int)(location.getLatitude() * 1E6) ;
  int LNG = (int)(location.getLongitude() * 1E6) ;
  GeoPoint point = new GeoPoint(LAT, LNG);
  mapController = mapView.getController();
  List<Overlay> mapOverlays = mapView.getOverlays();
  Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
  HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable,this);
  OverlayItem overlayitem = new OverlayItem(point,"","" );
  itemizedoverlay.addOverlay(overlayitem);
  mapOverlays.add(itemizedoverlay);
  mapController.setZoom(ZOOM_LEVEL - ZOOM_LEVEL / 2); // Set zoom level per requierment
  mapController.animateTo(point);

 }
person Jambaaz    schedule 21.01.2013
comment
Это также не работает для меня, брат. Показывает некоторую ошибку с помощью drawable. - person Tony; 22.01.2013
comment
О... Я думал, вы бы добавили возможность рисования... в любом случае... Я отредактировал свой пост... пожалуйста... используйте сейчас... все еще получаю сообщение об ошибке... пожалуйста, опубликуйте logcat - person Jambaaz; 22.01.2013
comment
Здесь также показано местоположение где-то в другом месте. Кажется, ближе к Гвинейскому заливу в Южной Африке. Я думаю, что это может быть связано с проблемой геоточки. Но это работает несколько. Есть ли у вас какие-либо идеи? - person Tony; 22.01.2013
comment
Приятно знать, что это сработало. Насчет местоположения не уверен, как вы передаете местоположение этим функциям. Он должен быть установлен: setMaptoLocation((int)(location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6)); - person Jambaaz; 22.01.2013
comment
какую бы широту / долготу вы ни получали, вы также можете проверить ее на карте Google в Интернете. - person Jambaaz; 22.01.2013
comment
при предоставлении: setMaptoLocation((int)(location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6)); Приложение автоматически отключается, говоря, что активность карты неожиданно остановилась. Мне только что дали setMaptoLocation(int Lat, int Lon); - person Tony; 22.01.2013
comment
Я знаю, что стою у двери и всего в шаге от успеха. Но для этого мне нужна ваша помощь. Если вы не возражаете, не могли бы вы отредактировать свой код с этим предложением? - person Tony; 22.01.2013
comment
Это то, что я имел в виду, при этом приложение автоматически сбрасывало сообщение об ошибке, активность карты неожиданно остановилась. - person Tony; 22.01.2013
comment
давайте продолжим это обсуждение в чате - person Jambaaz; 22.01.2013
comment
Обновлено в чате... пожалуйста, проверьте !! - person Jambaaz; 22.01.2013

location не инициализируется вами в onCreate(), поэтому я предполагаю, что оно равно нулю. И еще одна вещь, если у вас есть широта и долгота, детализированные данные обязательно покажут местоположение на карте. Проверьте необходимые разрешения Access_Course_location и Access_fine_location в манифесте.

person Community    schedule 21.01.2013
comment
Я уже определил это в манифестном брате. Также было предоставлено: - person Tony; 21.01.2013
comment
Ваше шоу тостов длинное и длинное? вы не где не регистрируете Location Manager тогда как вы можете читать местоположение - person ; 21.01.2013

Я думаю, вы должны пойти с Google Maps Android API v2

Для получения дополнительной информации см. Google Maps Android API v2.

пожалуйста, проверьте ссылку образца кода из приведенной выше ссылки. пример кода

person Rahul Patel    schedule 21.01.2013
comment
Спасибо за ваш добрый ответ. Но ссылка не объясняет, чего я действительно хочу. Это касается только получения карты. Я хотел бы указать текущее местоположение на моей карте с помощью значка. - person Tony; 21.01.2013
comment
в этой ссылке есть ссылка на пример кода. Пожалуйста, проверьте мой обновленный код. - person Rahul Patel; 21.01.2013
comment
@Рахул почему? В чем необходимость? - person ; 21.01.2013
comment
@Кодер не нужен. но используя API v2, мы можем сделать это легко. - person Rahul Patel; 21.01.2013
comment
@RahulPatel, я думаю, что ваш ответ не имеет отношения к делу, и за него следует проголосовать против - person ; 21.01.2013