9

10 秒ごとに位置情報を更新するためにLocationManagerを登録しました

mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10 * 1000, 50, this);

しかし、onLocationChangedコールバックは 10 秒ごとに 2 時間以上前の場所を返します。そして、そのタイムスタンプは決して変わることはありません。

問題は:

2 時間前、私は完全に別の場所 () にいて、wifi でデバイスを使用していました。現在、私はアプリケーションが現在の場所をhomeとして表示する別の wifi 上の別の場所 ( office ) にいます。昨日、私の現在の場所としてオフィスを表示していた自宅でも同じことが起こりました。アプリを閉じ、FourSquareアプリを開き、アプリを再度開くと、機能するようになりました (正しい場所が表示され始めました)。

完全なコード:

public class LocationService extends Service implements LocationListener {

    public static double curLat = 0.0;
    public static double curLng = 0.0;
    private LocationManager mgr;
    private String best;
    private Location location;

    @Override
    public IBinder onBind(Intent arg0) {

        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        best = LocationManager.NETWORK_PROVIDER;
        location = mgr.getLastKnownLocation(best);
        if (location != null) {

            dumpLocation(location);
            mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    10 * 1000, 50, this);
        }
        return START_NOT_STICKY;
        }
    }

    private void dumpLocation(Location l) {

        SimpleDateFormat s = new SimpleDateFormat("dd/MM/yyyy:hh:mm:ss",
                Locale.ENGLISH);
        String format = s.format(l.getTime());
        //The above time is always 28/03/2013:09:26:41 which is more than 2 hrs old
        curLat = l.getLatitude();
        curLng = l.getLongitude();
    }

    @Override
    public void onLocationChanged(Location location) {

        dumpLocation(location);
    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

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

    }
}

この方法でアクティビティを開始する:

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(this, LocationService.class);
pi = PendingIntent.getService(this, 0, i,
        PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
        SystemClock.elapsedRealtime(), 10000, pi);

マニフェストの権限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

Maps、Navigator、Foursquare などの他の場所ベースのアプリを開くことで、正しい場所を取得できるようになりました。

ありがとうございました

4

3 に答える 3

4

この行のために古い場所を取得しています

  location = mgr.getLastKnownLocation(best);

GPS が有効になっていない場合は、古い場所が表示されるためです。だからこのコードを削除してください それはチャンピオンのように動作します このライブラリを参照することもできます

https://github.com/nagendraksrivastava/Android-Location-Tracking-Library

あなたのコメントに基づいて、私は答えを編集しました。わかりました行ごとに説明させて location = mgr.getLastKnownLocation(best);ください。最後に知っている場所のオブジェクトが表示されます

mgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                10 * 1000, 50, this);

ただし、GPS プロバイダーが無効になっている場合、新しい場所は取得されないため、古い場所のみが取得されます。だから、あなたはそれを次のように変更することができます

if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
                   {
                    locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER,new NagendraSingleLocationListener(),null);
                   }
                   else
                   {
                       locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,new NagendraSingleLocationListener(),null);
                   }
于 2013-03-28T06:36:16.260 に答える
0

保留中のインテントをすぐにキャンセルしたため、キャンセルする前に requestLocationUpdate の更新が開始されなかったと思います。キャンセルする前に 2 秒間寝ないでください。

于 2013-03-28T06:47:12.930 に答える