1

У меня проблема с моим приложением на Android. Я использую этот класс:Как я могу получить текущее местоположение

package com.example.seadog.gps; 

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 

import org.json.JSONObject; 

public class GPSTracker extends Service implements LocationListener { 

    private Context mContext; 

    public GPSTracker() { 

    } 

    boolean isGPSEnabled = false; 

    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    Location location; 
    double latitude; 
    double longitude; 

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; 

    private static final long MIN_TIME_BW_UPDATES = 5000; 

    protected LocationManager locationManager; 

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

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

      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 

      } else { 

       this.canGetLocation = true; 

       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 

       if (isGPSEnabled) { 

        if (location == null) { 
         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

         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; 
    } 

    public void stopUsingGPS(){ 
     if(locationManager != null){ 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 

    public double getLatitude(){ 
     if(location != null){ 
      latitude = location.getLatitude(); 
     } 

     return latitude; 
    } 

    public double getLongitude(){ 
     if(location != null){ 
      longitude = location.getLongitude(); 
     } 

     return longitude; 
    } 

    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 


    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     alertDialog.setTitle("GPS jest wyłączony"); 

     alertDialog.setMessage("Do używania tej aplikacji wymagany jest GPS. W tym celu przejdź do ustawień, włącz GPS a następnie uruchom ponownie."); 

     alertDialog.setPositiveButton("Ustawienia", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(intent); 
       System.exit(0); 
      } 
     }); 

     alertDialog.setNegativeButton("Anuluj", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
       System.exit(0); 
      } 
     }); 


     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     int ID = GlobalConfig.ID; 
     int Random = GlobalConfig.Random; 

     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 

     try { 

      JSONObject json = new JSONObject(); 
      json.put("ID", ID); 
      json.put("Random", Random); 
      json.put("latitude", latitude); 
      json.put("longitude", longitude); 

      GlobalConfig config = new GlobalConfig(); 
      config.set(json); 
      //config.i(0); 

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

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     System.exit(0); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

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

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

} 

Этот класс взят из Интернета. Я добавил собственный код в OnChangedLocation. Когда координаты меняются, создайте объект JSONObject с новой широтой и долготой в классе GlobalConfig. В другом классе есть Служба, которая отправляет данные на сервер каждые 5 секунд в фоновом режиме. Моя проблема в том, что широта и долгота неверны. Иногда полученное значение является правильным, а другое время - нет. Место остается таким же около 10 или нескольких минут, и через некоторое время будет показано правильное значение. Мое приложение работает в фоновом режиме. В браузере у меня был предварительный просмотр на карте Google, и мой маркер прыгает на карту. Я тестировал его во время вождения автомобиля.

Что-то не так. Я хотел бы получить правильную широту и долготу. Помогите!

+0

Этот вопрос уже задан –

+0

Вы должны использовать функцию поиска и посмотреть руководство по Google [Руководства по API] (http://developer.android.com/guide/topics/location/strategies.html) –

+0

Возможно дублировать [Получение позиции телефона Android с помощью GPS] (http://stackoverflow.com/questions/2651499/getting-the-position-of-an-android-phone-by-using-gps) –

ответ

2

Вы должны использовать последний Google API для местоположения. Во-первых, вы соединяетесь с этим API, как это:

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

if (!(googleApiClient.isConnected() || googleApiClient.isConnecting())) { 
     googleApiClient.connect(); 
} 

Теперь в вашем locationClientCallback вы получите, если API подключен или нет.

private class LocationClientCallback implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

     @Override 
     public void onLocationChanged(Location location) { 
      if (location == null) { 
       return; 
      } 

      // YOU HAVE YOUR POSITION 

     } 

     @Override 
     public void onConnectionFailed(ConnectionResult arg0) { 
      // CONNECTION FAILED 
     } 

     @Override 
     public void onConnected(Bundle arg0) { 
      // GOOGLE API CONNECTED 


      // MAKE A REQUEST FOR LOCATIONS 
      LocationRequest request = LocationRequest.create(); 
      request.setSmallestDisplacement(0); 
      request.setInterval(5000); 
      request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, request, this); 

     } 

     @Override 
     public void onConnectionSuspended(int i) { 
      // CONNECTION SUSPENDED 

     } 


    } 

И в обратных вызовах вы получаете позиции и другие события. В событии onConnected вы должны запросить места для клиентов API Google.

Надеюсь, это поможет вам!

+0

Я имею в виду, что это не так. Я создаю приложение для драйверов. Мое приложение работает в фоновом режиме, даже когда приложение скрыто, или смартфон находится в спящем режиме. Каждые 5 секунд устройство отправляет данные на сервер с местоположением, но здесь проблема. Это место неверно. Иногда бывает правильно. Я хочу только правильную широту и долготу в моей базе данных, тогда я кладу эти предметы на карту google на веб-сайте. – SeaDog

+0

Правильный способ получения местоположений - это. Этот код вы должны выполнить в службе. В местоположении у вас есть поле, указывающее точность местоположения. Если точность очень высока, вы можете исключить эту позицию. –

+0

Я скажу вам, что я не знаю, как это использовать. У меня есть библиотеки, отмеченные красным. Могу ли я иметь API-ключ от google, и если у меня есть GPSTracker, я должен удалить его и создать новый класс LocationClientCallback с инструментами ...? – SeaDog