Карта расположения возвращается ноль для Android - PullRequest
0 голосов
/ 22 декабря 2011

Мой getLastKnownLocation имеет значение "ноль". Я могу получить местоположения, которые я вставил, чтобы показать, однако получить местоположение пользователей пытается. Из документации, здесь, и 4 05 уроков я думал, что все делал правильно, но ...... я не так. Я просто не могу понять, почему.

Если бы у кого-то была секунда, чтобы просмотреть это, было бы здорово.

package com.kita.Maps;

import java.util.ArrayList;
import java.util.List;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
import com.google.android.maps.MyLocationOverlay;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.MailTo;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;

public class MapsActivity extends MapActivity  implements LocationListener{
/** Called when the activity is first created. */

MapView map;
private MyLocationOverlay me = null;
Drawable d;
List<Overlay> overlayList;
LocationManager lm;
String towers;
int lat;
int longi;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    map = (MapView) findViewById(R.id.myMain);
    map.setBuiltInZoomControls(true);

    Touchy t = new Touchy();
    overlayList = map.getOverlays();
    overlayList.add(t);

    map.getController().setCenter(
            getPoint(40.76793169992044, -73.98180484771729));
    map.getController().setZoom(17);
    map.setBuiltInZoomControls(true);

    Drawable marker = getResources().getDrawable(R.drawable.pin_yellow);

    marker.setBounds(0, 0, marker.getIntrinsicWidth(),
            marker.getIntrinsicHeight());

    map.getOverlays().add(new SitesOverlay(marker));

    me = new MyLocationOverlay(this, map);
    map.getOverlays().add(me);

    d = getResources().getDrawable(R.drawable.pin_blue);

    //  Geo Location of phone
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria crit = new Criteria();
    towers = lm.getBestProvider(crit, false);
    Location location = lm.getLastKnownLocation(towers);

    if(location != null){
        lat = (int) (location.getLatitude()*1E6);
        longi = (int) (location.getLongitude()*1E6);
        GeoPoint ourLocation = new GeoPoint(lat, longi);
        OverlayItem overlayItem = new OverlayItem(ourLocation, "Quit hitting your self","");
        CustomPinpoint custom = new CustomPinpoint(d, MapsActivity.this);
        custom.insertPinpoint(overlayItem);
        overlayList.add(custom);
    }
    else{
        Toast.makeText(MapsActivity.this, "Couldn't get provider", Toast.LENGTH_SHORT).show();
    }


}

@Override
public void onResume() {
    super.onResume();
    me.enableCompass();
    lm.requestLocationUpdates(towers, 500, 1, this);
}

@Override
public void onPause() {
    super.onPause();
    me.disableCompass();
    lm.removeUpdates(this);
}

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

class Touchy extends Overlay {
    public boolean onTouchEvent(MotionEvent e, MapView m) {

        return false;
    }
}

private GeoPoint getPoint(double lat, double lon) {
    return (new GeoPoint((int) (lat * 1000000.0), (int) (lon * 1000000.0)));
}

private class SitesOverlay extends ItemizedOverlay<OverlayItem> {
    private List<OverlayItem> items = new ArrayList<OverlayItem>();

    public SitesOverlay(Drawable marker) {
        super(marker);

        boundCenterBottom(marker);

        items.add(new OverlayItem(getPoint(40.748963847316034,
                -73.96807193756104), "UN", "United Nations"));
        items.add(new OverlayItem(getPoint(40.76866299974387,
                -73.98268461227417), "Lincoln Center",
                "Home of Jazz at Lincoln Center"));
        items.add(new OverlayItem(getPoint(40.765136435316755,
                -73.97989511489868), "Carnegie Hall",
                "Where you go with practice, practice, practice"));
        items.add(new OverlayItem(getPoint(40.70686417491799,
                -74.01572942733765), "The Downtown Club",
                "Original home of the Heisman Trophy"));

        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return (items.get(i));
    }

    @Override
    protected boolean onTap(int i) {
        Toast.makeText(MapsActivity.this, items.get(i).getSnippet(),
                Toast.LENGTH_SHORT).show();

        return (true);
    }

    @Override
    public int size() {
        return (items.size());
    }
}



public void onLocationChanged(Location l) {
    // TODO Auto-generated method stub

    lat = (int) (l.getLatitude() *1E6);
    longi = (int) (l.getLongitude()*1E6);
    GeoPoint ourLocation = new GeoPoint(lat, longi);
    OverlayItem overlayItem = new OverlayItem(ourLocation, "Quit hitting your self","");
    CustomPinpoint custom = new CustomPinpoint(d, MapsActivity.this);
    custom.insertPinpoint(overlayItem);
    overlayList.add(custom);
}

public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

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

}
}

Вот мой класс указателя:

package com.kita.Maps;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.drawable.Drawable;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class CustomPinpoint extends ItemizedOverlay<OverlayItem>{

private ArrayList<OverlayItem> pinpoints = new ArrayList<OverlayItem>();
private Context c;


public CustomPinpoint(Drawable defaultMarker) {
    super(boundCenter(defaultMarker));
    // TODO Auto-generated constructor stub
}

public CustomPinpoint(Drawable m, Context context) {        
    // TODO Auto-generated constructor stub
    this(m);
    c = context;
}

@Override
protected OverlayItem createItem(int i) {
    // TODO Auto-generated method stub
    return pinpoints.get(i);
}

@Override
public int size() {
    // TODO Auto-generated method stub
    return pinpoints.size();
}

public void insertPinpoint(OverlayItem item){
    pinpoints.add(item);
    this.populate();
}

}

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

getLastKnownLocation дает нули, много, это просто природа зверя.

Используйте LocationListener и подождите, если хотите закрепить твердую позицию. getLastKnownLocation действительно хорош только для инициализации логики на основе местоположения, передаваемой с помощью LocationListener.

1 голос
/ 22 декабря 2011

В общем, что происходит, если вы запрашиваете местоположение для детектора (например, GPS), и оно никогда не получало местоположение с момента последней загрузки, оно вернет ноль.Вот почему обычно лучше сначала запросить обновления, что приведет к активному поиску устройства.

Один из способов - найти местоположение ДО того, как оно вам понадобится, а затем использовать getLastKnownLocation, когда оно вам действительно нужно.

При использовании getLastKnownLocation всегда лучше: а) приложить все усилия, чтобы убедиться, что используемое вами устройство отслеживания местоположения уже обнаружило местоположение в качестве некоторой точки во время этой загрузки, и б) вы проверяете наличие нулей на всякий случай.

В качестве примечания я бы порекомендовал проверять точность при получении новых местоположений.Очень часто первое обнаруженное местоположение не настолько точно, как могло бы быть, в то же время, если вы ищете период времени, найденное ПОСЛЕДНЕЕ местоположение может быть не таким точным, как какое-то другое местоположение, найденное в течение цикла.Ключ в том, чтобы использовать GPS как можно меньше и как можно лучше контролировать его, и дважды проверить свои результаты.

1 голос
/ 22 декабря 2011

Вместо getLastKnownLocation попробуйте requestLocationUpdates. Вы можете использовать LocationListener для прослушивания обновлений местоположения. Дополнительная информация: https://developer.android.com/reference/android/location/LocationListener.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...