android locationListener не работает?

У меня проблемы с использованием loactionListener в eclipse для Android. Я уже какое-то время гуглю и не понимаю, почему это не должно работать. Единственное, о чем я могу думать, это то, что, возможно, это потому, что в моем тестовом устройстве нет сим-карты. (интернет предоставляется через Wi-Fi).

Я использовал это в качестве справки и, тем не менее, ничего такого.

Может ли кто-нибудь помочь мне с этой проблемой.

вот соответствующие части моей деятельности:

public class MainMenu extends Activity implements LocationListener{
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

            setContentView(R.layout.main_menu);
theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
            theMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);

            locMan = (LocationManager)getSystemService(LOCATION_SERVICE);
}
@Override
        public void onLocationChanged(Location location) {
            final Double lat = location.getLatitude();
            final Double lng = location.getLongitude();
            LatLng lastLatLng = new LatLng(lat, lng);
            String title = getString(new StringLang().textSet(userLang,"marker_title"));
            String snippit = getString(new StringLang().textSet(userLang,"marker_snip"));
            if(userMarker!=null) userMarker.remove();
            userMarker = theMap.addMarker(new MarkerOptions()
            .position(lastLatLng)
            .title(title)
            .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
            .snippet(snippit)); 
            reverseGeoCode(lat, lng);
        }
}

Я использовал другой метод для отображения своего местоположения на карте, который работал хорошо, но никогда не обновлялся. Он всегда показывал мое местоположение в последнем месте, где я использовал GPS, что, как оказалось, было в 60 милях по стране. Я вижу, что это работает, но есть ли лучший способ сделать это.

Старый метод:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

            setContentView(R.layout.main_menu);
if(findViewById(R.id.the_map) != null){
                //map has loaded continue
                theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
                theMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                android.location.Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                LatLng lastLatLng ;
                if(lastLoc == null){
                    /* Use the LocationManager class to obtain GPS locations */
                    double latitude = 0;
                    double longitude = 0;
                    lastLatLng = new LatLng(latitude, longitude);
                    lat = latitude;
                    lng = longitude;
                    String title = getString(new StringLang().textSet(userLang,"marker_title"));
                    String snippit = getString(new StringLang().textSet(userLang,"marker_snip"));
                    if(userMarker!=null) userMarker.remove();
                    userMarker = theMap.addMarker(new MarkerOptions()
                    .position(lastLatLng)
                    .title(title)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_loc_icon))
                    .snippet(snippit));

                    CameraPosition cameraPosition = new CameraPosition.Builder()
                     .target(lastLatLng)      // Sets the center of the map to user position
                        .zoom(0)                   // Sets the zoom
                        .bearing(90)                // Sets the orientation of the camera to east
                        .tilt(20)                   // Sets the tilt of the camera to 30 degrees
                        .build();                   // Creates a CameraPosition from the builder
                    currentLoc = lastLatLng;
                    theMap.animateCamera (CameraUpdateFactory.newCameraPosition(cameraPosition), 3000, null);
                    final TextView geoTagText = (TextView)findViewById(R.id.text_geoTag);
                    geoTagText.setText("We cannot find your current location, please check your settings.");
                }else{
                    double latitude = lastLoc.getLatitude();
                    double longitude = lastLoc.getLongitude();
                    lastLatLng = new LatLng(latitude, longitude);
                    lat = latitude;
                    lng = longitude;
                    animateMap(lastLatLng);

                }
            }else{
                theMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.the_map)).getMap();
                theMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
                locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                android.location.Location lastLoc = locMan.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                LatLng lastLatLng;
                double latitude = lastLoc.getLatitude();
                double longitude = lastLoc.getLongitude();
                lastLatLng = new LatLng(latitude, longitude);
                lat = latitude;
                lng = longitude;
                animateMap(lastLatLng);
                //no map to load
            }
}

    @Override
public void onLocationChanged(Location location) {
    final Double lat = location.getLatitude();
    final Double lng = location.getLongitude();
    LatLng lastLatLng = new LatLng(lat, lng);
    String title = getString(new StringLang().textSet(userLang,"marker_title"));
    String snippit = getString(new StringLang().textSet(userLang,"marker_snip"));
    if(userMarker!=null) userMarker.remove();
    userMarker = theMap.addMarker(new MarkerOptions()
    .position(lastLatLng)
    .title(title)
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher))
    .snippet(snippit));      
}

