Получение текущего местоположения как 0.0, 0.0

#android

#Android

Вопрос:

Как следует из названия, я получаю свое текущее местоположение как 0.0, 0.0 при регистрации в LogCat. Я перепробовал все решения, представленные в сети, но не получил никакого решения. Пожалуйста, помогите. Мой код приведен ниже, я также предоставил все разрешения в манифесте. Любая помощь была бы действительно оценена.

MapsActivity.java

 public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    private GPStracker gpsTracker;
    private Location mLocation;
    double latitude, longitude;

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

        // Checking permission is allowed or not
        int Permission_All = 1;

        String[] Permissions = {android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION};
        if(!hasPermissions(this, Permissions)){
            ActivityCompat.requestPermissions(this, Permissions, Permission_All);
        }

        gpsTracker = new GPStracker(MapsActivity.this);
        // checking GPS is enabled or not//
        gpsTracker.chkGPSorNetworkEnabled();
        mLocation = gpsTracker.getLocation();
        if(mLocation!=null) {
         latitude = mLocation.getLatitude();
         longitude = mLocation.getLongitude();
        }
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

   @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(latitude, longitude);
        mMap.addMarker(new MarkerOptions().position(sydney).title("I'm here..."));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
    }

    public static boolean hasPermissions(Context context, String... permissions){

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M amp;amp; context!=null amp;amp; permissions!=null){
            for(String permission: permissions){
                if(ActivityCompat.checkSelfPermission(context, permission)!= PackageManager.PERMISSION_GRANTED){
                    return  false;
                }
            }
        }
        return true;
    }
}
  

GPStracker.java

 public class GPStracker extends Service implements LocationListener {


    private final Context context;

    boolean isGPSEnabled =false;
    boolean isNetworkEnabled =false;
    boolean canGetLocation = false;

    Location location;
    protected LocationManager locationManager;

    public GPStracker(Context context){
        this.context=context;
    }

    // Class to check GPS/Location is enabled or not //
    public  void chkGPSorNetworkEnabled(){

        locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
isGPSEnabled=locationManager.isProviderEnabled(locationManager.GPS_PROVIDER);

isNetworkEnabled = locationManager.isProviderEnabled(locationManager.NETWORK_PROVIDER);

        String gpsMsg = "Please Enable your GPS/Location Service";
        String netMsg = "Please Enable your Network Service";

        if(!isGPSEnabled){
            AlertDialog.Builder dialog = new AlertDialog.Builder(context);
            dialog.setMessage(gpsMsg);

            dialog.setPositiveButton("GPS Settings", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Intent gpsIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(gpsIntent);
                }
            });
            dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            });
            dialog.show();
        }else if(!isNetworkEnabled){
            AlertDialog.Builder dialog = new AlertDialog.Builder(context);
            dialog.setMessage(netMsg);

            dialog.setPositiveButton("Network Settings", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    Intent gpsIntent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
                    context.startActivity(gpsIntent);
                }
            });
            dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {

                }
            });
            dialog.show();
        }else{
            getLocation();
        }

    }


    //Create a GetLocation Method //
    public  Location getLocation(){
        try{
            locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
            isGPSEnabled = locationManager.isProviderEnabled(locationManager.GPS_PROVIDER);
            isNetworkEnabled=locationManager.isProviderEnabled(locationManager.NETWORK_PROVIDER);
            //chkGPSorNetworkEnabled();
            if(ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED ){

                if(isGPSEnabled){
                    if(location==null){
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000,10,this);
                        if(locationManager!=null){
                            location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        }
                    }
                }
                // if location is not found from GPS than it will found from network //
                if(location==null){
                    if(isNetworkEnabled){

                        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000,10,this);
                        if(locationManager!=null){
                            location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                        }

                    }
                }

            }

        }catch(Exception ex){

        }
        return  location;
    }

    // followings are the default method if we imlement LocationListener //
    public void onLocationChanged(Location location){

    }

    public void onStatusChanged(String Provider, int status, Bundle extras){

    }
    public void onProviderEnabled(String Provider){

    }
    public void onProviderDisabled(String Provider){

    }
    public IBinder onBind(Intent arg0){
        return null;
    }

}
  

Комментарии:

1. Можете ли вы показать нам свой манифест, чтобы увидеть все разрешения?

2. вам нужно реализовать onBind() и вернуть экземпляр IBinder , иначе служба не будет привязываться.

3. Мартин Цайтлер, не могли бы вы рассказать, как, поскольку я новичок в этом.

Ответ №1:

Вы должны использовать метод обратного вызова onLocationChanged () для прослушивания текущих обновлений местоположения. В этом методе location instance предоставит вам как широту, так и долготу. Добавьте маркер на карту также тем же методом. Вам понадобится экземпляр map и отправьте его в класс GPSTracker через конструктор при создании экземпляра в MapsActivity

 public void onLocationChanged(Location location){
    mMap.clear();
    LatLng latlng = new LatLng(location.getLatitude(), location.getLongitude());
    mMap.addMarker(new MarkerOptions().position(latlng).title("I'm here..."));
    mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(
            latlng, 17.0f)
}
  

Ответ №2:

Вместо использования Location API попробуйте использовать FusedLocationProviderApi, который является последним и точным, поскольку оптимизировал способ получения местоположения. и для понимания того, работает код или нет, попробуйте открыть приложение Map, а затем нажмите кнопку GPS, когда получите местоположение, затем попробуйте запустить свое приложение. Дайте мне знать, поможет это или нет.Но я бы настоятельно рекомендовал вам использовать FusedLocationProviderApi.