在许多Android活动中使用当前位置

时间:2014-04-30 13:51:51

标签: android android-activity location android-service location-client

我正在制作一个必须在许多活动中使用用户当前位置的应用。我真的不想在每个活动中实施位置客户端。在我的应用中使用当前位置的最佳方式是什么?可能是后台服务?如果是这样,我该如何使用它?任何一个例子?

3 个答案:

答案 0 :(得分:2)

首先," Hemant Chand Dungriyal"是不正确的。该类继承自Service,但不使用Service组件提供的任何功能,因此基本上它只是一个常规类,您也可以删除" extends Service"部分! (显然我没有声名鹊起来发表评论!)

总的来说,我认为每个客户在android中管理他们自己与LocationProvider服务的连接会更好,这样他们就可以请求匹配他们需求的位置。例如,如果一个活动只需要一个粗略的位置,而另一个活动需要系统中最后一个已知位置而另一个需要一个好位置,那么你就不会通过为所有这些位置提供精确的位置来浪费系统资源。 / p>

但如果您知道应用的所有部分都需要优质位置,那么使用服务是一种选择。但是你应该管理服务的生命周期(无论你想要它是绑定服务,还是启动服务?,何时创建以及何时销毁它?等等)你还需要知道什么时候关闭所有活动并且&# 39;可以安全地关闭服务。

替代方案是在应用程序类中实现代码。您可以初始化第一个活动何时需要访问它,然后当所有活动都关闭时您可以关闭它(再次需要一个机制来确定是否仍然有可见的活动需要知道该位置)。

对于实施示例,我相信你可以找到很多,只是谷歌。

答案 1 :(得分: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

答案 2 :(得分:0)

我建议您使用Google Play服务关注此示例,然后从生成的FragmentActivity中扩展需要位置的活动:http://developer.android.com/training/location/receive-location-updates.html

如果您在Play商店之外发布,您可以使用Android中较旧的位置服务(或利用它们的库),并且从应用程序执行此操作是可行的,但基本活动类同样简单,使生命周期更清晰管理并划分位置代码。