также было бы полезно добавить, что есть кнопка для перемещения пользователя вручную, если он этого хочет.

reLocBtn.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View arg0) {
                if(menuActive == true){
                    playSound();
                    LocationManager loc = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
                    android.location.Location gpsLoc = (Location) loc.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    double lat = gpsLoc.getLatitude();
                    double lng = gpsLoc.getLongitude();
                    LatLng lastLatLng = new LatLng(lat, lng);
                    animateMap(lastLatLng);
                }
            }
        });

Я не уверен, почему ни один из методов не обновляется, но второй метод работает лучше при первой загрузке.


person Paul Ledger    schedule 23.07.2013    source источник
comment
Вы должны перейти на новый API определения местоположения, представленный Google ранее в этом году. См. developer.android.com/training/location/index.html.   -  person Pavel Dudka    schedule 23.07.2013
comment
Эта ссылка очень полезна, но вам нужно проверить устройство пользователя на наличие сервисов Google Play. Моя деятельность очень длинная, и много чего происходит, я действительно не хочу добавлять это, мне не нужно.   -  person Paul Ledger    schedule 23.07.2013


Ответы (2)


Похоже, вы не используете requestLocationUpdates() в любом месте. В этом методе вы передаете объект LocationListener, который затем вызывается для обновления местоположения.

то есть в вашем случае:

locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
person trevor-e    schedule 23.07.2013
comment
Куда бы я это поместил, я предполагаю, что это входит в метод onCreate - person Paul Ledger; 23.07.2013
comment
Поместите это прямо под locMan = (LocationManager)getSystemService(LOCATION_SERVICE); - person trevor-e; 23.07.2013
comment
Да, я просто загружаю карту в центре Атлантического океана (без изменений), без маркера. Это потому, что телефон в активном состоянии. Нужна ли мне зарегистрированная сим-карта с пропускной способностью данных, чтобы проверить это должным образом. - person Paul Ledger; 23.07.2013
comment
@PaulLedger Вам может понадобиться работающая сим-карта, чтобы использовать NETWORK_PROVIDER, но я думаю, что GPS_PROVIDER должен работать с любым GPS-приемником, который есть в телефоне. Ваш телефон поддерживает GPS и включен ли он? - person trevor-e; 23.07.2013
comment
Мой GPS активен, я играюсь с картами Google, и он работает там через Wi-Fi. Не уверен, что с ним происходит. - person Paul Ledger; 24.07.2013
comment
Вставил контрактную симку в телефон и все работает. Вам нужна активная сим-карта как для СЕТИ (очевидно), так и для GPS. Я не уверен, как карты Google обходят это, но решил проблему. - person Paul Ledger; 24.07.2013
comment
@PaulLedger Интересно, что он вам нужен только для использования GPS. Возможно, Google Maps сначала использует что-то вроде getLastKnownLocation(), а затем использует requestLocationUpdates(), чтобы позже обновить его. - person trevor-e; 24.07.2013
comment
@ trever-e, принял это к сведению о том, что может делать Google. Я использовал аналогичный метод в своем приложении, и теперь он работает с симом или без него. Не уверен, почему пользователь хочет, чтобы приложение работало без сима, но если они это сделают, оно все равно будет работать. - person Paul Ledger; 04.08.2013

Если вы используете Google Maps API v2, вы можете сделать это, например:

private GoogleMap.OnMyLocationChangeListener myLocationChangeListener = new GoogleMap.OnMyLocationChangeListener() {
    @Override
    public void onMyLocationChange(Location location) {
        LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());
        mMarker = mMap.addMarker(new MarkerOptions().position(loc));
        if(mMap != null){
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f));
        }
    }
};

а затем установите прослушиватель для карты:

mMap.setOnMyLocationChangeListener(myLocationChangeListener);

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

Нет необходимости в LocationService или LocationManager.

person yedidyak    schedule 29.05.2014