这是我注册我的应用程序以接收位置更新的方式:
mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(Consts.ONE_MINUTE * 10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setFastestInterval(Consts.ONE_MINUTE);
Builder builder = new GoogleApiClient.Builder(context);
builder.addApi(ActivityRecognition.API);
mGoogleApiClient = builder.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
....
....
@Override
public void onConnected(Bundle connectionHint) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, locationUpdatespendingInent);
}
Run Code Online (Sandbox Code Playgroud)
我的待处理意图几乎在确切的请求间隔内在后台调用了......
到现在为止还挺好.
问题: 当WIFI被禁用/未连接到任何网络,或者没有启用3G/4G网络数据时 - 融合位置提供商不提供新的位置更新!!
我的位置访问设置已打开,并且会检查GPS卫星和WI-FI以及移动网络位置.
在更严重的问题:有时候在这种情况下,我通过悬而未决的意图接收位置更新回调,但最后的位置就知道(即使是一个小时前,和我在很久很久不见了远离那个地方英里)
根据以下文件PRIORITY_BALANCED_POWER_ACCURACY:
与setPriority(int)一起使用以请求"块"级别的准确性.块级精度被认为是大约100米的精度.使用诸如此类的粗略精度通常会消耗更少的功率.
我期待融合位置提供商在没有其他选择的情况下打开GPS,或者如果他没有任何选择,至少不会提供新的位置更新.
另一个不可预测和令人不安的问题:
我改变了PRIORITY_BALANCED_POWER_ACCURACY对PRIORITY_HIGH_ACCURACY中才能看到它的行为(24小时).所有间隔保持不变(更新之间间隔10分钟).即使在没有网络/ SIM卡的手机中也确实收到了准确的位置,但是 - 电池耗尽快!当我查看电池历史时,我惊讶地发现GPS无线电一直处于全传输模式! 我还在我的日志中看到每分钟收到一个位置,即使我每十分钟请求一次位置(我没有任何其他安装的应用程序打开GPS接收位置..)
我注意到在多个设备上(如摩托X 2013,HTC One X的,Nexus 5的)这种行为,所有最新的谷歌播放服务(版本6.1.11),以及Android 4.4.4奇巧
我的应用程序很大程度上取决于用户当前位置,并且只要用户登录,就会在指定的时间间隔内定期接收位置更新,因此我不想使用该PRIORITY_HIGH_ACCURACY模式,以防止电池耗尽.
我的问题:
是融合位置提供商,如果它设置为接收更新PRIORITY_BALANCED_POWER_ACCURACY并且没有任何WI-FI或手机信息塔信息,则假设完全使用GPS ?
如果确实如此,那么我做错了什么?
为什么我得到这个误导性的位置更新不正确?(正如我在"更大问题"一节中所解释的那样..
为什么GPS无线电一直打开而不是在我使用PRIORITY_HIGH_ACCURACY参数时打开10分钟?(我没有其他安装的应用程序可以更快地触发位置更新..)
gps android android-location google-play-services location-services
我使用下面的代码找到当前的位置,但我得到了一些设备(三星7'和10'英寸和nexus 10'英寸)确切的当前位置,但不幸的是我找不到三星s3的位置.
我没有任何想法,什么是问题.没有找到位置.
这是我的代码:
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;
double latitude;
double longitude;
//The minimum distance to change updates in metters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 metters
//The minimum time beetwen updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute …Run Code Online (Sandbox Code Playgroud) 我的挑战任务是获得非常高的准确性.所以我使用的是GPS_PROVIDER.但我的代码准确性不正确.有一段时间它显示我离我当前位置10到50米.有一段时间它显示我离我当前位置5到15米的距离.我已经测试了两个设备,如XOLO和索尼.我已经完成了这些问题并且无法修复它.这是我的代码: -
@Override
protected void onResume() {
super.onResume();
if(mMap!= null)
mMaprivate LatLng geo;
map.clear();
locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
mFragment = (SupportMapFragment) this.getSupportFragmentManager().findFragmentById(R.id.map);
mMap = mFragment.getMap();
}
setListener();
}
private void setListener() {
System.out.println("setListener() locationListener = "+locationListener);
if(locationListener != null){
clearListener();
}
Toast toast = Toast.makeText(this, this.getResources().getString(R.string.maps_loading), Toast.LENGTH_LONG);
toast.show();
private LatLng geo;
locationListener = new CustomLocationListener();
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
//criteria.setAccuracy(Criteria.ACCURACY_HIGH);
criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
String bestProvider = locationManager.getBestProvider(criteria, true);
Toast.makeText(this, "bestProvider= "+bestProvider, Toast.LENGTH_SHORT).show();
// …Run Code Online (Sandbox Code Playgroud)