2016-08-30 59 views
3

我有以下LocationService.java服務類。獲取不正確的當前GPS位置在FusedLocationProviderApi

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提供商這是最準確的供應商,但它需要一個開放的空氣,這意味着沒有室內,第二個是網絡服務提供者,其通過網絡得到你的位置,只要你有互聯網連接,並在精度這對你來說不是問題,這是合適的。 被動提供商意味着你想要得到的位置沒有要求,如果另一個應用程序已被檢索的位置,這樣你就會有一個位置 選擇一個作爲你看到它適合,並用它 –

+0

,你可以控制更新的時間和距離頻率通過這東西 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,時間(毫秒),距離(米),locationListener); –