Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ANDROID] [JAVA] - positionNow.getLatitude() API23

[ANDROID] [JAVA] - positionNow.getLatitude() API >= 23

    11 février 2018 à 22:19:21

    Salut tout le monde :),

    Je cherche a géolocaliser l'utilisateur de mon application.
    Pour cela j'utilise " positionNow.getLatitude()".

    J'ai donc commencé par tester dans ma MainActivity et après quelques problèmes de droits dus a l'API 23 et +, j'ai réussis a afficher la latitude de l'utilisateur dans les log.e().

    Mais étant débutant, je ne savais pas que ça ne marcherait pas forcément de la même façon dans un fragment (MapsFragment).
    Ducoup, j'ai essayé d'adapter la chose, mais j'obtient un crash au démarrage avec un log : "Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference"

    Et je n'ai strictement aucune idée d'où vient le problème ?

    import android.app.Activity;
    import android.content.Context;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.OnMapReadyCallback;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.MarkerOptions;
    
    import java.util.List;
    
    import okhttp3.OkHttpClient;
    import retrofit.Callback;
    import retrofit.RestAdapter;
    import retrofit.RetrofitError;
    import retrofit.client.Response;
    
    import android.Manifest;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationManager;
    import android.location.LocationProvider;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TabHost;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    import retrofit.Callback;
    import retrofit.RestAdapter;
    import retrofit.RetrofitError;
    import retrofit.client.Response;
    
    public class MapsFragment extends Fragment implements OnMapReadyCallback {
    
        private int REQUEST_LOCATION;
        private List<Marqueur> tousLesMarqueurs = new ArrayList<>();
    
        public MapsFragment() {
    
            getAllMark();
    
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            //return inflater.inflate(R.layout.fragment_maps, container, false);
            final View rootView = inflater.inflate(R.layout.fragment_maps, container, false);
            final SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map);
            mapFragment.getMapAsync(this);
    
            /*******/
            getUserPosition();
    
            /*******/
    
            return rootView;
    
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            //googleMap.addMarker(new MarkerOptions().position(new LatLng(48.8534100, 2.3488000)).title("Paris").snippet("is beautiful !"));
    
            //Ajout des marqueurs
            int i = 0;
                while(i<tousLesMarqueurs.size())
                {
                    Log.e(String.valueOf(i), String.valueOf(tousLesMarqueurs.get(i).getLong()));
                    googleMap.addMarker(new MarkerOptions().position(new LatLng(tousLesMarqueurs.get(i).getLati(), tousLesMarqueurs.get(i).getLong())));
                    i++;
                }
    
        }
    
        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
        }
    
    
        public void getAllMark() {
    
            bddRequest githubService = new RestAdapter.Builder()
                    .setEndpoint(bddRequest.ENDPOINT)
                    .build()
                    .create(bddRequest.class);
            githubService.listMarqueurs("API_REST", new Callback<List<Marqueur>>() {
                @Override
                public void success(List<Marqueur> marqueur, Response response) {
    
                        DisplayRepos(marqueur);
    
    
                        int i = 0;
                        while (i < marqueur.size()) {
                            Log.e(String.valueOf(i), String.valueOf(marqueur.get(i).getLong()));
                            i++;
                        }
    
                        tousLesMarqueurs = marqueur; //On passe les données dans une nouvelle liste
                        //tousLesMarqueurs.addAll(marqueur);
    
    
                }
    
                @Override
                public void failure(RetrofitError error) {
                    Log.e("API_Test", "ERROR ! ");
                }
            });
            }
    
        public void DisplayRepos(List<Marqueur> marqueur) {
            Log.e("nombre de dépots : ", String.valueOf(+marqueur.size()));
        }
    
    
        public void getUserPosition() {
    
            /*****************************/
            Context mainContext = getActivity().getApplicationContext();
    
            // Assume thisActivity is the current activity
            int permissionCheck = ContextCompat.checkSelfPermission(mainContext,
                    Manifest.permission.WRITE_CALENDAR);
            Log.e("DROITS :", String.valueOf(permissionCheck));
    
            if (ContextCompat.checkSelfPermission(mainContext,
                    Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
    
                // Should we show an explanation?
                if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) mainContext,
                        Manifest.permission.ACCESS_FINE_LOCATION)) {
    
    
    
                } else {
    
                    // No explanation needed, we can request the permission.
                    Log.e("PAS LE DROIT!", "GPS INTERDIT !");
    
                    ActivityCompat.requestPermissions((Activity) mainContext,
                            new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                            REQUEST_LOCATION);
    
                    // MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an
                    // app-defined int constant. The callback method gets the
                    // result of the request.
                }
            }
    
            permissionCheck = ContextCompat.checkSelfPermission(mainContext,
                    Manifest.permission.WRITE_CALENDAR);
            Log.e("DROITS :", String.valueOf(permissionCheck));
            /*****************************/
    
            LocationManager locationManager = (LocationManager) mainContext.getSystemService(Context.LOCATION_SERVICE);
            ArrayList<String> names = (ArrayList<String>) locationManager.getProviders(true); //Récupère les providers
    
            //On ajoute des critère pour trouver le meilleur provider (indicateur de position)
            Criteria critere = new Criteria();
            critere.setAccuracy(Criteria.ACCURACY_FINE);//On demande une position précise
            critere.setAltitudeRequired(false);         // Est-ce que le fournisseur doit être capable de donner une altitude ?
            critere.setBearingRequired(true);           // Est-ce que le fournisseur doit être capable de donner une direction ?
            critere.setCostAllowed(false);              // Est-ce que le fournisseur peut être payant ?
            critere.setPowerRequirement(Criteria.POWER_HIGH); //On accepte d'utiliser un provider a haute consommation électrique(GPS)
            critere.setSpeedRequired(false); // Est-ce que le fournisseur doit être capable de donner une vitesse ?
    
    
            List<String> providers = locationManager.getAllProviders(); //Liste des fournisseurs qui correspondent
            String bestProvider = locationManager.getBestProvider(critere, true); //Liste des fournisseurs qui correspondent
    
    
    
    
            int y = 0;
            Log.e("Provider n°", "fdfgdfgdf");
    
            Log.e("Provider n°", String.valueOf(providers.size()));
    
    
    
            if(bestProvider == null)
            {
                Log.e("Best Provider","NULL");
            }
            else{
                Log.e("Best Provider", bestProvider);
            }
    
            Location positionNow = locationManager.getLastKnownLocation(bestProvider); //Objet location qui contient la position de l'utilisateur
            Log.e("Position user now", "Lat:"+String.valueOf(positionNow.getLatitude()));
    
        }
    
    }//Fin Class

    En gros, tout se passe au niveau de "public void getUserPosition()" .

    Le reste fonctionne (ajout de marqueurs,..)

    Merci d'avance de votre aide ! :) Et bon début de semaine !

    -
    Edité par DataCube 11 février 2018 à 22:22:04

    • Partager sur Facebook
    • Partager sur Twitter
      12 février 2018 à 15:49:14

      Salut,

      Ton problème est que tu ne vérifies pas si ta requête web est terminée quand tu utilises tes markers dans la callback de ta carte. Si tu ne veux pas te prendre la tête et être sûr que tout est prêt, tu devrais faire ta requête web dans la méthode `onMapReady`.

      • Partager sur Facebook
      • Partager sur Twitter
        12 février 2018 à 20:10:34

        Salut, rolandl, Effectivement c'est une idée mais ça ne semble pas concerner mon problème . L'ajouts des marqueurs fonctionne. C'est la partie qui me permet d'obtenir la position de l'utilisateur qui crash..
        • Partager sur Facebook
        • Partager sur Twitter

        [ANDROID] [JAVA] - positionNow.getLatitude() API23

        × 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