2016-08-30 18 views
3

私は以下のサービスクラスを持っています:LocationService.javaFusedLocationProviderApiの現在のGPS位置が正しくない

public class LocationService extends Service 
     implements LocationListener, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 
    private static final long INTERVAL = 1000 * 60; 
    private static final long FASTEST_INTERVAL = 1000 * 5; 
    Location mLastLocation; 
    private GoogleApiClient mGoogleApiClient; 
    private LocationRequest mLocationRequest; 
    String lat, lon; 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mGoogleApiClient.connect(); 
     return START_STICKY; 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     mLocationRequest = LocationRequest.create(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setInterval(INTERVAL); 
     mLocationRequest.setFastestInterval(FASTEST_INTERVAL); 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 

     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
     if (mLastLocation != null) { 
      lat = String.valueOf(mLastLocation.getLatitude()); 
      lon = String.valueOf(mLastLocation.getLongitude()); 

      Util.WriteSharePrefrence(getApplicationContext(), "track_lat", "" + lat); 
      Util.WriteSharePrefrence(getApplicationContext(), "track_lng", "" + lon); 

     } 
    } 

    @Override 
    public void onCreate() { 
     int permissionCheck = ContextCompat.checkSelfPermission(LocationService.this, Manifest.permission.ACCESS_FINE_LOCATION); 

     if (permissionCheck == PackageManager.PERMISSION_GRANTED) { 
      //Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION.. 
      buildGoogleApiClient(); 
     } 
    } 


    @Override 
    public void onConnectionSuspended(int i) { 
    } 

    synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     if (location != null) { 
      Util.WriteSharePrefrence(getApplicationContext(), "track_lat", "" + location.getLatitude()); 
      Util.WriteSharePrefrence(getApplicationContext(), "track_lng", "" + location.getLongitude()); 
     } 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     buildGoogleApiClient(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 
} 

私がやっていることは、私が行っていることです。 1.最速の間隔を設定して、5秒ごとに場所を更新します。 2.一度利用可能な場所onLocationChanged()が行われます。 onLocationChanged()メソッドの中で私は現在の緯度と経度を共有設定に書いています。 3.このサービスは、現在の場所を取得するためにバックグラウンドで24時間実行されます。

私は以下のように私のマニフェストに両方の場所の条件を記載している:

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

私の問題は、次のとおりです。onLocationChanged()方法は、例えば、間違った緯度経度 を取っ

いくつかの回:インドにおけるユーザデバイスとそれは米国のアドレスを取る。デバイスのバージョンはXolo - 4.2.1.(India)

デバイス固有の問題ですか?私のコードで変更する必要があるものは何ですか? 位置情報サービスをより良くするにはどうすればよいですか?

+0

をしたい場合は、なぜあなたは、通常の場所プロバイダを使用していませんか? GPSやネットワークプロバイダのように –

+0

@Haidar GPSTracker.javaクラスを使用して現在の位置を取得しましたが、現在の位置の場所を頻繁に更新しないと感じました。 – himCream

答えて

0

使用するネットワークやGPSプロバイダやパッシブあなたが

public void Request_LocationUpdate(String type) 
{ 
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
    { 
     ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, 12); 
    } 
    else 
    { 
     LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); 

     switch (type) 
     { 
      case "Passive": 
       locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER,10000,10,locationListener); 
       break; 

      case "GPS": 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,10000,10,locationListener); 
       break; 

      case "Network": 
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,10000,10,locationListener); 
       break; 
     } 
    } 


} 
+0

問題を解決したPASSIVE_PROVIDERを追加して追加してもよろしいですか? – himCream

+0

この方法には3つのオプションがあります。最も正確なプロバイダーであるGPSプロバイダーですが、屋内でないことを意味するオープンエアーが必要で、第2のものはインターネット接続がある限り、ネットワークによってあなたの所在地を取得するネットワークプロバイダーです。これは適切なものではありません。 パッシブプロバイダとは、別のアプリが既にその場所を取得しているため、その場所を取得している場合は、その場所を取得したくないということを意味します。 –

+0

を使用して更新時刻と距離の頻度を制御できますこのものによって locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER、time(ms)、distance(meters)、locationListener); –

関連する問題