Местоположение иногда возвращает ноль android - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь получить локализацию устройства с приложением android. У меня проблема с ним, иногда он возвращает ноль, даже если включена локализация / Wi-Fi / 4G.

Я проводил некоторые исследования. У нас есть:

- провайдер локализации, который использует спутники для обеспечения локализации

- провайдер сети, который использует Wifi / сотовую вышку для обеспечения локализации

==> провайдер локализованного соединения использует лучший способ между ними.

Но проблема в том, что я никогда не смогу получить локализацию, если я включу только "локализацию". Я должен активировать Wi-Fi или 4G + локализация и даже иногда это не работает.

Вот мой код (я использую "//" в коде, чтобы объяснить, где у меня проблемы):

public class HelperClass
{


private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;

 public void GetLocations(Context context, Activity activity)
{
     Boolean mLocationPermissionsGranted = false;

    Log.d(TAG, "getLocationPermission: getting location permissions");
    String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION};

    if(ContextCompat.checkSelfPermission(context.getApplicationContext(),
            FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
        if(ContextCompat.checkSelfPermission(context.getApplicationContext(),
                COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
            mLocationPermissionsGranted = true;
        }else{
            ActivityCompat.requestPermissions(activity,
                    permissions,
                    LOCATION_PERMISSION_REQUEST_CODE);
        }
    }else{
        ActivityCompat.requestPermissions(activity,
                permissions,
                LOCATION_PERMISSION_REQUEST_CODE);
    }
    if (mLocationPermissionsGranted) // && isLocationEnabled(context) ((1)CHECK below)
    {
        getDeviceLocation(context, mLocationPermissionsGranted);
        if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context,
                Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        }
    }
}
private void getDeviceLocation(final Context context, Boolean mLocationPermissionsGranted)
{
    Log.d(TAG, "getDeviceLocation: getting the devices current location");
    FusedLocationProviderClient mFusedLocationProviderClient;
    mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(context);

    try{
        if(mLocationPermissionsGranted){
            final Task location = mFusedLocationProviderClient.getLastLocation();
            location.addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    if(task.isSuccessful()){
                        Log.d(TAG, "onComplete: found location!");

                        Location currentLocation = (Location) task.getResult(); //PROBLEM HERE !!! 
                       //currentLocation is null sometimes even if wifi + localisation  is enabled !

                        if (currentLocation != null) {
                            double Latit = currentLocation.getLatitude();
                            double Longit = currentLocation.getLongitude();
                            LatLng latLong = new LatLng(Latit, Longit);

                           //TODO Do something with LatLng
                        }
                        else //if currentLocation is null, try to get last location
                        {
                            Log.i("CheckLocation", "null");

                            LocationManager lm = 
                           (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
                            Location location = null;
                            if (lm != null)
                            {
                                Log.i("CheckLocation", "Not null");

                                location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                 //PROBLEM if currentLocation is null, this is also null so it doesn't help ...
                                double longitude = location.getLongitude();
                                Log.i("CheckLocation", "Long" + longitude);
                                double latitude = location.getLatitude();
                                Log.i("CheckLocation", "Lat" + latitude);

                            }
                            else
                            {
                                Log.i("CheckLocation", "Last location return null");

                            }


                        }
                    }else{
                        Log.d(TAG, "onComplete: current location is null");
                        Toast.makeText(context, "unable to get current location", Toast.LENGTH_SHORT).show();




                    }
                }
            });
        }
    }catch (SecurityException e){
        Log.e(TAG, "getDeviceLocation: SecurityException: " + e.getMessage() );
    }
}
}

// (1) Я пытался добавить эту функцию, чтобы проверить ЕСЛИ МЕСТОПОЛОЖЕНИЕ ВКЛЮЧЕНО

// Похоже, что когда currentLocation возвращает ноль, network_enabled возвращает false // gps_enabled обычно возвращает true

 public boolean isLocationEnabled(Context context)
{
    LocationManager lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    boolean gps_enabled = false;
    boolean network_enabled = false;
    try {
        gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch(Exception ex) {}

    if (gps_enabled)
    {
        Log.i("CheckNewtork", "Gps true" );
    }
    else
    {
        Log.i("CheckNewtork", "Gps false" );
    }

    try {
        network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch(Exception ex) {}


    if (network_enabled)
    {
        Log.i("CheckNewtork", "Network true" );
    }
    else
    {
        Log.i("CheckNewtork", "Network false" );
    }
    return (gps_enabled);

}

Вот как я вызываю функции из действия:

        helperClass.GetLocations(this, MainActivity.this);

У кого-нибудь есть идеи как это исправить? Моему приложению нужна локализация, и я не могу полагаться на то, что «иногда это работает, иногда нет». Спасибо за вашу помощь

...