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.

16
demandé sur Vishwajit Palankar 2015-05-12 15:34:51

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