Невозможно найти местоположение моего телефона в приложении - PullRequest
0 голосов
/ 05 апреля 2020

Я создаю приложение в Android Studio, которая будет иметь доступ к местоположению пользователя. Ниже приведен код, который я использую. Я использую свой телефон в качестве эмулятора. Я предоставил ACCESS_FINE_LOCATION и ACCESS_INTE RNET в файле манифеста XML.

public class MainActivity extends AppCompatActivity {

    LocationManager locMan;
    LocationListener locList;


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
    {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
        {
            if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION ) == PackageManager.PERMISSION_GRANTED)
            {
                locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList);
            }
        }
    }

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

        locMan = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
        locList = new LocationListener()
        {
            @Override
            public void onLocationChanged(Location location)
            {
                Toast.makeText(getApplicationContext(), location.toString(), Toast.LENGTH_SHORT).show();
// Here I am trying to make toast of my location. In place of 'getApplicationContext()' , I had passed 'MainActivity' but it also don't work.
            }

            @Override
            public void onStatusChanged(String s, int i, Bundle bundle)
            {

            }

            @Override
            public void onProviderEnabled(String s)
            {

            }

            @Override
            public void onProviderDisabled(String s)
            {

            }
        };
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION ) != PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},1);
        }
        else
        {
            locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locList);
        }
    }
}

Что можно сделать? Есть ли проблемы с моим GPS?

Ответы [ 2 ]

0 голосов
/ 05 апреля 2020

Одна вещь, которую я заметил, это то, что у вас есть только разрешение ACCESS_FINE_LOCATION и использование LocationManager.GPS_PROVIDER. Это инструктирует приложение использовать только GPS для определения местоположения, а не оптимизированный путь, комбинацию GPS, мобильной сети и сетей WiFi.

И я предполагаю, что когда вы кодируете, вы находитесь в помещении. Для работы GPS необходима видимость неба, поэтому, возможно, он не сможет получить сигнал со спутников. Вы можете попробовать поместить его рядом с окном, и это может сработать.

Но если вам не требуется строго использовать только GPS, измените его на всех возможных поставщиков.

0 голосов
/ 05 апреля 2020

В зависимости от используемой версии android может потребоваться также использовать ACCESS_COARSE_LOCATION. Попробуйте добавить его в манифест и запросить разрешение в вашей активности.

Однажды я написал рабочий класс для постоянного отслеживания местоположения устройств.

private static LocationManager locationManager=null;
private static LocationListener locationListener=null;

public static void startTrackingLocation(final Context context, final LocationChangedListener listener) {
    startTrackingLocation(context, listener, 0.5, 1);
}
/**
 * Location gets requested periodically, and a call on abstract listener.onLocationChanged(Location l)
 * is performed if distance between locations is > distance
 * @param context   context to gather the location from
 * @param listener  listens to location changes
 * @param minutes   interval between the location requests
 * @param distance  minimal distance to trigger onLocationChanged(Location l)
 */
public static void startTrackingLocation(@NotNull final Context context, @NotNull final LocationChangedListener listener, final double minutes, final int distance) {
    initLocationManager(context);
    locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            listener.onLocationChanged(location);
        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) { }
        @Override
        public void onProviderEnabled(String provider) { }
        @Override
        public void onProviderDisabled(String provider) { }
    };

    try {
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, (int)(minutes*60000), distance, locationListener);
    } catch (SecurityException ignored) { }
}

private static void initLocationManager(@NotNull final Context context) {
    if (null==locationManager) {
        locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }
}

@SuppressWarnings("unused")
public static void stopTrackingLocation() {
    if (null!=locationManager && null!=locationListener) {
        locationManager.removeUpdates(locationListener);
    }
}

public static Location getLocation(final Context context) {
    initLocationManager(context);
    Location locationGPS=null, locationNet=null;
    try {
        locationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        locationNet = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
    } catch (SecurityException ignored) { }

    if (null != locationNet) {
        return locationNet;
    }
    return locationGPS;
}
@SuppressWarnings("unused")
private static double distance(final double lat1, final double lon1, final double lat2, final double lon2) {
    final double theta = lon1 - lon2;
    double dist = Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2))
            + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(theta));
    dist = Math.toDegrees(Math.acos(dist)) * 60 * 1850 ; // 1 degree is 111km 111/60=1.85
    return (dist);
}

Класс LocationChangedListener - это абстрактный класс I написал, чтобы поймать событие, где место было изменено.

Код очень прост:

 public abstract void onLocationChanged(Location location);

В вашей деятельности:

LocationChangedListener listener = new LocationChangedListener() {
        @Override
        public void onLocationChanged(Location location) {
            MainActivity.this.onLocationChanged(location);
        }
    };

Это полностью работает на моем android устройство, вы можете попробовать. Кроме того, функция Location getLocation (конечный контекстный контекст) может быть опущена, поскольку она дает вам только местоположение устройств в данный момент времени.

Я использовал те же разрешения в манифесте. Это также должно работать для вас.

...