Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ANDROID] Localisation

    19 octobre 2015 à 22:36:08

    Bonjour à tous,

    Je suis en train de faire une petite application qui me permet de partager ma localisation avec mes amis, seulement je bloque à la toute premiére étape qui est la récupération de la position d"un utilisateur.

    Cela peut paraître bizarre mais aucun des forums que j'ai visités ne me fournissent une solution qui marche...

    Je suis donc aller voir les solutions fournies par Google mais rien à faire, je n'y arrive pas.

    Dans un premier temps ce serai cool de pouvoir afficher les coordonnées où l'utilisateur se trouve dans un Toast par exemple.

    Si quelqu'un a deja réussi à faire cela je suis ouvert à toute proposition :) !

    -
    Edité par AntoineDuval1 19 octobre 2015 à 22:41:17

    • Partager sur Facebook
    • Partager sur Twitter
    Je ne savais pas que c’était impossible, alors je l'ai fais ;)
      19 octobre 2015 à 22:58:10

      utilise implements LocationListener

       @Override
          public void onLocationChanged(Location location) {
                  double latitude = location.getLatitude();
                  double longitude =  location.getLongitude();


      PS : oublie pas les permissions qui vont avec.

      • Partager sur Facebook
      • Partager sur Twitter
      The people who are crazy enough to think they can change the world, are the ones who do.
        19 octobre 2015 à 23:34:19

        Salut,

        La partie traitant de la géolocalisation sur cet article de mon blog est certainement une bonne base.

        Attention toutefois à prendre en compte la gestion des permissions au runtime pour Android M.

        • Partager sur Facebook
        • Partager sur Twitter
          19 octobre 2015 à 23:55:31

          Merci pour ta réponse, je suis passé sur ton blog ( qui est très bien fait au passage), mais mon problème persiste.

          Lorsque j'utilise des méthodes de mon locationManager AndroidStudio m'oblige à mettre des check comme ci dessous, je ne comprends pas du tout ce qu'il faut y mettre et pourquoi ils sont là...

          public class MainActivity extends Activity implements LocationListener {
          
              private LocationManager locationManager;
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.activity_main);
              }
          
              @Override
              protected void onResume() {
                  super.onResume();
          
                  locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
          
                  if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
          
                      abonnementGPS();
                  }
          
              }
          
              @Override
              protected void onPause() {
                  super.onPause();
          
                  desabonnementGPS();
              }
          
          
              public void abonnementGPS() {
          
          
                  if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                      // TODO: Consider calling
                      //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
                      // here to request the missing permissions, and then overriding
                      //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                      //                                          int[] grantResults)
                      // to handle the case where the user grants the permission. See the documentation
                      // for Activity#requestPermissions for more details.
                      return;
                  }
                  locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, this);
          
              }
          
          
              private void desabonnementGPS() {
          
                  if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                      // TODO: Consider calling
                      //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
                      // here to request the missing permissions, and then overriding
                      //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                      //                                          int[] grantResults)
                      // to handle the case where the user grants the permission. See the documentation
                      // for Activity#requestPermissions for more details.
                      return;
                  }
                  locationManager.removeUpdates(this);
          
              }
          
              @Override
              public void onLocationChanged(Location location) {
          
                  final StringBuilder msg = new StringBuilder("lat:");
                  msg.append(location.getLatitude());
                  msg.append(";lng: ");
                  msg.append(location.getLongitude());
          
                  Toast.makeText(this,msg.toString(),Toast.LENGTH_SHORT).show();
          
              }
          
              @Override
              public void onStatusChanged(String provider, int status, Bundle extras) {
          
              }
          
              @Override
              public void onProviderEnabled(String provider) {
          
                  if ("gps".equals(provider)){
          
                      abonnementGPS();
                  }
          
              }
          
              @Override
              public void onProviderDisabled(String provider) {
          
                  if ("gps".equals(provider)){
          
                      desabonnementGPS();
                  }
          
              }
          }
          



          Je ne comprends pas très bien les modifications à apporter pour Android M, mon erreur doit surement venir de là.

          Voici mon logent au cas où ca peut aider:

          10-19 23:50:05.356    2927-2927/com.example.antoine.gps E/AndroidRuntime﹕ FATAL EXCEPTION: main
              Process: com.example.antoine.gps, PID: 2927
              java.lang.NoSuchMethodError: No virtual method checkSelfPermission(Ljava/lang/String;)I in class Lcom/example/antoine/gps/MainActivity; or its super classes (declaration of 'com.example.antoine.gps.MainActivity' appears in /data/app/com.example.antoine.gps-1/base.apk)
                      at com.example.antoine.gps.MainActivity.abonnementGPS(MainActivity.java:49)
                      at com.example.antoine.gps.MainActivity.onResume(MainActivity.java:33)
                      at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1257)
                      at android.app.Activity.performResume(Activity.java:6076)
                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3039)
                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3081)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2447)
                      at android.app.ActivityThread.access$800(ActivityThread.java:156)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:211)
                      at android.app.ActivityThread.main(ActivityThread.java:5373)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
          

          Sinon ton blog va surement m'être très utile car il résume une grande partie des choses que je vais utiliser donc merci :) !

          • Partager sur Facebook
          • Partager sur Twitter
          Je ne savais pas que c’était impossible, alors je l'ai fais ;)
            19 octobre 2015 à 23:57:47

            Nhi a écrit:

            utilise implements LocationListener

             @Override
                public void onLocationChanged(Location location) {
                        double latitude = location.getLatitude();
                        double longitude =  location.getLongitude();


            PS : oublie pas les permissions qui vont avec.

            Merci pour ta réponse je vais essayer ;) !

            • Partager sur Facebook
            • Partager sur Twitter
            Je ne savais pas que c’était impossible, alors je l'ai fais ;)
              20 octobre 2015 à 11:41:39

              L'utilisation des checkSelfPermission est lié à la nouvelle version d'Android : Android M. Cette version t'oblige à demander la permission d'utiliser certaines fonctionnalités à l'utilisateur directement au runtime. Plus d'info ici.

              • Partager sur Facebook
              • Partager sur Twitter
                20 octobre 2015 à 19:33:49

                Bon je me suis renseigner sur les permissions sous Android M, cependant, je pose une question, si un utilisateur possède une version inférieur a 23, que va-t-il ce passer, cela marche aussi même si il y a des checkSelfPermission dans mon code ?

                Il y a-il un moyen de savoir quelle sdk utilise le terminal, et de faire toutes les demandes de permission au debut du premier lancement de l'application si le sdk >= 23 (comment savoir que c'est le premier lancement ?).

                J'ai essayé ca dites moi ce que vous en pensez:

                public class MainActivity extends Activity implements LocationListener {
                
                    private LocationManager locationManager;
                
                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        CheckSDKVersion();
                
                    }
                
                
                    public void CheckSDKVersion() {
                
                        if ((int) Build.VERSION.SDK_INT < 23) {
                            return;
                        }else{
                
                            String []permission = {"android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"};
                            int requestId = 123;
                            requestPermissions(permission,requestId);
                        }
                    }
                
                
                
                
                    @Override
                    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
                        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
                
                
                        switch (requestCode) {
                            case 123: {
                                if (grantResults[0] ==
                                        PackageManager.PERMISSION_GRANTED){
                                    // permission was granted, woho!
                                } else {
                
                                    Toast.makeText(getApplicationContext(),"Et bah t'es pas futé toi...",Toast.LENGTH_SHORT).show();
                                }
                                return;
                            }
                        }
                
                    }
                
                    @Override
                    protected void onResume() {
                        super.onResume();
                
                        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
                
                        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                
                            abonnementGPS();
                        }
                
                    }
                
                    @Override
                    protected void onPause() {
                        super.onPause();
                
                        desabonnementGPS();
                    }
                
                
                    public void abonnementGPS() {
                
                        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                                && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                
                
                           requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 123);
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for Activity#requestPermissions for more details.
                           // return;
                        }
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, this);
                
                    }
                
                
                    private void desabonnementGPS() {
                
                        if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                
                            requestPermissions(new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 123);
                            // TODO: Consider calling
                            //    public void requestPermissions(@NonNull String[] permissions, int requestCode)
                            // here to request the missing permissions, and then overriding
                            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                            //                                          int[] grantResults)
                            // to handle the case where the user grants the permission. See the documentation
                            // for Activity#requestPermissions for more details.
                        //    return;
                        }
                        locationManager.removeUpdates(this);
                
                    }
                
                    @Override
                    public void onLocationChanged(Location location) {
                
                        final StringBuilder msg = new StringBuilder("lat:");
                        msg.append(location.getLatitude());
                        msg.append(";lng: ");
                        msg.append(location.getLongitude());
                
                        Toast.makeText(this,msg.toString(),Toast.LENGTH_SHORT).show();
                
                    }
                
                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {
                
                    }
                
                    @Override
                    public void onProviderEnabled(String provider) {
                
                        if ("gps".equals(provider)){
                
                            abonnementGPS();
                        }
                
                    }
                
                    @Override
                    public void onProviderDisabled(String provider) {
                
                        if ("gps".equals(provider)){
                
                            desabonnementGPS();
                        }
                
                    }
                }
                



                -
                Edité par AntoineDuval1 20 octobre 2015 à 20:16:37

                • Partager sur Facebook
                • Partager sur Twitter
                Je ne savais pas que c’était impossible, alors je l'ai fais ;)
                  20 octobre 2015 à 21:15:59

                  AntoineDuval1 a écrit:

                  Bon je me suis renseigner sur les permissions sous Android M, cependant, je pose une question, si un utilisateur possède une version inférieur a 23, que va-t-il ce passer, cela marche aussi même si il y a des checkSelfPermission dans mon code ?

                  Dans le cas des terminaux qui ne sont pas sous Android 23 les permissions sont acceptées automatiquement et de manière implicite à l'installation de l'application. Pour que le code soit rétro-compatible, il convient d'utiliser Compat du code : ContextCompat.checkSelfPermission();.

                  Il y a-il un moyen de savoir quelle sdk utilise le terminal, et de faire toutes les demandes de permission au debut du premier lancement de l'application si le sdk >= 23 (comment savoir que c'est le premier lancement ?).

                  Pas besoin de vérifier la version du SDK si tu utilises du code rétro-compatible. Et pour toutes les permissions au démarrage c'est une très mauvaise idée. Il ne faut demander une permission que si une action le nécessite (utilisation de l'appareil photo, accès aux contacts, etc). En fin tu peux, mais c'est le meilleur moyen de faire fuir les utilisateurs.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  [ANDROID] Localisation

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown