2

Я делаю приложение, которое должно использовать текущее местоположение пользователя во многих действиях. Я действительно не хочу внедрять клиента местоположения в каждом действии. Каков наилучший способ использования текущего местоположения в моем приложении? Возможно, фоновая служба? И если да, то как я могу это использовать? Любой пример?Использовать текущее местоположение во многих видах деятельности Android

ответ

2

Во-первых, ответ на «Hemant Чанд Dungriyal "неверен. Класс наследуется от Service, но не использует никаких функций, предоставляемых компонентами Service, поэтому в основном это обычный класс, вы можете также удалить часть «extends Service»! (видимо, у меня нет репутации enoug, чтобы комментировать!)

В целом, я считаю, что для каждого клиента лучше управлять своим подключением к службе LocationProvider в android, таким образом, они могут запросить местоположение, соответствующее их потребностям. Например, если для работы требуется только приблизительное местоположение по сравнению с другим, для которого требуется последнее известное местоположение из системы по сравнению с другим, для которого требуется точное местоположение, вы не будете тратить ресурсы системы, предоставляя точное местоположение всем из них.

Но если вы знаете, что точное местоположение необходимо во всех частях вашего приложения, то использование Сервиса - это один из вариантов. Но тогда вам следует управлять жизненным циклом услуги (хотите ли вы, чтобы она была связана службой или запущена служба ?, когда создавать и когда ее уничтожать? И т. Д.). Также вам нужно знать, когда все действия закрыты, и это безопасно для отключения службы.

Альтернативой будет реализация кода в классе приложения. Вы можете инициализировать, когда первая активность нуждается в доступе к ней, а затем, когда все действия будут закрыты, вы можете закрыть ее (снова вам нужен механизм, чтобы выяснить, есть ли еще видимые действия, которые должны знать местоположение).

Для примера реализации я уверен, что вы можете найти немало, просто пойдите в Google.

+0

Мои мысли точно. – NickT

1

Используйте ниже код, чтобы получить текущее местоположение Lat Long: -

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

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; 

    boolean canGetLocation = false; 

    Location location; // location 
    public static double latitude; // latitude 
    public static 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(); 
//       System.out.println("latitude if (isNetworkEnabled) => "+latitude); 
//       System.out.println("longitude if (isNetworkEnabled) => "+longitude); 
         } 
        } 
       } 
       // 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(); 
//        System.out.println("latitude if (isGPSEnabled) => "+latitude); 
//        System.out.println("longitude if (isGPSEnabled) => "+longitude); 
          } 
         } 
        } 
       } 
      } 

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

     return location; 
    } 

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

, где вы хотите, чтобы получить широчайшие и длинный вызов ниже код: -

new GPSTracker(Activity.this); 
double latitude = GPSTracker.latitude; // latitude 
double longitude = GPSTracker.latitude; // latitude 
+1

Это не способ использовать службу, создавая экземпляр нового класса в каждом действии, вместо этого вы должны использовать IBinder. Также вы не указали код в onLocationChanged, последнее известное местоположение будет равно null. Это ужасный ответ. -1 – NickT

0

Я рекомендую последовать этот пример с помощью Google Play услуг, а затем расширение деятельности, которые нуждаются в местах с результирующей FragmentActivity: http://developer.android.com/training/location/receive-location-updates.html

Если вы публикуете вне Play Store, вы можете использовать старую Геолокацию в Android (или библиотека, использующая их), и сделать это из Приложения возможно, но базовый класс активности так же прост, что делает более понятным управление жизненным циклом и разделяет код местоположения.

+0

не подходит ли этот подход для многопроцессорных действий, например, многократного запуска одного и того же кода в разных действиях? – techtinkerer

Смежные вопросы