2

我一直在嘗試使用Fused Location Api in andriod獲取位置(緯度/經度)。當wifi和gps都打開時,我的代碼工作正常。如果我關閉GPS,那麼我沒有得到任何位置更新。

我正在使用BALANCED_POWER_ACCURACY作爲位置請求。 我在清單中添加了Access_FINE_Location權限,並在我的build.gradle文件中使用了播放服務版本9.2.1。
我正在測試真實設備(Samsung SM0G360H API 19和Samsung SM-G361 API 21)。兩者都給出了相同的結果。
任何人都可以告訴我Fused Location Api的工作原理嗎?
如何在gps關閉但網絡連接打開時獲取位置更新?
我的代碼:
如何使用網絡在android中使用Fused Location Provider獲取位置?

public class LocationUpdateusingFused extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener{ 



TextView txtOutputLat, txtOutputLon; 
Location mLastLocation; 
private GoogleApiClient mGoogleApiClient; 
private LocationRequest mLocationRequest; 
String lat, lon; 

Intent batteryStatus; 
@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.fleet_layout); 

    txtOutputLat = (TextView) findViewById(R.id.textView); 
    txtOutputLon = (TextView) findViewById(R.id.textView2); 


    buildGoogleApiClient(); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    mLocationRequest = LocationRequest.create(); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    mLocationRequest.setMaxWaitTime(5000); 
    mLocationRequest.setInterval(10000); // Update location every second 

    try { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 


     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
       mGoogleApiClient); 
    } 
    catch (SecurityException e) 
    { 
     Log.e("LocatonUpdate",e+" "); 
    } 
    if (mLastLocation != null) { 
     lat = String.valueOf(mLastLocation.getLatitude()); 
     lon = String.valueOf(mLastLocation.getLongitude()); 

    } 
    updateUI(); 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onLocationChanged(Location location) { 
    lat = String.valueOf(location.getLatitude()); 
    lon = String.valueOf(location.getLongitude()); 
    Log.e("LocationChanged",location.getSpeed()+" "+location.getAccuracy()+" "+location.getBearing()+" "+location.getProvider()+" "+location.getAltitude() 
    ); 

    updateUI(); 
} 

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

@Override 
protected void onStart() { 
    super.onStart(); 
    mGoogleApiClient.connect(); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    mGoogleApiClient.disconnect(); 
} 
void updateUI() { 
    txtOutputLat.setText(lat); 
    txtOutputLon.setText(lon); 
} 
synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 


} 

}

+0

您是否檢查位置設置? setInterval(10000)也是10秒。並不重要。 – masp

+0

感謝提到的位置設置,但我想獲得位置更新只使用網絡即位置服務將關閉。我能夠使用普通的LocationService來完成這項工作,但融合提供商不能使用位置服務。你能給我關於這方面的任何信息嗎? – Alvi

+0

您禁用了位置服務?爲什麼和哪些設置完全在您的21三星?如果您不希望應用程序使用gps,則可以更改權限並僅使用ACCESS_COARSE_LOCATION。您仍然可以使用PRIORITY_BALANCED_POWER_ACCURACY的融合提供者。首先,該算法檢查網絡提供商,然後如果可用,則使用gps。 – masp

回答

2

對不起,在試圖回答你的問題相當長的時延。我自己一直在與整個位置問題進行鬥爭,所以我會在「非常困難」之後爲您提供我注意和學習的東西。希望你仍然需要各種答案。

我不記得API級別19的設置是怎麼樣的,但總的來說,API lvl 15和所有位置設置(加上減去一些選項)已經設置爲符合FusedLocationProviderAPI邏輯。我的意思是,你有有位置設置在任何時候獲得任何類型的位置更新,因爲設置/切換控制的一般位置。希望這可以回答你的主要問題。

提供更多信息。正如masp在其中一個註釋中提到的那樣,您可以通過Fused Location API的權限和常量來控制提供者實際使用的內容。

對於權限,您必須在ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION之間選擇。所不同的是(I quote):

如果你同時使用NETWORK_PROVIDER和GPS_PROVIDER,那麼你就需要申請只允許ACCESS_FINE_LOCATION,因爲它包括兩個供應商的許可。 ACCESS_COARSE_LOCATION的權限只允許訪問NETWORK_PROVIDER。

然後我們有FusedLocationProviderAPI constants其中事情有點複雜。此外,從API拉特21及以上,我們有這樣的:

enter image description here

如果輸入模式,那麼您將獲得:

enter image description here

我不會去多進常量。他們已經在question的接受答案中進行了測試。我建議你有一個雄性。不過,我需要提及的是,無論您如何使用這些設置,設置中的模式優先。您可以在應用程序中詢問GPS,但是如果用戶在設置中說節省電池,那就是這樣。

的最後一件事我也許應該提到的是,如果你設置爲ACCESS_COARSE_LOCATION然後期待可怕的準確性許可(也顯示在我上面鏈接測試)。我的建議是使用ACCESS_FINE_LOCATION,然後使用熔合位置常量和間隔(setIntervalsetFastestInterval

希望這會有所幫助,即使時間較晚。

相關問題