我想知道有一种方法可以获得位置,只要它改变了吗?我知道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
如何使用它?
我可以在不定期使用的情况下实施吗?
答案 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" />
一个监听器类,用于监视设备上特定电话状态的变化,包括服务状态,信号强度,消息等待指示器(语音邮件)等。
重写要接收其更新的状态的方法,并将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;
}