如何在变化时获取位置

时间:2014-01-23 03:48:22

标签: android android-location

我想知道有一种方法可以获得位置,只要它改变了吗?我知道android提供了这个http://developer.android.com/training/location/receive-location-updates.html 获取位置更新,并说明:

“如果您的应用程序执行导航或跟踪,您可能希望定期获取用户的位置。虽然您可以使用LocationClient.getLastLocation()执行此操作,但更直接的方法是从位置服务请求定期更新。响应,位置服务会根据当前可用的位置提供商(如WiFi和GPS),根据最佳位置自动更新您的应用。“

如何在不定期使用的情况下进行操作?主要目标是最小化功耗。例如,如果我在一个房间里坐着,就不会有位置变化。如果我开始移动,它应该报告位置变化。

如果只是更新,我确实需要获取位置,所以不要经常。

该方法应该在后台持续运行,并以节能方式提供所有位置更新。

我在这里找到了android融合位置API https://developer.android.com/google/play-services/location.html

如何使用它?

我可以在不定期使用的情况下实施吗?

4 个答案:

答案 0 :(得分:0)

 protected void updateNotification() {
         LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
         LocationListener locationListener = new MyLocationlistener();

         lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, normallocationwait, 0.250f, locationListener);
         location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
   }

   private class MyLocationlistener implements LocationListener {

     public void onLocationChanged(Location location){
         if(location!=null){
             if(location.hasAccuracy()){
                   dumpLocation(location);
             }else{
                   dumpLocation(location);
            }
         } 
     }

     public void onProviderDisabled(String provider){
         Log.v("Loc Update","\nProvider disabled: " + provider);
     }

     public void onProviderEnabled(String provider){
         Log.v("Loc Update","\nProvider enabled: " + provider);
     }

     public void onStatusChanged(String provider, int status, Bundle extras){
         Log.v("Loc Update","\nProvider status changed: " + provider + ", status="
                    + status + ", extras=" + extras);
     }

答案 1 :(得分:0)

// try this way
// declaration
public static LocationManager mlocManager;
public static LocationListner mListner;
private static String latitude;
public static String longitude;

//initialization
try {
    if (mlocManager == null)
            mlocManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
    if (mListner == null)
            mListner = new LocationListner();
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    try {
                        try {
                            mlocManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, mListner);
                        } catch (Throwable e) {
                            e.printStackTrace();
                        }

                        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListner);
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                    try {
                        mlocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mListner);
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }

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

//listener
class LocationListner implements LocationListener {

        @Override
        public void onLocationChanged(Location location) {
            setLatitude("" + location.getLatitude());
            setLongitude("" + location.getLongitude());
            setCurrentLocation(location);
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

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

}
// Setter
public void setLatitude(String latitide) {
    this.latitude = latitide;
}
// Getter
public String getLatitude() {

    try {
        if (latitude != null) {
            return latitude;
        }
        if(mlocManager==null)
        {
            mlocManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
        }
        Location loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (loc == null) {
            loc = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (loc == null) {
                loc = mlocManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
            }
            if (loc != null) {
                    return "" + loc.getLatitude();
            }
            } else {
                    return "" + loc.getLatitude();
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "0";
}
  // Setter
public void setLongitude(String longitude) {
    this.longitude = longitude;
}
// Getter
public String getLongitude() {
    try {
        if (longitude != null) {
            return longitude;
        }
        if(mlocManager==null)
        {
            mlocManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
        }
        Location loc = mlocManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (loc == null) {
            loc = mlocManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            if (loc == null) {
                loc = mlocManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
            }
            if (loc != null) {
                return "" + loc.getLongitude();
            }
            } else {
                return "" + loc.getLongitude();
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return "0";
}

答案 2 :(得分:0)

我已经搜索这篇文章很多次了!而且我已经找到了类似的方法,但是虽然这种策略可能对您有所帮助,但它并不十分准确,但是除非朋友提供的其他答案,否则我没有发现任何有用的方法,所以我将其称为{{1} }:

首先,您需要添加权限:

PhoneStateListener
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

根据documentations

  

一个监听器类,用于监视设备上特定电话状态的变化,包括服务状态,信号强度,消息等待指示器(语音邮件)等。

     

重写要接收其更新的状态的方法,并将PhoneStateListener对象以及LISTEN_标志的按位或传递给public class LocationService extends PhoneStateListener { private TelephonyManager telephonyManager; private boolean isLocationChanged; public LocationService(Context context) { telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager != null){ isLocationChanged= telephonyManager.isNetworkRoaming(); telephonyManager.listen(this,PhoneStateListener.LISTEN_CELL_LOCATION); } } public boolean locationChanged(){ return isLocationChanged; } void unregisterListener(){ telephonyManager.listen(this,PhoneStateListener.LISTEN_NONE); } @Override public void onCellLocationChanged(CellLocation location) { if (location != null){ isLocationChanged = true; } } } 。状态更改时以及初始注册时调用一次方法。

我还不确定它是否可以正常工作,所以请告诉我它是否可以正常工作! :)

这是另一个示例:Add PhoneStateListener

答案 3 :(得分:-1)

这种方法需要GooglePlayService,它不需要太多力量,也许你可以试试。

private LocationClient locationClient;
private static final int LOCATION_UPDATES_INTERVAL = 10000;
private static final int LOCATION_NUM_UPDATES = 5;

public void startLocationUpdate() {
    if (!(locationClient.isConnected() || locationClient.isConnecting())) {
        locationClient.connect(); // Somehow it becomes connected here
        return;
    }
    // Request for location updates
    LocationRequest request = LocationRequest.create();
    request.setInterval(LOCATION_UPDATES_INTERVAL);
    request.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    request.setNumUpdates(LOCATION_NUM_UPDATES);
    locationClient.requestLocationUpdates(request, this);
}

在Activity中你应该实现以下回调

private Location mLastLocation;
    @Override
public void onLocationChanged(Location location) {
    if (location == null) {
        Log.v(TAG, "onLocationChanged: location == null");
        return;
    }

    if (mLastLocation != null &&
            mLastLocation.getLatitude() == location.getLatitude() &&
            mLastLocation.getLongitude() == location.getLongitude()) {
        return;
    }
    LogUtil.i(TAG, "LocationChanged == @" +
            location.getLatitude() + "," + location.getLongitude());
    mLastLocation = location;
}