3

I have a GPSTracker file but in the android M iam geting a zero on the locations... i ask for your help to solve this problem...see the code below

Fragment with the location and a webview to google maps

    public class ComoChegar extends Fragment {
EmpresaID item;

    public ComoChegar() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
       View tela = inflater.inflate(R.layout.fragment_como_chegar, container, false);
        Bundle id = getActivity().getIntent().getExtras();
        String Filial = id.getString("filial");
        if (isOnline()) {
            item = new EmpresaID(Filial);
            Autenticado(item);
        }
        else
        {
            android.app.AlertDialog.Builder alerta = new android.app.AlertDialog.Builder(getActivity());
            alerta.setMessage("Você está sem Acesso a Internet por favor verifique suas configurações, ative o wi-fi ou seus dados móveis");
            alerta.setPositiveButton("OK", null);
            alerta.show();
        }
        return  tela;
    }

    public  void Autenticado(EmpresaID id)
    {
        ServerRequests server = new ServerRequests(getActivity());
        server.getEmpresa(id, new GetEmpresaID() {
            @Override
            public void done(EmpresaID empresa) {
                if(empresa == null) {
                    Erro();
                }
                else {
                    GPSTracker gps = new GPSTracker(getActivity());
                    List<Address> addresses;
                    double latitude  = gps.getLatitude();
                    double longitude = gps.getLongitude();
                    Geocoder geocoder;
                    geocoder = new Geocoder(getActivity(), Locale.getDefault());

                    try {
                        if(latitude == 0 && longitude == 0)
                        {
                            gps.showSettingsAlert();
                        }
                        else {
                            addresses = geocoder.getFromLocation(latitude, longitude, 1);
                            String address = addresses.get(0).getAddressLine(0);
                            String city = addresses.get(0).getLocality();
                            String state = addresses.get(0).getAdminArea();
                            String country = addresses.get(0).getCountryName();
                            String postalCode = addresses.get(0).getPostalCode();
                            String knownName = addresses.get(0).getFeatureName();
                            String saida = "" + address + "," + city + "-" + postalCode;
                            String chegada = "" + empresa.endereco + " " + empresa.numero + "," + empresa.bairro + "-" + empresa.cidade;
                            WebView mapa = (WebView) getActivity().findViewById(R.id.mapa);
                            mapa.setWebViewClient(new WebViewClient());
                            mapa.getSettings().setJavaScriptEnabled(true);
                            String ida = saida.replace(" ", "+");
                            String trem = chegada.replace(" ", "+");
                            String Url = "https://www.google.com/maps/dir/" + latitude + "," + longitude + "/" + trem + "";
                            mapa.loadUrl(Url);

                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }

            }
        });

    }

    private void Erro() {
        android.support.v7.app.AlertDialog.Builder alerta = new android.support.v7.app.AlertDialog.Builder(getActivity());
        alerta.setMessage("Erro ao Carregar dados do servidor");
        alerta.setPositiveButton("OK", null);
        alerta.show();
    }

    private boolean isOnline() {
        ConnectivityManager cm =
                (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnectedOrConnecting();
    }


}

the GPSTracker class

    public class GPSTracker extends Service implements LocationListener {

    private final Context mContext;

    // flag for GPS status
    boolean isGPSEnabled = false;

    // flag for network status
    boolean isNetworkEnabled = false;

    // flag for GPS status
    boolean canGetLocation = false;

    Location location; // location
    double latitude; // latitude
    double longitude; // longitude

    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

    // Declaring a Location Manager
    protected LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);

            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        location = locationManager
                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return location;
    }

    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */
    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    /**
     * Function to get latitude
     * */
    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }

        // return latitude
        return latitude;
    }

    /**
     * Function to get longitude
     * */
    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }

        // return longitude
        return longitude;
    }

    /**
     * Function to check GPS/wifi enabled
     * @return boolean
     * */
    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    /**
     * Function to show settings alert dialog
     * On pressing Settings button will lauch Settings Options
     * */
    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        alertDialog.setTitle("Erro");

        // Setting Dialog Message
        alertDialog.setMessage("GPS não está ligado. Gostaria de Checar nas Configurações?");

        // On pressing Settings button
        alertDialog.setPositiveButton("Configurações", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });

        // on pressing cancel button
        alertDialog.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
            }
        });

        // Showing Alert Message
        alertDialog.show();
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
}
ArtKorchagin
  • 4,801
  • 13
  • 42
  • 58
Thiago Belão
  • 114
  • 1
  • 9
  • You create a `GPSTracker`, then two statements later attempt to get the latitude and longitude. That is unlikely to work, unless some other app has been requesting locations recently. You need to delay your work that needs the latitude and longitude until you get those values in your `LocationListener`, if they are not immediately available. – CommonsWare Nov 08 '15 at 20:57

1 Answers1

5

Since your LocationListener tries to get location using only Network not GPS, with this code snippet: locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) probably you are getting latitude and longitude values but with a delay. I had the same problem then I begin to use new/latest Location service API and use: GoogleApiClient. First you need to implement

GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener

from you activity that want to fetch the location data.

Define

private GoogleApiClient mGoogleApiClient;

mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

If you haven't add

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

to the manifest file, add that.

For further documentation : https://developers.google.com/android/reference/com/google/android/gms/common/api/GoogleApiClient

omersem
  • 564
  • 7
  • 21
  • Hello, this post is old, but I am facing the problem to get location now. Regarding permissions, only ACCESS_FINE_LOCATION should be added? not ACCESS_COARSE_LOCATION neither INTERNET? – jstuardo Aug 27 '20 at 12:16