La permission D'accéder à un emplacement grossier donne une précision de tour de téléphonie cellulaire sur Android
j'ai fais quelques tests avec l' requestLocationUpdates()
de la fonction FusedLocationApi
. Je suis l'aide de la PRIORITY_BALANCED_POWER_ACCURACY. Une précision d'îlot urbain, c'est très bien pour moi.
quand je demande le ACCESS_FINE_LOCATION permission, je reçois environ 100 m de précision ce qui est génial avec GPS
désactivé. Comme je n'ai pas besoin D'une précision GPS mais d'une précision de bloc de ville, je voudrais demander seulement le ACCESS_COARSE_LOCATION
permission. Cependant, quand je demande de l' ACCESS_COARSE_LOCATION
permission, je obtenez une précision de 2 km. Il semble que l'appareil n'utilise plus le Wifi
permission et précision de la tour cellulaire.
Comment puis-je avoir une meilleure précision avec l' ACCESS_COARSE_LOCATION permission?
Remarque:GPS
est désactivé sur mon appareil d'essai.
2 réponses
C'est un problème intéressant, et j'avais l'impression qu'utiliser ACCESS_COARSE_LOCATION
utiliserait le WiFi, puisque c'est ce que dit la documentation.
la documentation pour ACCESS_COARSE_LOCATION
états:
permet à une application d'accéder à un emplacement approximatif dérivé du réseau les sources de localisation telles que les tours de téléphonie cellulaire et le Wi-Fi.
alors, je l'ai testé, et les résultats sont surprenants.
Voici le code que j'ai utilisé pour test:
public class MainActivity extends Activity implements
GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buildGoogleApiClient();
mGoogleApiClient.connect();
}
@Override
protected void onPause(){
super.onPause();
if (mGoogleApiClient != null) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}
}
protected synchronized void buildGoogleApiClient() {
Toast.makeText(this,"buildGoogleApiClient",Toast.LENGTH_SHORT).show();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
@Override
public void onConnected(Bundle bundle) {
Toast.makeText(this,"onConnected",Toast.LENGTH_SHORT).show();
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10);
mLocationRequest.setFastestInterval(10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
//mLocationRequest.setPriority(LocationRequest.PRIORITY_LOW_POWER);
//mLocationRequest.setSmallestDisplacement(0.1F);
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
@Override
public void onConnectionSuspended(int i) {
Toast.makeText(this,"onConnectionSuspended",Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Toast.makeText(this,"onConnectionFailed",Toast.LENGTH_SHORT).show();
}
@Override
public void onLocationChanged(Location location) {
Log.d("locationtesting", "accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude());
Toast.makeText(this,"Location Changed",Toast.LENGTH_SHORT).show();
}
}
AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
construire.gradle:
compile 'com.google.android.gms:play-services:7.3.0'
Le premier test que j'ai fait était avec