Android: échec de l'application si la position GPS n'est pas activée

- - Dernière réponse : Twinuts
Messages postés
5340
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 septembre 2019
- 19 août 2019 à 12:08
Bonjour,

J'ai un soucis avec l'utilisation de la géolocalisation dans mon application. Voici mon problème: lorsque j'active ma position GPS sur mon téléphone et je lance l'application, tout marche très bien. Mais, si ma position n'est pas activée, l'application échoue.
Ma question est comment mettre une condition dans le code suivant pour demander à l'utilisateur d'activer sa position au cas où ce n'est pas activée afin d'éviter l'échec de l'application ?Voici mon code :
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        // I suppressed the missing-permission warning because this wouldn't be executed in my case without location services being enabled
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            Toast.makeText(MainActivity.this, "Veuillez vérifier voir si votre Position est activée pour la géolocalisation", Toast.LENGTH_LONG).show();
            return;
        }
        else{
			android.location.Location lastKnownLocation = locationManager.getLastKnownLocation(locationProvider);
            double userLat = lastKnownLocation.getLatitude();
            double userLong = lastKnownLocation.getLongitude();

            try{
                Geocoder geo = new Geocoder(this.getApplicationContext(),Locale.getDefault());
                List<Address>adresses = geo.getFromLocation(userLat,userLong,1);
                if(adresses.isEmpty()){
                    Toast.makeText(MainActivity.this, "La localisation n'est pas disponible"+userLong, Toast.LENGTH_LONG).show();
                }
                else{
                    if(adresses.size() > 0){
                        String lieu = "Votre adresse : "+adresses.get(0).getFeatureName()+", "+adresses.get(0).getSubAdminArea()+", "+adresses.get(0).getAdminArea()+", "+adresses.get(0).getCountryName();
                        feature_1.setText(lieu);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            String lat = String.valueOf(userLat);
            String lon = String.valueOf(userLong);
        }


Merci d'avance
Afficher la suite 

1 réponse

Messages postés
5340
Date d'inscription
dimanche 4 mai 2003
Statut
Modérateur
Dernière intervention
3 septembre 2019
82
0
Merci
Salut,

Je ne sais pas si c'est toujours d'actualité mais ci-dessous un exemple qui faite:
- Détection du statut du GPS avec un receiver
- Activation du GPS si off.

app/build.gradle (support de la syntaxe java8):

...
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
...
}
...


AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="plop.myapplication">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/tvGPS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@null"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/btGPS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Click pour activer le GPS"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>


MainActivity.java:
package plop.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.os.Build;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.AppCompatTextView;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    private AppCompatButton mBtGPS;
    private AppCompatTextView mTvGPS;


    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction() != null && intent.getAction().matches(LocationManager.PROVIDERS_CHANGED_ACTION)) {
                /* normalement tu ne passeras jamais ici etant donné que le test est fait
                   dans le onResume et que pour modifier l'état du GPS il faut passer par activity_onPause et activity_onResume
                 */
                updateUI("Le GPS est activé depuis le receiver");
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtGPS = findViewById(R.id.btGPS);
        mTvGPS = findViewById(R.id.tvGPS);

        /* On effectue l'activation sur click du bouton */
        mBtGPS.setOnClickListener((v) ->
                startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS))
        );
    }


    @Override
    public void onResume() {
        super.onResume();
        /* Enregistrement du receiver pour connaitre l'etat du GPS au runtime */
        registerReceiver(mReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));
        updateUI("Le GPS est activé depuis le resume");
    }


    public void onPause() {
        super.onPause();
        unregisterReceiver(mReceiver);
    }

    private void updateUI(String text) {
        if(!isLocationEnabled(this)) {
            mBtGPS.setVisibility(View.VISIBLE);
            mTvGPS.setVisibility(View.GONE);
        } else {
            mBtGPS.setVisibility(View.GONE);
            mTvGPS.setVisibility(View.VISIBLE);
            mTvGPS.setText(text);
        }
    }

    /* Test de la disponibilité du GPS */
    public static Boolean isLocationEnabled(Context context)  {
        LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            return lm.isLocationEnabled();
        } else {
            return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        }
    }
}


Commenter la réponse de Twinuts