我写过一个使用GPS的地图应用程序。在我的手机上测试这个(运行Gingerbread的Galaxy S2)我可以看到根据 minTime 和 minDistance 参数中设置的值没有改变行为 - GPS,如图所示无论minTime设置如何,系统图标都会在修复后保持不变。
从SDK文档中了解到,这些只是“提示”,我通过将GPS控制权委托给IBinder服务编写了我自己的电池保护制度,IBinder活动可以绑定并通过BroadcastReceiver接收位置更新。 “设置”菜单选项活动设置参数('GPS睡眠时间'和'所需精度',一旦满足准确度标准,将关闭服务中的GPS睡眠时间。为了完整性,我还传递了minTime和minDistance参数根据我的经验证据,我认为这是多余的。我尽力在应用程序的帮助页面中解释这些设置的效果:
现在我的手机刚刚升级到ICS,我执行发现minTime确实会影响GPS的状态(至少反映在状态栏上的卫星图标上)。实际上它在修复后几乎完全消失了。
我现在陷入困境,对于任何特定设备/操作系统版本组合的期望以及如何调整我的应用程序来应对。为了尝试解决它,我会问两个具体的问题:
在从Gingerbread更改为ICS时,是否有任何开发人员在设备中观察到此类行为的变化?
是否记录了此类更改?
所有基于事实的答案都将受到赞赏。
4月3日更新 - 我可以制作的最小代码示例来演示下面附加设备的行为
public class GPSParamTestActivity extends Activity implements LocationListener,
GpsStatus.Listener {
private LocationManager mLocMgr;
private long mUpdatePeriod = 10000; // 10 seconds
private TextView mLocTV, mStatTV, mGPSStatTV; // 3 TextViews for o/p
private boolean mStatColourToggle, mLocnColourToggle, mGPSStatColourToggle;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Layout at http://dl.dropbox.com/u/67134160/main.xml if needed
}
@Override
protected void onResume() {
super.onResume();
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mLocTV = (TextView) findViewById(R.id.locnTV);
mStatTV = (TextView) findViewById(R.id.statusTV);
mGPSStatTV = (TextView) findViewById(R.id.gpsStatusTV);
mLocMgr = (LocationManager) getSystemService(LOCATION_SERVICE);
}
@Override
protected void onPause() {
mLocMgr.removeGpsStatusListener(this);
mLocMgr.removeUpdates(this); // Don't leave GPS on
super.onPause();
}
@Override
public void onGpsStatusChanged(int event) {// GpsStatus.Listener fires this one
mGPSStatTV.setTextColor(mGPSStatColourToggle ? Color.RED : Color.BLUE);
mGPSStatColourToggle = !mGPSStatColourToggle;
String str = "";
switch (event) {
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
str = "GPS_EVENT_SATELLITE_STATUS";
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
str = "GPS_EVENT_FIRST_FIX";
break;
case GpsStatus.GPS_EVENT_STARTED:
str = "GPS_EVENT_STARTED";
break;
case GpsStatus.GPS_EVENT_STOPPED:
str = "GPS_EVENT_STOPPED";
break;
}
mGPSStatTV.setText(str);
}
@Override
public void onLocationChanged(Location loc) {
mLocTV.setTextColor(mLocnColourToggle ? Color.RED : Color.BLUE);
mLocnColourToggle = !mLocnColourToggle;
String str = null;
NumberFormat formatter = new DecimalFormat("##0.000000");
String fLat = formatter.format(loc.getLatitude());
String fLon = formatter.format(loc.getLongitude());
str = "Lat/Lon " + fLat + "/" + fLon;
mLocTV.setText(str);
}
@Override public void onProviderDisabled(String provider) {}
@Override public void onProviderEnabled(String provider) {}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// This is never triggered on a Galaxy S2, G'bread or ICS
mStatTV.setTextColor(mStatColourToggle ? Color.RED : Color.BLUE);
mStatColourToggle = !mStatColourToggle;
String str = "Status chg " + provider;
switch (status) {
case android.location.LocationProvider.OUT_OF_SERVICE:
str += " OUT OF SERVICE";
break;
case android.location.LocationProvider.AVAILABLE:
str += " AVAILABLE";
break;
case android.location.LocationProvider.TEMPORARILY_UNAVAILABLE:
str += " TEMPORARILY UNAVAILABLE";
break;
default:
str += " UNKNOWN STATUS";
}
mStatTV.setText(str);
}
public void myClickHandler(View target) {
mLocMgr.removeGpsStatusListener(this); // stop all listeners
mLocMgr.removeUpdates(this); // by default
// 3 buttons for app control, set the listeners to here in the XML
switch (target.getId()) {
case R.id.stopGPSButton:
break; // already done by default
case R.id.tenSecStartButton:
mLocMgr.addGpsStatusListener(this);
mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
mUpdatePeriod, 0, (LocationListener) this);
break;
case R.id.zeroSecStartButton:
mLocMgr.addGpsStatusListener(this);
mLocMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, (LocationListener) this);
break;
}
}
}
答案 0 :(得分:4)
虽然这不是一个真正的答案this帖子可能很有趣:
我相信我已经将问题缩小到了错误的能力 从本机代码报告到Android中的GpsLocationProvider 平台。在同一台Nexus S 4G上的定制AOSP中,我进行了硬编码 GpsLocationProvider中的值以指示本机代码 无法处理GPS调度。 Voila,平台接管了 并正确遵循minTime参数(在这种情况下为60秒) 并以60秒的间隔向应用程序提供位置更新。 因此,在我看来,本机代码告诉平台“我可以 处理GPS调度“,但它没有,导致1Hz更新 无论应用程序请求的minTime间隔如何。